From 2cc22ceea099f3785d2f70e12b184d09142b3891 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Wed, 12 Mar 2025 16:11:38 +0100 Subject: [PATCH 01/37] update mg5amcnlo --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index a7f4f9e10c..c845d09889 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit a7f4f9e10c7b632f872409b323f990bb46c46b00 +Subproject commit c845d0988989a85ae0e2e361709f7e5a56fb0467 From d7c4c964b6836de801bd4695fa7d531d60992b78 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 31 Mar 2025 15:30:07 +0200 Subject: [PATCH 02/37] change the number of numerators to MAXAMPS (number of diagrams --- .../madgraph/iolibs/template_files/gpu/MemoryBuffers.h | 5 +++-- .../CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h index deddc425f5..d29aad7853 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h @@ -273,8 +273,9 @@ namespace mg5amcCpu // A base class encapsulating a memory buffer for numerators (of the multichannel single-diagram enhancement factors) typedef BufferBase BufferNumerators; - // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // The size (number of elements) per event in a memory buffer for numerators + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = %(ndiagrams)d; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py index 554c97974b..1d6af6a7e7 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py @@ -1610,6 +1610,7 @@ def edit_memorybuffers(self): template = open(pjoin(self.template_path,'gpu','MemoryBuffers.h'),'r').read() replace_dict = {} replace_dict['model_name'] = self.model_name + replace_dict['ndiagrams'] = len(self.matrix_elements[0].get('diagrams')) # AV FIXME #910: elsewhere matrix_element.get('diagrams') and max(config[0]... ff = open(pjoin(self.path, '..', 'MemoryBuffers.h'),'w') ff.write(template % replace_dict) ff.close() From 9cd9c4d1db6c05ab577e793f19cc68267708e2cc Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 31 Mar 2025 16:12:32 +0200 Subject: [PATCH 03/37] add kernel access returning pointer instead of array --- .../madgraph/iolibs/template_files/gpu/MemoryAccessGs.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h index 63c17a68fa..e2268b36cc 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP ( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = From c2ba0f9490103deac924b6537e599475555bf1b2 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Wed, 2 Apr 2025 09:47:32 +0200 Subject: [PATCH 04/37] change CPPProcess.cc --- .../gpu/process_function_definitions.inc | 66 +++++++++++++++++-- .../gpu/process_sigmaKin_function.inc | 55 +++------------- .../CUDACPP_SA_OUTPUT/model_handling.py | 5 +- 3 files changed, 73 insertions(+), 53 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc index 47322262e4..d3bb07062d 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc @@ -16,6 +16,68 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { + +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + inline unsigned int getChannelId(const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , const int ievt00 + , bool sanityCheckMixedPrecision = true +#endif + ) { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { + #if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } + #endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -476,9 +538,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) %% mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) %% mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -486,7 +545,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc index d49047a623..09098f19ec 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc @@ -28,9 +28,10 @@ #ifdef MGONGPU_SUPPORTS_MULTICHANNEL fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for (int i = 0; i < 3; ++i) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -43,17 +44,7 @@ // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId(allChannelIds); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -168,38 +159,7 @@ const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId(allChannelIds, ievt00); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -372,11 +332,12 @@ #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { + const unsigned int channelId = getChannelId(allChannelIds, ievt0, false); fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py index 1d6af6a7e7..014eb66522 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py @@ -1927,7 +1927,7 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif""") diagrams = matrix_element.get('diagrams') @@ -1959,7 +1959,8 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi ###res.append("if( channelId == %i ) numerators_sv += cxabs2( amp_sv[0] );" % diag_to_config[id_amp]) # BUG #472 ###res.append("if( channelId == %i ) numerators_sv += cxabs2( amp_sv[0] );" % id_amp) # wrong fix for BUG #472 res.append("#ifdef MGONGPU_SUPPORTS_MULTICHANNEL") - res.append("if( channelId == %i ) numerators_sv += cxabs2( amp_sv[0] );" % diagram.get('number')) + diagnum = diagram.get('number') + res.append("if( channelId == %i ) numerators_sv[%i] += cxabs2( amp_sv[0] );" % (diagnum, diagnum-1)) res.append("if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] );") res.append("#endif") else: From 8d1edeccc2bfdc888ebed4b8bda9dfbd2acff118 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Wed, 2 Apr 2025 13:26:59 +0200 Subject: [PATCH 05/37] forgot a hardcoded 3 in the code, replace by ndiagrams --- .../iolibs/template_files/gpu/process_sigmaKin_function.inc | 2 +- .../cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc index 09098f19ec..4e02a65d49 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc @@ -30,7 +30,7 @@ fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - for (int i = 0; i < 3; ++i) + for (int i = 0; i < %(ndiagrams)d; ++i) numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py index 014eb66522..756f42093f 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py @@ -1272,6 +1272,7 @@ def get_sigmaKin_lines(self, color_amplitudes, write=True): den_factors = [str(me.get_denominator_factor()) for me in \ self.matrix_elements] replace_dict['den_factors'] = ",".join(den_factors) + replace_dict['ndiagrams'] = len(self.matrix_elements[0].get('diagrams')) # AV FIXME #910: elsewhere matrix_element.get('diagrams') and max(config[0]... if write: file = self.read_template_file(self.process_sigmaKin_function_template) % replace_dict From b3a47102946499a52db723ee36a9a2fa9130880f Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Thu, 3 Apr 2025 14:27:06 +0200 Subject: [PATCH 06/37] trigger CI From d8e162499567c7ca4f5e204d346cbb7014908b36 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Thu, 3 Apr 2025 14:32:48 +0200 Subject: [PATCH 07/37] trigger CI 2 From 9753e6b6717f67e7948477286b2fdb9a1fc8c6db Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Thu, 3 Apr 2025 15:34:59 +0200 Subject: [PATCH 08/37] code formatting --- .../iolibs/template_files/gpu/MemoryAccessGs.h | 2 +- .../iolibs/template_files/gpu/MemoryBuffers.h | 4 ++-- .../gpu/process_function_definitions.inc | 17 +++++++++-------- .../gpu/process_sigmaKin_function.inc | 8 ++++---- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h index e2268b36cc..50a6aaef4d 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryAccessGs.h @@ -131,7 +131,7 @@ namespace mg5amcCpu // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] static __host__ __device__ inline fptype_sv* - kernelAccessP ( fptype* buffer ) + kernelAccessP( fptype* buffer ) { return reinterpret_cast( buffer ); } diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h index d29aad7853..6b18ee5785 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h @@ -273,9 +273,9 @@ namespace mg5amcCpu // A base class encapsulating a memory buffer for numerators (of the multichannel single-diagram enhancement factors) typedef BufferBase BufferNumerators; - // The size (number of elements) per event in a memory buffer for numerators + // The size (number of elements) per event in a memory buffer for numerators // (should be equal to the number of diagrams in the process) - constexpr size_t sizePerEventNumerators = %(ndiagrams)d; + constexpr size_t sizePerEventNumerators = %(ndiagrams)d; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc index d3bb07062d..5c857c94ae 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc @@ -16,14 +16,15 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { - #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - inline unsigned int getChannelId(const unsigned int* allChannelIds + inline unsigned int getChannelId( const unsigned int* allChannelIds #ifndef MGONGPUCPP_GPUIMPL - , const int ievt00 - , bool sanityCheckMixedPrecision = true + , + const int ievt00, + bool sanityCheckMixedPrecision = true #endif - ) { + ) + { unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr #ifdef MGONGPUCPP_GPUIMPL using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events @@ -38,7 +39,7 @@ namespace mg5amcCpu assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) } #else // Cuda or C++ - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 @@ -61,7 +62,7 @@ namespace mg5amcCpu assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) if( sanityCheckMixedPrecision ) { - #if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) @@ -70,7 +71,7 @@ namespace mg5amcCpu { assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector } - #endif +#endif } } #endif // MGONGPUCPP_GPUIMPL diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc index 4e02a65d49..ad29ce57dc 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc @@ -30,7 +30,7 @@ fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - for (int i = 0; i < %(ndiagrams)d; ++i) + for( int i = 0; i < %(ndiagrams)d; ++i ) numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif @@ -44,7 +44,7 @@ // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - unsigned int channelId = getChannelId(allChannelIds); + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -159,7 +159,7 @@ const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - unsigned int channelId = getChannelId(allChannelIds, ievt00); + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -332,7 +332,7 @@ #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - const unsigned int channelId = getChannelId(allChannelIds, ievt0, false); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); From f14d0d55bfb4c66404e52594a047962219edb550 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Thu, 3 Apr 2025 17:38:33 +0200 Subject: [PATCH 09/37] fix getChannelId for cuda --- .../iolibs/template_files/gpu/process_function_definitions.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc index 5c857c94ae..7e9c28fba8 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc @@ -17,7 +17,7 @@ namespace mg5amcCpu #endif { #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - inline unsigned int getChannelId( const unsigned int* allChannelIds + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds #ifndef MGONGPUCPP_GPUIMPL , const int ievt00, From ebc6bdbc7d167109e771dee2bb18baeb0f40080c Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Thu, 3 Apr 2025 18:14:48 +0200 Subject: [PATCH 10/37] fix indentation --- .../template_files/gpu/process_function_definitions.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc index 7e9c28fba8..95630f4214 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc @@ -19,9 +19,9 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds #ifndef MGONGPUCPP_GPUIMPL - , - const int ievt00, - bool sanityCheckMixedPrecision = true + , + const int ievt00, + bool sanityCheckMixedPrecision = true #endif ) { From ab338f712b3795f588eb71ac6ef979599e0b595f Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Fri, 4 Apr 2025 13:06:42 +0200 Subject: [PATCH 11/37] C++ starts counting at 0 ;-) --- .../iolibs/template_files/gpu/process_sigmaKin_function.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc index ad29ce57dc..5dc3f89d76 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc @@ -337,7 +337,7 @@ fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv[channelId] / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) From a041e62594140abc6b9ea79910860e8f29a2608c Mon Sep 17 00:00:00 2001 From: Zenny Wettersten Date: Tue, 11 Mar 2025 14:51:26 +0100 Subject: [PATCH 12/37] added some verbose/debug flags, disabled FPE traps by default --- .../madgraph/iolibs/template_files/gpu/Bridge.h | 12 +++++++++++- .../madgraph/iolibs/template_files/gpu/GpuRuntime.h | 6 +++--- .../template_files/gpu/MatrixElementKernels.cc | 4 +++- .../iolibs/template_files/gpu/MatrixElementKernels.h | 2 +- .../gpu/process_function_definitions.inc | 4 +++- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/Bridge.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/Bridge.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/GpuRuntime.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/GpuRuntime.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.cc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.cc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h index 7acff4b308..48295f4f2f 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc index 95630f4214..ad839d49f4 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_function_definitions.inc @@ -4,7 +4,7 @@ ! Copyright (C) 2020-2024 CERN and UCLouvain. ! Licensed under the GNU Lesser General Public License (version 3 or later). ! Modified by: A. Valassi (Sep 2021) for the MG5aMC CUDACPP plugin. -! Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +! Further modified by: J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. !========================================================================== //========================================================================== // Class member functions for calculating the matrix elements for @@ -180,7 +180,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- From f2eff61d4ced49f59a5cfb279262f7a2cefe3e53 Mon Sep 17 00:00:00 2001 From: Zenny Wettersten Date: Tue, 11 Mar 2025 14:53:01 +0100 Subject: [PATCH 13/37] added mod tag and date --- .../madgraph/iolibs/template_files/gpu/MatrixElementKernels.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h index 48295f4f2f..8da04d7945 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 From 21b75f570f252cf975b3956bdd2c87b83c56f48a Mon Sep 17 00:00:00 2001 From: Zenny Wettersten Date: Thu, 3 Apr 2025 14:39:02 +0200 Subject: [PATCH 14/37] lorem ipsum From 8fb363a3652fbc508d0063ed52c8e7db97ee5a49 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Fri, 4 Apr 2025 15:42:15 +0200 Subject: [PATCH 15/37] move submodule to 3.6.2 --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index c845d09889..f0bca4cc38 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit c845d0988989a85ae0e2e361709f7e5a56fb0467 +Subproject commit f0bca4cc38003a569fda56c837ebc0ff86af35bd From fb557d043239dcabf838ff3a8ae2c1e56f444f2f Mon Sep 17 00:00:00 2001 From: Zenny Wettersten Date: Thu, 24 Apr 2025 14:52:59 +0200 Subject: [PATCH 16/37] fixed bug where precision wasn't passed properly from the run_card --- .../cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/launch_plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/launch_plugin.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/launch_plugin.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') From dec050d2521a574d653388b531071f67875718aa Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Thu, 3 Apr 2025 14:27:06 +0200 Subject: [PATCH 17/37] trigger CI From 90973b4997ba7c47480751bb590d5a746655ab68 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Thu, 3 Apr 2025 14:32:48 +0200 Subject: [PATCH 18/37] trigger CI 2 From 34ec9643bf4968785d9d347b88cc35d451524e2f Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 28 Apr 2025 20:11:33 +0200 Subject: [PATCH 19/37] buffer for numerators cannot be aligned, it depends on the number of diagrams which not necessarily align well --- .../madgraph/iolibs/template_files/gpu/MemoryBuffers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h index 6b18ee5785..77834d56f8 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h @@ -279,7 +279,7 @@ namespace mg5amcCpu #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs - typedef HostBuffer HostBufferNumerators; + typedef HostBuffer HostBufferNumerators; #else // A class encapsulating a CUDA pinned host buffer for gs typedef PinnedHostBuffer PinnedHostBufferNumerators; From 62c204a4b58fb3d98f67e6ac161bfaf5b01927a5 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 28 Apr 2025 21:22:40 +0200 Subject: [PATCH 20/37] Revert "buffer for numerators cannot be aligned, it depends on the number of" This reverts commit 34ec9643bf4968785d9d347b88cc35d451524e2f. --- .../madgraph/iolibs/template_files/gpu/MemoryBuffers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h index 77834d56f8..6b18ee5785 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h @@ -279,7 +279,7 @@ namespace mg5amcCpu #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs - typedef HostBuffer HostBufferNumerators; + typedef HostBuffer HostBufferNumerators; #else // A class encapsulating a CUDA pinned host buffer for gs typedef PinnedHostBuffer PinnedHostBufferNumerators; From b39e5081d9daf725cb01f3b0998646233477fd1a Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Wed, 30 Apr 2025 17:36:32 +0200 Subject: [PATCH 21/37] for the CPU version correct the index access, GPU version still needs to be done --- .../iolibs/template_files/gpu/process_sigmaKin_function.inc | 4 ++-- .../CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc index 5dc3f89d76..13f510d046 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc @@ -26,7 +26,7 @@ fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * %(ndiagrams)d ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); @@ -333,7 +333,7 @@ if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * %(ndiagrams)d ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py index 756f42093f..eb975f5b32 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py @@ -1882,6 +1882,7 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi ###misc.sprint(multi_channel_map) res = [] ###res.append('for(int i=0;i<%s;i++){jamp[i] = cxtype(0.,0.);}' % len(color_amplitudes)) + ndiagrams = len(me) res.append("""//constexpr size_t nxcoup = ndcoup + nicoup; // both dependent and independent couplings (BUG #823) constexpr size_t nxcoup = ndcoup + nIPC; // both dependent and independent couplings (FIX #823) const fptype* allCOUPs[nxcoup]; @@ -1918,7 +1919,7 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * %d ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -1930,7 +1931,7 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); -#endif""") +#endif""" % ndiagrams) diagrams = matrix_element.get('diagrams') diag_to_config = {} if multi_channel_map: From 07017429b5fe8ae0b875caaa56e1a92bbc187a95 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 15:50:45 +0200 Subject: [PATCH 22/37] change to processConfig for diagram numbers --- .../PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py index eb975f5b32..541256bf3b 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py @@ -1272,7 +1272,6 @@ def get_sigmaKin_lines(self, color_amplitudes, write=True): den_factors = [str(me.get_denominator_factor()) for me in \ self.matrix_elements] replace_dict['den_factors'] = ",".join(den_factors) - replace_dict['ndiagrams'] = len(self.matrix_elements[0].get('diagrams')) # AV FIXME #910: elsewhere matrix_element.get('diagrams') and max(config[0]... if write: file = self.read_template_file(self.process_sigmaKin_function_template) % replace_dict @@ -1440,6 +1439,7 @@ def generate_process_files(self): self.edit_check_sa() self.edit_mgonGPU() self.edit_processidfile() # AV new file (NB this is Sigma-specific, should not be a symlink to Subprocesses) + self.edit_processConfig() # sub process specific, not to be symlinked from the Subprocesses directory self.edit_testxxx() # AV new file (NB this is generic in Subprocesses and then linked in Sigma-specific) self.edit_memorybuffers() # AV new file (NB this is generic in Subprocesses and then linked in Sigma-specific) @@ -1519,6 +1519,16 @@ def edit_processidfile(self): ff.write(template % replace_dict) ff.close() + def edit_processConfig(self): + """Generate process_config.h""" + ###misc.sprint('Entering PLUGIN_OneProcessExporter.edit_processConfig') + template = open(pjoin(self.template_path,'gpu','processConfig.h'),'r').read() + replace_dict = {} + replace_dict['ndiagrams'] = len(self.matrix_elements[0].get('diagrams')) + replace_dict['processid_uppercase'] = self.get_process_name().upper() + ff = open(pjoin(self.path, 'processConfig.h'),'w') + ff.write(template % replace_dict) + ff.close() def generate_subprocess_directory_end(self, **opt): """ opt contain all local variable of the fortran original function""" @@ -1611,7 +1621,6 @@ def edit_memorybuffers(self): template = open(pjoin(self.template_path,'gpu','MemoryBuffers.h'),'r').read() replace_dict = {} replace_dict['model_name'] = self.model_name - replace_dict['ndiagrams'] = len(self.matrix_elements[0].get('diagrams')) # AV FIXME #910: elsewhere matrix_element.get('diagrams') and max(config[0]... ff = open(pjoin(self.path, '..', 'MemoryBuffers.h'),'w') ff.write(template % replace_dict) ff.close() @@ -1882,7 +1891,6 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi ###misc.sprint(multi_channel_map) res = [] ###res.append('for(int i=0;i<%s;i++){jamp[i] = cxtype(0.,0.);}' % len(color_amplitudes)) - ndiagrams = len(me) res.append("""//constexpr size_t nxcoup = ndcoup + nicoup; // both dependent and independent couplings (BUG #823) constexpr size_t nxcoup = ndcoup + nIPC; // both dependent and independent couplings (FIX #823) const fptype* allCOUPs[nxcoup]; @@ -1919,7 +1927,7 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * %d ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -1931,7 +1939,7 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); -#endif""" % ndiagrams) +#endif""") diagrams = matrix_element.get('diagrams') diag_to_config = {} if multi_channel_map: From 557b125255d90236f338aa1837808e233a2cd868 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 15:51:08 +0200 Subject: [PATCH 23/37] change to processConfig for diagram numbers --- .../iolibs/template_files/gpu/processConfig.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/processConfig.h diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/processConfig.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/processConfig.h new file mode 100644 index 0000000000..a4777347d0 --- /dev/null +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_%(processid_uppercase)s_H +#define MG5_CONFIG_%(processid_uppercase)s_H 1 + +namespace processConfig { + + constexpr int ndiagrams = %(ndiagrams)d; + +} + +#endif // MG5_CONFIG_%(processid_uppercase)s_H \ No newline at end of file From 5e1b675a6499fe78790c7bacc597b7f751d59515 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 15:52:06 +0200 Subject: [PATCH 24/37] change to processConfig for diagram numbers --- .../madgraph/iolibs/template_files/gpu/MemoryBuffers.h | 3 ++- .../madgraph/iolibs/template_files/gpu/process_cc.inc | 1 + .../iolibs/template_files/gpu/process_sigmaKin_function.inc | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h index 6b18ee5785..76df3fab16 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h @@ -10,6 +10,7 @@ #include "mgOnGpuCxtypes.h" +#include "processConfig.h" #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_%(model_name)s.h" @@ -275,7 +276,7 @@ namespace mg5amcCpu // The size (number of elements) per event in a memory buffer for numerators // (should be equal to the number of diagrams in the process) - constexpr size_t sizePerEventNumerators = %(ndiagrams)d; + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc index 444c848e10..333f744405 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "mgOnGpuConfig.h" +#include "processConfig.h" %(hel_amps_h)s #include "MemoryAccessAmplitudes.h" diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc index 13f510d046..616a88403e 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_sigmaKin_function.inc @@ -26,11 +26,11 @@ fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * %(ndiagrams)d ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - for( int i = 0; i < %(ndiagrams)d; ++i ) + for( int i = 0; i < processConfig::ndiagrams; ++i ) numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif @@ -333,7 +333,7 @@ if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * %(ndiagrams)d ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); From 13fcd5e8cbb6c81b5ec21235445811b5521d8791 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 16:02:32 +0200 Subject: [PATCH 25/37] fix formatting --- .../madgraph/iolibs/template_files/gpu/MemoryBuffers.h | 2 +- .../madgraph/iolibs/template_files/gpu/process_cc.inc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h index 76df3fab16..3d9ff21943 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/MemoryBuffers.h @@ -10,10 +10,10 @@ #include "mgOnGpuCxtypes.h" -#include "processConfig.h" #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_%(model_name)s.h" +#include "processConfig.h" #include diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc index 333f744405..3bdc467fd6 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/madgraph/iolibs/template_files/gpu/process_cc.inc @@ -13,7 +13,6 @@ #include "CPPProcess.h" #include "mgOnGpuConfig.h" -#include "processConfig.h" %(hel_amps_h)s #include "MemoryAccessAmplitudes.h" @@ -24,6 +23,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" From 8e288712661ce811e43fef97ca15f0ed216b35d4 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 16:05:06 +0200 Subject: [PATCH 26/37] move submodule --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index f0bca4cc38..c845d09889 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit f0bca4cc38003a569fda56c837ebc0ff86af35bd +Subproject commit c845d0988989a85ae0e2e361709f7e5a56fb0467 From e61241fb7f7f7b1778a2ec68ef3103e8b8eb4221 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 16:22:44 +0200 Subject: [PATCH 27/37] move submodule --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index c845d09889..f0bca4cc38 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit c845d0988989a85ae0e2e361709f7e5a56fb0467 +Subproject commit f0bca4cc38003a569fda56c837ebc0ff86af35bd From 778f242b40a273d44019f9b42e000c2ab1b1ee22 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 16:59:09 +0200 Subject: [PATCH 28/37] move submodule --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index f0bca4cc38..f9d599df80 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit f0bca4cc38003a569fda56c837ebc0ff86af35bd +Subproject commit f9d599df8067f82597fde1bf7462aa8c19334d39 From ddb25e8bd8c5a9d82b424072588a671445a4400c Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 17:01:29 +0200 Subject: [PATCH 29/37] move to 3.6.3 --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index f9d599df80..fe0bb0b36c 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit f9d599df8067f82597fde1bf7462aa8c19334d39 +Subproject commit fe0bb0b36c3c195bfefc66016a78339ca7a11bd5 From f731bf2294f8f55203d7b83e43eb8b6b6729dbb9 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 17:02:18 +0200 Subject: [PATCH 30/37] move to 3.6.2 --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index fe0bb0b36c..f0bca4cc38 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit fe0bb0b36c3c195bfefc66016a78339ca7a11bd5 +Subproject commit f0bca4cc38003a569fda56c837ebc0ff86af35bd From 70cfe633ea9c458d4302b18242d99bd9e216caba Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 17:10:42 +0200 Subject: [PATCH 31/37] move to 3.6.3 --- MG5aMC/mg5amcnlo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MG5aMC/mg5amcnlo b/MG5aMC/mg5amcnlo index f0bca4cc38..fe0bb0b36c 160000 --- a/MG5aMC/mg5amcnlo +++ b/MG5aMC/mg5amcnlo @@ -1 +1 @@ -Subproject commit f0bca4cc38003a569fda56c837ebc0ff86af35bd +Subproject commit fe0bb0b36c3c195bfefc66016a78339ca7a11bd5 From 2cc58f514d1226155099c15767dfcd0a0812561e Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 17:33:02 +0200 Subject: [PATCH 32/37] trigger CI From 3a44412f7bbc08c10112977dd9e4e93d18b12ce8 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Mon, 12 May 2025 18:21:54 +0200 Subject: [PATCH 33/37] trigger CI From 0c786491d3f2fb6d930df12f7f90e2e1c16efe73 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Tue, 3 Jun 2025 15:23:29 +0200 Subject: [PATCH 34/37] collect all channelids --- .../CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py index 541256bf3b..7d6f517dd2 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py @@ -1970,8 +1970,10 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi ###res.append("if( channelId == %i ) numerators_sv += cxabs2( amp_sv[0] );" % id_amp) # wrong fix for BUG #472 res.append("#ifdef MGONGPU_SUPPORTS_MULTICHANNEL") diagnum = diagram.get('number') - res.append("if( channelId == %i ) numerators_sv[%i] += cxabs2( amp_sv[0] );" % (diagnum, diagnum-1)) - res.append("if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] );") + res.append("if( channelId != 0 ) {") + res.append(" numerators_sv[%i] += cxabs2( amp_sv[0] );" % (diagnum-1)) + res.append(" denominators_sv += cxabs2( amp_sv[0] );") + res.append("}") res.append("#endif") else: res.append("#ifdef MGONGPU_SUPPORTS_MULTICHANNEL") From ec116a9702e9aec5b5818aca69901679a269fd12 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Tue, 3 Jun 2025 15:36:19 +0200 Subject: [PATCH 35/37] fix formatting --- .../cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py index 7d6f517dd2..6fd4603c70 100644 --- a/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py +++ b/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/model_handling.py @@ -1970,7 +1970,8 @@ def super_get_matrix_element_calls(self, matrix_element, color_amplitudes, multi ###res.append("if( channelId == %i ) numerators_sv += cxabs2( amp_sv[0] );" % id_amp) # wrong fix for BUG #472 res.append("#ifdef MGONGPU_SUPPORTS_MULTICHANNEL") diagnum = diagram.get('number') - res.append("if( channelId != 0 ) {") + res.append("if( channelId != 0 )") + res.append("{") res.append(" numerators_sv[%i] += cxabs2( amp_sv[0] );" % (diagnum-1)) res.append(" denominators_sv += cxabs2( amp_sv[0] );") res.append("}") From 47b0e7cb5afc35cc6e9a5d8b5aa411294631bf68 Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Fri, 21 Nov 2025 19:53:13 +0100 Subject: [PATCH 36/37] regenerate all processes --- .../ee_mumu.mad/CODEGEN_mad_ee_mumu_log.txt | 88 +- .../ee_mumu.mad/Cards/me5_configuration.txt | 4 +- .../ee_mumu.mad/Cards/proc_card_mg5.dat | 2 +- epochX/cudacpp/ee_mumu.mad/Cards/run_card.dat | 1 + .../ee_mumu.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/ee_mumu.mad/MGMEVersion.txt | 2 +- .../ee_mumu.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/ee_mumu.mad/Source/cuts.inc | 4 +- epochX/cudacpp/ee_mumu.mad/Source/make_opts | 2 +- epochX/cudacpp/ee_mumu.mad/Source/makefile | 1 + .../cudacpp/ee_mumu.mad/Source/run_card.inc | 2 + .../cudacpp/ee_mumu.mad/SubProcesses/Bridge.h | 12 +- .../ee_mumu.mad/SubProcesses/GpuRuntime.h | 6 +- .../ee_mumu.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../ee_mumu.mad/SubProcesses/MemoryAccessGs.h | 8 + .../ee_mumu.mad/SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_epem_mupmum/CPPProcess.cc | 149 +- .../SubProcesses/P1_epem_mupmum/CPPProcess.h | 2 +- .../SubProcesses/P1_epem_mupmum/auto_dsig.f | 2 +- .../SubProcesses/P1_epem_mupmum/auto_dsig1.f | 16 +- .../SubProcesses/P1_epem_mupmum/matrix1.f | 17 +- .../cudacpp/ee_mumu.mad/SubProcesses/cuts.f | 18 +- .../cudacpp/ee_mumu.mad/SubProcesses/genps.f | 25 +- .../cudacpp/ee_mumu.mad/SubProcesses/myamp.f | 11 +- .../ee_mumu.mad/bin/internal/Gridpack/gridrun | 2 +- .../ee_mumu.mad/bin/internal/Gridpack/run.sh | 61 +- .../ee_mumu.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../ee_mumu.mad/bin/internal/extended_cmd.py | 7 +- .../ee_mumu.mad/bin/internal/file_writers.py | 6 +- .../cudacpp/ee_mumu.mad/bin/internal/files.py | 13 +- .../ee_mumu.mad/bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../ee_mumu.mad/bin/internal/gen_jpeg-pl | 39 +- .../ee_mumu.mad/bin/internal/gen_ximprove.py | 92 +- .../ee_mumu.mad/bin/internal/hel_recycle.py | 2 +- .../ee_mumu.mad/bin/internal/histograms.py | 25 +- .../ee_mumu.mad/bin/internal/launch_plugin.py | 4 +- .../ee_mumu.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../ee_mumu.mad/bin/internal/restore_data | 11 +- .../ee_mumu.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/ee_mumu.mad/bin/madevent | 11 + epochX/cudacpp/ee_mumu.mad/src/HelAmps_sm.h | 2 +- .../cudacpp/ee_mumu.mad/src/Parameters_sm.cc | 2 +- .../cudacpp/ee_mumu.mad/src/Parameters_sm.h | 2 +- .../CODEGEN_cudacpp_ee_mumu_log.txt | 53 +- .../cudacpp/ee_mumu.sa/SubProcesses/Bridge.h | 12 +- .../ee_mumu.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../ee_mumu.sa/SubProcesses/MemoryAccessGs.h | 8 + .../ee_mumu.sa/SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_sm_epem_mupmum/CPPProcess.cc | 135 +- .../P1_Sigma_sm_epem_mupmum/CPPProcess.h | 2 +- epochX/cudacpp/ee_mumu.sa/src/HelAmps_sm.h | 2 +- .../cudacpp/ee_mumu.sa/src/Parameters_sm.cc | 2 +- epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.h | 2 +- .../gg_tt.mad/CODEGEN_mad_gg_tt_log.txt | 88 +- .../gg_tt.mad/Cards/me5_configuration.txt | 4 +- .../cudacpp/gg_tt.mad/Cards/proc_card_mg5.dat | 2 +- epochX/cudacpp/gg_tt.mad/Cards/run_card.dat | 1 + .../gg_tt.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/gg_tt.mad/MGMEVersion.txt | 2 +- .../gg_tt.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/gg_tt.mad/Source/cuts.inc | 4 +- epochX/cudacpp/gg_tt.mad/Source/make_opts | 2 +- epochX/cudacpp/gg_tt.mad/Source/makefile | 1 + epochX/cudacpp/gg_tt.mad/Source/run_card.inc | 2 + .../cudacpp/gg_tt.mad/SubProcesses/Bridge.h | 12 +- .../gg_tt.mad/SubProcesses/GpuRuntime.h | 6 +- .../gg_tt.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gg_tt.mad/SubProcesses/MemoryAccessGs.h | 8 + .../gg_tt.mad/SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_ttx/CPPProcess.cc | 156 +- .../SubProcesses/P1_gg_ttx/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttx/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttx/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttx/matrix1.f | 21 +- epochX/cudacpp/gg_tt.mad/SubProcesses/cuts.f | 18 +- epochX/cudacpp/gg_tt.mad/SubProcesses/genps.f | 25 +- epochX/cudacpp/gg_tt.mad/SubProcesses/myamp.f | 11 +- .../gg_tt.mad/bin/internal/Gridpack/gridrun | 2 +- .../gg_tt.mad/bin/internal/Gridpack/run.sh | 61 +- .../cudacpp/gg_tt.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../gg_tt.mad/bin/internal/extended_cmd.py | 7 +- .../gg_tt.mad/bin/internal/file_writers.py | 6 +- .../cudacpp/gg_tt.mad/bin/internal/files.py | 13 +- .../gg_tt.mad/bin/internal/gen_cardhtml-pl | 2 +- .../gg_tt.mad/bin/internal/gen_crossxhtml.py | 2 +- .../gg_tt.mad/bin/internal/gen_jpeg-pl | 39 +- .../gg_tt.mad/bin/internal/gen_ximprove.py | 92 +- .../gg_tt.mad/bin/internal/hel_recycle.py | 2 +- .../gg_tt.mad/bin/internal/histograms.py | 25 +- .../gg_tt.mad/bin/internal/launch_plugin.py | 4 +- .../gg_tt.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../gg_tt.mad/bin/internal/restore_data | 11 +- .../gg_tt.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/gg_tt.mad/bin/madevent | 11 + epochX/cudacpp/gg_tt.mad/src/HelAmps_sm.h | 2 +- epochX/cudacpp/gg_tt.mad/src/Parameters_sm.cc | 2 +- epochX/cudacpp/gg_tt.mad/src/Parameters_sm.h | 2 +- .../gg_tt.sa/CODEGEN_cudacpp_gg_tt_log.txt | 46 +- epochX/cudacpp/gg_tt.sa/SubProcesses/Bridge.h | 12 +- .../gg_tt.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gg_tt.sa/SubProcesses/MemoryAccessGs.h | 8 + .../gg_tt.sa/SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_sm_gg_ttx/CPPProcess.cc | 135 +- .../P1_Sigma_sm_gg_ttx/CPPProcess.h | 2 +- epochX/cudacpp/gg_tt.sa/src/HelAmps_sm.h | 2 +- epochX/cudacpp/gg_tt.sa/src/Parameters_sm.cc | 2 +- epochX/cudacpp/gg_tt.sa/src/Parameters_sm.h | 2 +- .../gg_tt01g.mad/CODEGEN_mad_gg_tt01g_log.txt | 94 +- .../gg_tt01g.mad/Cards/me5_configuration.txt | 4 +- .../gg_tt01g.mad/Cards/proc_card_mg5.dat | 2 +- .../cudacpp/gg_tt01g.mad/Cards/run_card.dat | 1 + .../gg_tt01g.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/gg_tt01g.mad/MGMEVersion.txt | 2 +- .../gg_tt01g.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/gg_tt01g.mad/Source/cuts.inc | 4 +- epochX/cudacpp/gg_tt01g.mad/Source/make_opts | 2 +- epochX/cudacpp/gg_tt01g.mad/Source/makefile | 1 + .../cudacpp/gg_tt01g.mad/Source/run_card.inc | 2 + .../gg_tt01g.mad/SubProcesses/Bridge.h | 12 +- .../gg_tt01g.mad/SubProcesses/GpuRuntime.h | 6 +- .../gg_tt01g.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../gg_tt01g.mad/SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_ttx/CPPProcess.cc | 156 +- .../SubProcesses/P1_gg_ttx/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttx/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttx/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttx/matrix1.f | 21 +- .../SubProcesses/P2_gg_ttxg/CPPProcess.cc | 240 +- .../SubProcesses/P2_gg_ttxg/CPPProcess.h | 2 +- .../SubProcesses/P2_gg_ttxg/auto_dsig.f | 2 +- .../SubProcesses/P2_gg_ttxg/auto_dsig1.f | 16 +- .../SubProcesses/P2_gg_ttxg/matrix1.f | 43 +- .../cudacpp/gg_tt01g.mad/SubProcesses/cuts.f | 18 +- .../cudacpp/gg_tt01g.mad/SubProcesses/genps.f | 25 +- .../cudacpp/gg_tt01g.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../gg_tt01g.mad/bin/internal/Gridpack/run.sh | 61 +- .../gg_tt01g.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../gg_tt01g.mad/bin/internal/extended_cmd.py | 7 +- .../gg_tt01g.mad/bin/internal/file_writers.py | 6 +- .../gg_tt01g.mad/bin/internal/files.py | 13 +- .../gg_tt01g.mad/bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../gg_tt01g.mad/bin/internal/gen_jpeg-pl | 39 +- .../gg_tt01g.mad/bin/internal/gen_ximprove.py | 92 +- .../gg_tt01g.mad/bin/internal/hel_recycle.py | 2 +- .../gg_tt01g.mad/bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../gg_tt01g.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../gg_tt01g.mad/bin/internal/restore_data | 11 +- .../gg_tt01g.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/gg_tt01g.mad/bin/madevent | 11 + epochX/cudacpp/gg_tt01g.mad/src/HelAmps_sm.h | 2 +- .../cudacpp/gg_tt01g.mad/src/Parameters_sm.cc | 2 +- .../cudacpp/gg_tt01g.mad/src/Parameters_sm.h | 2 +- .../gg_ttg.mad/CODEGEN_mad_gg_ttg_log.txt | 88 +- .../gg_ttg.mad/Cards/me5_configuration.txt | 4 +- .../gg_ttg.mad/Cards/proc_card_mg5.dat | 2 +- epochX/cudacpp/gg_ttg.mad/Cards/run_card.dat | 1 + .../gg_ttg.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/gg_ttg.mad/MGMEVersion.txt | 2 +- .../gg_ttg.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/gg_ttg.mad/Source/cuts.inc | 4 +- epochX/cudacpp/gg_ttg.mad/Source/make_opts | 2 +- epochX/cudacpp/gg_ttg.mad/Source/makefile | 1 + epochX/cudacpp/gg_ttg.mad/Source/run_card.inc | 2 + .../cudacpp/gg_ttg.mad/SubProcesses/Bridge.h | 12 +- .../gg_ttg.mad/SubProcesses/GpuRuntime.h | 6 +- .../gg_ttg.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gg_ttg.mad/SubProcesses/MemoryAccessGs.h | 8 + .../gg_ttg.mad/SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_ttxg/CPPProcess.cc | 240 +- .../SubProcesses/P1_gg_ttxg/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttxg/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttxg/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttxg/matrix1.f | 43 +- epochX/cudacpp/gg_ttg.mad/SubProcesses/cuts.f | 18 +- .../cudacpp/gg_ttg.mad/SubProcesses/genps.f | 25 +- .../cudacpp/gg_ttg.mad/SubProcesses/myamp.f | 11 +- .../gg_ttg.mad/bin/internal/Gridpack/gridrun | 2 +- .../gg_ttg.mad/bin/internal/Gridpack/run.sh | 61 +- .../cudacpp/gg_ttg.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../gg_ttg.mad/bin/internal/extended_cmd.py | 7 +- .../gg_ttg.mad/bin/internal/file_writers.py | 6 +- .../cudacpp/gg_ttg.mad/bin/internal/files.py | 13 +- .../gg_ttg.mad/bin/internal/gen_cardhtml-pl | 2 +- .../gg_ttg.mad/bin/internal/gen_crossxhtml.py | 2 +- .../gg_ttg.mad/bin/internal/gen_jpeg-pl | 39 +- .../gg_ttg.mad/bin/internal/gen_ximprove.py | 92 +- .../gg_ttg.mad/bin/internal/hel_recycle.py | 2 +- .../gg_ttg.mad/bin/internal/histograms.py | 25 +- .../gg_ttg.mad/bin/internal/launch_plugin.py | 4 +- .../gg_ttg.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../gg_ttg.mad/bin/internal/restore_data | 11 +- .../gg_ttg.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/gg_ttg.mad/bin/madevent | 11 + epochX/cudacpp/gg_ttg.mad/src/HelAmps_sm.h | 2 +- .../cudacpp/gg_ttg.mad/src/Parameters_sm.cc | 2 +- epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.h | 2 +- .../gg_ttg.sa/CODEGEN_cudacpp_gg_ttg_log.txt | 48 +- .../cudacpp/gg_ttg.sa/SubProcesses/Bridge.h | 12 +- .../gg_ttg.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gg_ttg.sa/SubProcesses/MemoryAccessGs.h | 8 + .../gg_ttg.sa/SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_sm_gg_ttxg/CPPProcess.cc | 135 +- .../P1_Sigma_sm_gg_ttxg/CPPProcess.h | 2 +- epochX/cudacpp/gg_ttg.sa/src/HelAmps_sm.h | 2 +- epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.cc | 2 +- epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.h | 2 +- .../gg_ttgg.mad/CODEGEN_mad_gg_ttgg_log.txt | 88 +- .../gg_ttgg.mad/Cards/me5_configuration.txt | 4 +- .../gg_ttgg.mad/Cards/proc_card_mg5.dat | 2 +- epochX/cudacpp/gg_ttgg.mad/Cards/run_card.dat | 1 + .../gg_ttgg.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/gg_ttgg.mad/MGMEVersion.txt | 2 +- .../gg_ttgg.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/gg_ttgg.mad/Source/cuts.inc | 4 +- epochX/cudacpp/gg_ttgg.mad/Source/make_opts | 2 +- epochX/cudacpp/gg_ttgg.mad/Source/makefile | 1 + .../cudacpp/gg_ttgg.mad/Source/run_card.inc | 2 + .../cudacpp/gg_ttgg.mad/SubProcesses/Bridge.h | 12 +- .../gg_ttgg.mad/SubProcesses/GpuRuntime.h | 6 +- .../gg_ttgg.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gg_ttgg.mad/SubProcesses/MemoryAccessGs.h | 8 + .../gg_ttgg.mad/SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_ttxgg/CPPProcess.cc | 870 +- .../SubProcesses/P1_gg_ttxgg/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttxgg/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttxgg/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttxgg/matrix1.f | 420 +- .../cudacpp/gg_ttgg.mad/SubProcesses/cuts.f | 18 +- .../cudacpp/gg_ttgg.mad/SubProcesses/genps.f | 25 +- .../cudacpp/gg_ttgg.mad/SubProcesses/myamp.f | 11 +- .../gg_ttgg.mad/bin/internal/Gridpack/gridrun | 2 +- .../gg_ttgg.mad/bin/internal/Gridpack/run.sh | 61 +- .../gg_ttgg.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../gg_ttgg.mad/bin/internal/extended_cmd.py | 7 +- .../gg_ttgg.mad/bin/internal/file_writers.py | 6 +- .../cudacpp/gg_ttgg.mad/bin/internal/files.py | 13 +- .../gg_ttgg.mad/bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../gg_ttgg.mad/bin/internal/gen_jpeg-pl | 39 +- .../gg_ttgg.mad/bin/internal/gen_ximprove.py | 92 +- .../gg_ttgg.mad/bin/internal/hel_recycle.py | 2 +- .../gg_ttgg.mad/bin/internal/histograms.py | 25 +- .../gg_ttgg.mad/bin/internal/launch_plugin.py | 4 +- .../gg_ttgg.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../gg_ttgg.mad/bin/internal/restore_data | 11 +- .../gg_ttgg.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/gg_ttgg.mad/bin/madevent | 11 + epochX/cudacpp/gg_ttgg.mad/src/HelAmps_sm.h | 2 +- .../cudacpp/gg_ttgg.mad/src/Parameters_sm.cc | 2 +- .../cudacpp/gg_ttgg.mad/src/Parameters_sm.h | 2 +- .../CODEGEN_cudacpp_gg_ttgg_log.txt | 46 +- .../cudacpp/gg_ttgg.sa/SubProcesses/Bridge.h | 12 +- .../gg_ttgg.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gg_ttgg.sa/SubProcesses/MemoryAccessGs.h | 8 + .../gg_ttgg.sa/SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_sm_gg_ttxgg/CPPProcess.cc | 135 +- .../P1_Sigma_sm_gg_ttxgg/CPPProcess.h | 2 +- epochX/cudacpp/gg_ttgg.sa/src/HelAmps_sm.h | 2 +- .../cudacpp/gg_ttgg.sa/src/Parameters_sm.cc | 2 +- epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.h | 2 +- .../gg_ttggg.mad/CODEGEN_mad_gg_ttggg_log.txt | 90 +- .../gg_ttggg.mad/Cards/me5_configuration.txt | 4 +- .../gg_ttggg.mad/Cards/proc_card_mg5.dat | 2 +- .../cudacpp/gg_ttggg.mad/Cards/run_card.dat | 1 + .../gg_ttggg.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/gg_ttggg.mad/MGMEVersion.txt | 2 +- .../gg_ttggg.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/gg_ttggg.mad/Source/cuts.inc | 4 +- epochX/cudacpp/gg_ttggg.mad/Source/make_opts | 2 +- epochX/cudacpp/gg_ttggg.mad/Source/makefile | 1 + .../cudacpp/gg_ttggg.mad/Source/run_card.inc | 2 + .../gg_ttggg.mad/SubProcesses/Bridge.h | 12 +- .../gg_ttggg.mad/SubProcesses/GpuRuntime.h | 6 +- .../gg_ttggg.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../gg_ttggg.mad/SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_ttxggg/CPPProcess.cc | 6752 +++++++---- .../SubProcesses/P1_gg_ttxggg/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttxggg/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttxggg/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttxggg/matrix1.f | 9853 +---------------- .../cudacpp/gg_ttggg.mad/SubProcesses/cuts.f | 18 +- .../cudacpp/gg_ttggg.mad/SubProcesses/genps.f | 25 +- .../cudacpp/gg_ttggg.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../gg_ttggg.mad/bin/internal/Gridpack/run.sh | 61 +- .../gg_ttggg.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../gg_ttggg.mad/bin/internal/extended_cmd.py | 7 +- .../gg_ttggg.mad/bin/internal/file_writers.py | 6 +- .../gg_ttggg.mad/bin/internal/files.py | 13 +- .../gg_ttggg.mad/bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../gg_ttggg.mad/bin/internal/gen_jpeg-pl | 39 +- .../gg_ttggg.mad/bin/internal/gen_ximprove.py | 92 +- .../gg_ttggg.mad/bin/internal/hel_recycle.py | 2 +- .../gg_ttggg.mad/bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../gg_ttggg.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../gg_ttggg.mad/bin/internal/restore_data | 11 +- .../gg_ttggg.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/gg_ttggg.mad/bin/madevent | 11 + epochX/cudacpp/gg_ttggg.mad/src/HelAmps_sm.h | 2 +- .../cudacpp/gg_ttggg.mad/src/Parameters_sm.cc | 2 +- .../cudacpp/gg_ttggg.mad/src/Parameters_sm.h | 2 +- .../CODEGEN_cudacpp_gg_ttggg_log.txt | 48 +- .../cudacpp/gg_ttggg.sa/SubProcesses/Bridge.h | 12 +- .../gg_ttggg.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gg_ttggg.sa/SubProcesses/MemoryAccessGs.h | 8 + .../gg_ttggg.sa/SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_sm_gg_ttxggg/CPPProcess.cc | 135 +- .../P1_Sigma_sm_gg_ttxggg/CPPProcess.h | 2 +- epochX/cudacpp/gg_ttggg.sa/src/HelAmps_sm.h | 2 +- .../cudacpp/gg_ttggg.sa/src/Parameters_sm.cc | 2 +- .../cudacpp/gg_ttggg.sa/src/Parameters_sm.h | 2 +- .../gq_ttq.mad/CODEGEN_mad_gq_ttq_log.txt | 96 +- .../gq_ttq.mad/Cards/me5_configuration.txt | 4 +- .../gq_ttq.mad/Cards/proc_card_mg5.dat | 2 +- epochX/cudacpp/gq_ttq.mad/Cards/run_card.dat | 1 + .../gq_ttq.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/gq_ttq.mad/MGMEVersion.txt | 2 +- .../gq_ttq.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/gq_ttq.mad/Source/cuts.inc | 4 +- epochX/cudacpp/gq_ttq.mad/Source/make_opts | 2 +- epochX/cudacpp/gq_ttq.mad/Source/makefile | 1 + epochX/cudacpp/gq_ttq.mad/Source/run_card.inc | 2 + .../cudacpp/gq_ttq.mad/SubProcesses/Bridge.h | 12 +- .../gq_ttq.mad/SubProcesses/GpuRuntime.h | 6 +- .../gq_ttq.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gq_ttq.mad/SubProcesses/MemoryAccessGs.h | 8 + .../gq_ttq.mad/SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gu_ttxu/CPPProcess.cc | 170 +- .../SubProcesses/P1_gu_ttxu/CPPProcess.h | 2 +- .../SubProcesses/P1_gu_ttxu/auto_dsig.f | 2 +- .../SubProcesses/P1_gu_ttxu/auto_dsig1.f | 22 +- .../SubProcesses/P1_gu_ttxu/matrix1.f | 31 +- .../SubProcesses/P1_gux_ttxux/CPPProcess.cc | 170 +- .../SubProcesses/P1_gux_ttxux/CPPProcess.h | 2 +- .../SubProcesses/P1_gux_ttxux/auto_dsig.f | 2 +- .../SubProcesses/P1_gux_ttxux/auto_dsig1.f | 22 +- .../SubProcesses/P1_gux_ttxux/matrix1.f | 31 +- epochX/cudacpp/gq_ttq.mad/SubProcesses/cuts.f | 18 +- .../cudacpp/gq_ttq.mad/SubProcesses/genps.f | 25 +- .../cudacpp/gq_ttq.mad/SubProcesses/myamp.f | 11 +- .../gq_ttq.mad/bin/internal/Gridpack/gridrun | 2 +- .../gq_ttq.mad/bin/internal/Gridpack/run.sh | 61 +- .../cudacpp/gq_ttq.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../gq_ttq.mad/bin/internal/extended_cmd.py | 7 +- .../gq_ttq.mad/bin/internal/file_writers.py | 6 +- .../cudacpp/gq_ttq.mad/bin/internal/files.py | 13 +- .../gq_ttq.mad/bin/internal/gen_cardhtml-pl | 2 +- .../gq_ttq.mad/bin/internal/gen_crossxhtml.py | 2 +- .../gq_ttq.mad/bin/internal/gen_jpeg-pl | 39 +- .../gq_ttq.mad/bin/internal/gen_ximprove.py | 92 +- .../gq_ttq.mad/bin/internal/hel_recycle.py | 2 +- .../gq_ttq.mad/bin/internal/histograms.py | 25 +- .../gq_ttq.mad/bin/internal/launch_plugin.py | 4 +- .../gq_ttq.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../gq_ttq.mad/bin/internal/restore_data | 11 +- .../gq_ttq.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/gq_ttq.mad/bin/madevent | 11 + epochX/cudacpp/gq_ttq.mad/src/HelAmps_sm.h | 2 +- .../cudacpp/gq_ttq.mad/src/Parameters_sm.cc | 2 +- epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.h | 2 +- .../gq_ttq.sa/CODEGEN_cudacpp_gq_ttq_log.txt | 56 +- .../cudacpp/gq_ttq.sa/SubProcesses/Bridge.h | 12 +- .../gq_ttq.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../gq_ttq.sa/SubProcesses/MemoryAccessGs.h | 8 + .../gq_ttq.sa/SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_sm_gu_ttxu/CPPProcess.cc | 135 +- .../P1_Sigma_sm_gu_ttxu/CPPProcess.h | 2 +- .../P1_Sigma_sm_gux_ttxux/CPPProcess.cc | 135 +- .../P1_Sigma_sm_gux_ttxux/CPPProcess.h | 2 +- epochX/cudacpp/gq_ttq.sa/src/HelAmps_sm.h | 2 +- epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.cc | 2 +- epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.h | 2 +- .../CODEGEN_mad_heft_gg_bb_log.txt | 86 +- .../Cards/me5_configuration.txt | 4 +- .../heft_gg_bb.mad/Cards/proc_card_mg5.dat | 2 +- .../cudacpp/heft_gg_bb.mad/Cards/run_card.dat | 1 + .../heft_gg_bb.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/heft_gg_bb.mad/MGMEVersion.txt | 2 +- .../heft_gg_bb.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/heft_gg_bb.mad/Source/cuts.inc | 4 +- .../cudacpp/heft_gg_bb.mad/Source/make_opts | 2 +- epochX/cudacpp/heft_gg_bb.mad/Source/makefile | 1 + .../heft_gg_bb.mad/Source/run_card.inc | 2 + .../heft_gg_bb.mad/SubProcesses/Bridge.h | 12 +- .../heft_gg_bb.mad/SubProcesses/GpuRuntime.h | 6 +- .../heft_gg_bb.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_bbx/CPPProcess.cc | 163 +- .../SubProcesses/P1_gg_bbx/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_bbx/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_bbx/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_bbx/matrix1.f | 24 +- .../heft_gg_bb.mad/SubProcesses/cuts.f | 18 +- .../heft_gg_bb.mad/SubProcesses/genps.f | 25 +- .../heft_gg_bb.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../bin/internal/Gridpack/run.sh | 61 +- .../heft_gg_bb.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../bin/internal/extended_cmd.py | 7 +- .../bin/internal/file_writers.py | 6 +- .../heft_gg_bb.mad/bin/internal/files.py | 13 +- .../bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../heft_gg_bb.mad/bin/internal/gen_jpeg-pl | 39 +- .../bin/internal/gen_ximprove.py | 92 +- .../bin/internal/hel_recycle.py | 2 +- .../heft_gg_bb.mad/bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../heft_gg_bb.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../heft_gg_bb.mad/bin/internal/restore_data | 11 +- .../heft_gg_bb.mad/bin/internal/sum_html.py | 9 +- epochX/cudacpp/heft_gg_bb.mad/bin/madevent | 11 + .../cudacpp/heft_gg_bb.mad/src/HelAmps_heft.h | 2 +- .../heft_gg_bb.mad/src/Parameters_heft.cc | 2 +- .../heft_gg_bb.mad/src/Parameters_heft.h | 2 +- .../CODEGEN_cudacpp_heft_gg_bb_log.txt | 54 +- .../heft_gg_bb.sa/SubProcesses/Bridge.h | 12 +- .../heft_gg_bb.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_heft_gg_bbx/CPPProcess.cc | 135 +- .../P1_Sigma_heft_gg_bbx/CPPProcess.h | 2 +- .../cudacpp/heft_gg_bb.sa/src/HelAmps_heft.h | 2 +- .../heft_gg_bb.sa/src/Parameters_heft.cc | 2 +- .../heft_gg_bb.sa/src/Parameters_heft.h | 2 +- .../CODEGEN_mad_nobm_pp_ttW_log.txt | 146 +- .../Cards/me5_configuration.txt | 4 +- .../nobm_pp_ttW.mad/Cards/proc_card_mg5.dat | 2 +- .../nobm_pp_ttW.mad/Cards/run_card.dat | 1 + .../Cards/run_card_default.dat | 1 + .../cudacpp/nobm_pp_ttW.mad/MGMEVersion.txt | 2 +- .../nobm_pp_ttW.mad/Source/alfas_functions.f | 4 + .../cudacpp/nobm_pp_ttW.mad/Source/cuts.inc | 4 +- .../cudacpp/nobm_pp_ttW.mad/Source/make_opts | 2 +- .../cudacpp/nobm_pp_ttW.mad/Source/makefile | 1 + .../nobm_pp_ttW.mad/Source/run_card.inc | 2 + .../nobm_pp_ttW.mad/SubProcesses/Bridge.h | 12 +- .../nobm_pp_ttW.mad/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P0_dux_ttxwm/CPPProcess.cc | 149 +- .../SubProcesses/P0_dux_ttxwm/CPPProcess.h | 2 +- .../SubProcesses/P0_dux_ttxwm/auto_dsig.f | 2 +- .../SubProcesses/P0_dux_ttxwm/auto_dsig1.f | 20 +- .../SubProcesses/P0_dux_ttxwm/matrix1.f | 21 +- .../SubProcesses/P0_udx_ttxwp/CPPProcess.cc | 149 +- .../SubProcesses/P0_udx_ttxwp/CPPProcess.h | 2 +- .../SubProcesses/P0_udx_ttxwp/auto_dsig.f | 2 +- .../SubProcesses/P0_udx_ttxwp/auto_dsig1.f | 20 +- .../SubProcesses/P0_udx_ttxwp/matrix1.f | 21 +- .../SubProcesses/P1_dux_ttxwmg/CPPProcess.cc | 219 +- .../SubProcesses/P1_dux_ttxwmg/CPPProcess.h | 2 +- .../SubProcesses/P1_dux_ttxwmg/auto_dsig.f | 2 +- .../SubProcesses/P1_dux_ttxwmg/auto_dsig1.f | 20 +- .../SubProcesses/P1_dux_ttxwmg/matrix1.f | 31 +- .../SubProcesses/P1_gd_ttxwmu/CPPProcess.cc | 219 +- .../SubProcesses/P1_gd_ttxwmu/CPPProcess.h | 2 +- .../SubProcesses/P1_gd_ttxwmu/auto_dsig.f | 2 +- .../SubProcesses/P1_gd_ttxwmu/auto_dsig1.f | 18 +- .../SubProcesses/P1_gd_ttxwmu/matrix1.f | 31 +- .../SubProcesses/P1_gdx_ttxwpux/CPPProcess.cc | 219 +- .../SubProcesses/P1_gdx_ttxwpux/CPPProcess.h | 2 +- .../SubProcesses/P1_gdx_ttxwpux/auto_dsig.f | 2 +- .../SubProcesses/P1_gdx_ttxwpux/auto_dsig1.f | 18 +- .../SubProcesses/P1_gdx_ttxwpux/matrix1.f | 31 +- .../SubProcesses/P1_gu_ttxwpd/CPPProcess.cc | 219 +- .../SubProcesses/P1_gu_ttxwpd/CPPProcess.h | 2 +- .../SubProcesses/P1_gu_ttxwpd/auto_dsig.f | 2 +- .../SubProcesses/P1_gu_ttxwpd/auto_dsig1.f | 18 +- .../SubProcesses/P1_gu_ttxwpd/matrix1.f | 31 +- .../SubProcesses/P1_gux_ttxwmdx/CPPProcess.cc | 219 +- .../SubProcesses/P1_gux_ttxwmdx/CPPProcess.h | 2 +- .../SubProcesses/P1_gux_ttxwmdx/auto_dsig.f | 2 +- .../SubProcesses/P1_gux_ttxwmdx/auto_dsig1.f | 18 +- .../SubProcesses/P1_gux_ttxwmdx/matrix1.f | 31 +- .../SubProcesses/P1_udx_ttxwpg/CPPProcess.cc | 219 +- .../SubProcesses/P1_udx_ttxwpg/CPPProcess.h | 2 +- .../SubProcesses/P1_udx_ttxwpg/auto_dsig.f | 2 +- .../SubProcesses/P1_udx_ttxwpg/auto_dsig1.f | 20 +- .../SubProcesses/P1_udx_ttxwpg/matrix1.f | 31 +- .../nobm_pp_ttW.mad/SubProcesses/cuts.f | 18 +- .../nobm_pp_ttW.mad/SubProcesses/genps.f | 25 +- .../nobm_pp_ttW.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../bin/internal/Gridpack/run.sh | 61 +- .../nobm_pp_ttW.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../bin/internal/extended_cmd.py | 7 +- .../bin/internal/file_writers.py | 6 +- .../nobm_pp_ttW.mad/bin/internal/files.py | 13 +- .../bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../nobm_pp_ttW.mad/bin/internal/gen_jpeg-pl | 39 +- .../bin/internal/gen_ximprove.py | 92 +- .../bin/internal/hel_recycle.py | 2 +- .../bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../nobm_pp_ttW.mad/bin/internal/restore_data | 11 +- .../nobm_pp_ttW.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/nobm_pp_ttW.mad/bin/madevent | 11 + .../src/HelAmps_sm_no_b_mass.h | 2 +- .../src/Parameters_sm_no_b_mass.cc | 2 +- .../src/Parameters_sm_no_b_mass.h | 2 +- .../CODEGEN_mad_pp_tt012j_log.txt | 228 +- .../pp_tt012j.mad/Cards/me5_configuration.txt | 4 +- .../pp_tt012j.mad/Cards/proc_card_mg5.dat | 2 +- .../cudacpp/pp_tt012j.mad/Cards/run_card.dat | 1 + .../pp_tt012j.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/pp_tt012j.mad/MGMEVersion.txt | 2 +- .../pp_tt012j.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/pp_tt012j.mad/Source/cuts.inc | 4 +- epochX/cudacpp/pp_tt012j.mad/Source/make_opts | 2 +- epochX/cudacpp/pp_tt012j.mad/Source/makefile | 1 + .../cudacpp/pp_tt012j.mad/Source/run_card.inc | 2 + .../pp_tt012j.mad/SubProcesses/Bridge.h | 12 +- .../pp_tt012j.mad/SubProcesses/GpuRuntime.h | 6 +- .../pp_tt012j.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P0_gg_ttx/CPPProcess.cc | 156 +- .../SubProcesses/P0_gg_ttx/CPPProcess.h | 2 +- .../SubProcesses/P0_gg_ttx/auto_dsig.f | 2 +- .../SubProcesses/P0_gg_ttx/auto_dsig1.f | 16 +- .../SubProcesses/P0_gg_ttx/matrix1.f | 21 +- .../SubProcesses/P0_uux_ttx/CPPProcess.cc | 142 +- .../SubProcesses/P0_uux_ttx/CPPProcess.h | 2 +- .../SubProcesses/P0_uux_ttx/auto_dsig.f | 2 +- .../SubProcesses/P0_uux_ttx/auto_dsig1.f | 28 +- .../SubProcesses/P0_uux_ttx/matrix1.f | 21 +- .../SubProcesses/P1_gg_ttxg/CPPProcess.cc | 240 +- .../SubProcesses/P1_gg_ttxg/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttxg/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttxg/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttxg/matrix1.f | 43 +- .../SubProcesses/P1_gu_ttxu/CPPProcess.cc | 170 +- .../SubProcesses/P1_gu_ttxu/CPPProcess.h | 2 +- .../SubProcesses/P1_gu_ttxu/auto_dsig.f | 2 +- .../SubProcesses/P1_gu_ttxu/auto_dsig1.f | 22 +- .../SubProcesses/P1_gu_ttxu/matrix1.f | 31 +- .../SubProcesses/P1_gux_ttxux/CPPProcess.cc | 170 +- .../SubProcesses/P1_gux_ttxux/CPPProcess.h | 2 +- .../SubProcesses/P1_gux_ttxux/auto_dsig.f | 2 +- .../SubProcesses/P1_gux_ttxux/auto_dsig1.f | 22 +- .../SubProcesses/P1_gux_ttxux/matrix1.f | 31 +- .../SubProcesses/P1_uux_ttxg/CPPProcess.cc | 170 +- .../SubProcesses/P1_uux_ttxg/CPPProcess.h | 2 +- .../SubProcesses/P1_uux_ttxg/auto_dsig.f | 2 +- .../SubProcesses/P1_uux_ttxg/auto_dsig1.f | 28 +- .../SubProcesses/P1_uux_ttxg/matrix1.f | 31 +- .../SubProcesses/P2_gg_ttxgg/CPPProcess.cc | 870 +- .../SubProcesses/P2_gg_ttxgg/CPPProcess.h | 2 +- .../SubProcesses/P2_gg_ttxgg/auto_dsig.f | 2 +- .../SubProcesses/P2_gg_ttxgg/auto_dsig1.f | 16 +- .../SubProcesses/P2_gg_ttxgg/matrix1.f | 420 +- .../SubProcesses/P2_gg_ttxuux/CPPProcess.cc | 380 +- .../SubProcesses/P2_gg_ttxuux/CPPProcess.h | 2 +- .../SubProcesses/P2_gg_ttxuux/auto_dsig.f | 2 +- .../SubProcesses/P2_gg_ttxuux/auto_dsig1.f | 16 +- .../SubProcesses/P2_gg_ttxuux/matrix1.f | 111 +- .../SubProcesses/P2_gu_ttxgu/CPPProcess.cc | 380 +- .../SubProcesses/P2_gu_ttxgu/CPPProcess.h | 2 +- .../SubProcesses/P2_gu_ttxgu/auto_dsig.f | 2 +- .../SubProcesses/P2_gu_ttxgu/auto_dsig1.f | 22 +- .../SubProcesses/P2_gu_ttxgu/matrix1.f | 111 +- .../SubProcesses/P2_gux_ttxgux/CPPProcess.cc | 380 +- .../SubProcesses/P2_gux_ttxgux/CPPProcess.h | 2 +- .../SubProcesses/P2_gux_ttxgux/auto_dsig.f | 2 +- .../SubProcesses/P2_gux_ttxgux/auto_dsig1.f | 22 +- .../SubProcesses/P2_gux_ttxgux/matrix1.f | 109 +- .../SubProcesses/P2_uc_ttxuc/CPPProcess.cc | 184 +- .../SubProcesses/P2_uc_ttxuc/CPPProcess.h | 2 +- .../SubProcesses/P2_uc_ttxuc/auto_dsig.f | 2 +- .../SubProcesses/P2_uc_ttxuc/auto_dsig1.f | 24 +- .../SubProcesses/P2_uc_ttxuc/matrix1.f | 39 +- .../SubProcesses/P2_ucx_ttxucx/CPPProcess.cc | 184 +- .../SubProcesses/P2_ucx_ttxucx/CPPProcess.h | 2 +- .../SubProcesses/P2_ucx_ttxucx/auto_dsig.f | 2 +- .../SubProcesses/P2_ucx_ttxucx/auto_dsig1.f | 28 +- .../SubProcesses/P2_ucx_ttxucx/matrix1.f | 39 +- .../SubProcesses/P2_uu_ttxuu/CPPProcess.cc | 233 +- .../SubProcesses/P2_uu_ttxuu/CPPProcess.h | 2 +- .../SubProcesses/P2_uu_ttxuu/auto_dsig.f | 2 +- .../SubProcesses/P2_uu_ttxuu/auto_dsig1.f | 28 +- .../SubProcesses/P2_uu_ttxuu/matrix1.f | 39 +- .../SubProcesses/P2_uux_ttxccx/CPPProcess.cc | 184 +- .../SubProcesses/P2_uux_ttxccx/CPPProcess.h | 2 +- .../SubProcesses/P2_uux_ttxccx/auto_dsig.f | 2 +- .../SubProcesses/P2_uux_ttxccx/auto_dsig1.f | 28 +- .../SubProcesses/P2_uux_ttxccx/matrix1.f | 39 +- .../SubProcesses/P2_uux_ttxgg/CPPProcess.cc | 380 +- .../SubProcesses/P2_uux_ttxgg/CPPProcess.h | 2 +- .../SubProcesses/P2_uux_ttxgg/auto_dsig.f | 2 +- .../SubProcesses/P2_uux_ttxgg/auto_dsig1.f | 28 +- .../SubProcesses/P2_uux_ttxgg/matrix1.f | 111 +- .../SubProcesses/P2_uux_ttxuux/CPPProcess.cc | 233 +- .../SubProcesses/P2_uux_ttxuux/CPPProcess.h | 2 +- .../SubProcesses/P2_uux_ttxuux/auto_dsig.f | 2 +- .../SubProcesses/P2_uux_ttxuux/auto_dsig1.f | 28 +- .../SubProcesses/P2_uux_ttxuux/matrix1.f | 39 +- .../P2_uxcx_ttxuxcx/CPPProcess.cc | 184 +- .../SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.h | 2 +- .../SubProcesses/P2_uxcx_ttxuxcx/auto_dsig.f | 2 +- .../SubProcesses/P2_uxcx_ttxuxcx/auto_dsig1.f | 24 +- .../SubProcesses/P2_uxcx_ttxuxcx/matrix1.f | 39 +- .../P2_uxux_ttxuxux/CPPProcess.cc | 233 +- .../SubProcesses/P2_uxux_ttxuxux/CPPProcess.h | 2 +- .../SubProcesses/P2_uxux_ttxuxux/auto_dsig.f | 2 +- .../SubProcesses/P2_uxux_ttxuxux/auto_dsig1.f | 28 +- .../SubProcesses/P2_uxux_ttxuxux/matrix1.f | 39 +- .../cudacpp/pp_tt012j.mad/SubProcesses/cuts.f | 18 +- .../pp_tt012j.mad/SubProcesses/genps.f | 25 +- .../pp_tt012j.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../bin/internal/Gridpack/run.sh | 61 +- .../pp_tt012j.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../bin/internal/extended_cmd.py | 7 +- .../bin/internal/file_writers.py | 6 +- .../pp_tt012j.mad/bin/internal/files.py | 13 +- .../bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../pp_tt012j.mad/bin/internal/gen_jpeg-pl | 39 +- .../bin/internal/gen_ximprove.py | 92 +- .../pp_tt012j.mad/bin/internal/hel_recycle.py | 2 +- .../pp_tt012j.mad/bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../pp_tt012j.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../pp_tt012j.mad/bin/internal/restore_data | 11 +- .../pp_tt012j.mad/bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/pp_tt012j.mad/bin/madevent | 11 + epochX/cudacpp/pp_tt012j.mad/src/HelAmps_sm.h | 2 +- .../pp_tt012j.mad/src/Parameters_sm.cc | 2 +- .../cudacpp/pp_tt012j.mad/src/Parameters_sm.h | 2 +- .../CODEGEN_mad_smeft_gg_tttt_log.txt | 90 +- .../smeft_gg_tttt.mad/Cards/ident_card.dat | 40 +- .../Cards/me5_configuration.txt | 4 +- .../smeft_gg_tttt.mad/Cards/proc_card_mg5.dat | 2 +- .../smeft_gg_tttt.mad/Cards/run_card.dat | 1 + .../Cards/run_card_default.dat | 1 + .../cudacpp/smeft_gg_tttt.mad/MGMEVersion.txt | 2 +- .../Source/alfas_functions.f | 4 + .../cudacpp/smeft_gg_tttt.mad/Source/cuts.inc | 4 +- .../smeft_gg_tttt.mad/Source/make_opts | 2 +- .../cudacpp/smeft_gg_tttt.mad/Source/makefile | 1 + .../smeft_gg_tttt.mad/Source/param_card.inc | 40 +- .../smeft_gg_tttt.mad/Source/run_card.inc | 2 + .../smeft_gg_tttt.mad/SubProcesses/Bridge.h | 12 +- .../SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_ttxttx/CPPProcess.cc | 625 +- .../SubProcesses/P1_gg_ttxttx/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttxttx/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttxttx/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttxttx/matrix1.f | 111 +- .../smeft_gg_tttt.mad/SubProcesses/cuts.f | 18 +- .../smeft_gg_tttt.mad/SubProcesses/genps.f | 25 +- .../smeft_gg_tttt.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../bin/internal/Gridpack/run.sh | 61 +- .../smeft_gg_tttt.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../bin/internal/extended_cmd.py | 7 +- .../bin/internal/file_writers.py | 6 +- .../smeft_gg_tttt.mad/bin/internal/files.py | 13 +- .../bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../bin/internal/gen_jpeg-pl | 39 +- .../bin/internal/gen_ximprove.py | 92 +- .../bin/internal/hel_recycle.py | 2 +- .../bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../bin/internal/restore_data | 11 +- .../bin/internal/sum_html.py | 9 +- .../bin/internal/ufomodel/write_param_card.py | 5 +- epochX/cudacpp/smeft_gg_tttt.mad/bin/madevent | 11 + .../HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h | 2 +- ...Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc | 2 +- .../Parameters_SMEFTsim_topU3l_MwScheme_UFO.h | 2 +- .../CODEGEN_cudacpp_smeft_gg_tttt_log.txt | 50 +- .../smeft_gg_tttt.sa/SubProcesses/Bridge.h | 12 +- .../SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../CPPProcess.cc | 135 +- .../CPPProcess.h | 2 +- .../HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h | 2 +- ...Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc | 2 +- .../Parameters_SMEFTsim_topU3l_MwScheme_UFO.h | 2 +- .../CODEGEN_mad_susy_gg_t1t1_log.txt | 86 +- .../susy_gg_t1t1.mad/Cards/ident_card.dat | 2 +- .../Cards/me5_configuration.txt | 4 +- .../susy_gg_t1t1.mad/Cards/proc_card_mg5.dat | 2 +- .../susy_gg_t1t1.mad/Cards/run_card.dat | 1 + .../Cards/run_card_default.dat | 1 + .../cudacpp/susy_gg_t1t1.mad/MGMEVersion.txt | 2 +- .../susy_gg_t1t1.mad/Source/alfas_functions.f | 4 + .../cudacpp/susy_gg_t1t1.mad/Source/cuts.inc | 4 +- .../cudacpp/susy_gg_t1t1.mad/Source/make_opts | 2 +- .../cudacpp/susy_gg_t1t1.mad/Source/makefile | 1 + .../susy_gg_t1t1.mad/Source/param_card.inc | 2 +- .../susy_gg_t1t1.mad/Source/run_card.inc | 2 + .../susy_gg_t1t1.mad/SubProcesses/Bridge.h | 12 +- .../SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_t1t1x/CPPProcess.cc | 170 +- .../SubProcesses/P1_gg_t1t1x/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_t1t1x/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_t1t1x/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_t1t1x/matrix1.f | 21 +- .../susy_gg_t1t1.mad/SubProcesses/cuts.f | 18 +- .../susy_gg_t1t1.mad/SubProcesses/genps.f | 25 +- .../susy_gg_t1t1.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../bin/internal/Gridpack/run.sh | 61 +- .../susy_gg_t1t1.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../bin/internal/extended_cmd.py | 7 +- .../bin/internal/file_writers.py | 6 +- .../susy_gg_t1t1.mad/bin/internal/files.py | 13 +- .../bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../susy_gg_t1t1.mad/bin/internal/gen_jpeg-pl | 39 +- .../bin/internal/gen_ximprove.py | 92 +- .../bin/internal/hel_recycle.py | 2 +- .../bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../bin/internal/restore_data | 11 +- .../susy_gg_t1t1.mad/bin/internal/sum_html.py | 9 +- epochX/cudacpp/susy_gg_t1t1.mad/bin/madevent | 11 + .../susy_gg_t1t1.mad/src/HelAmps_MSSM_SLHA2.h | 2 +- .../src/Parameters_MSSM_SLHA2.cc | 2 +- .../src/Parameters_MSSM_SLHA2.h | 2 +- .../CODEGEN_cudacpp_susy_gg_t1t1_log.txt | 46 +- .../susy_gg_t1t1.sa/SubProcesses/Bridge.h | 12 +- .../susy_gg_t1t1.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../CPPProcess.cc | 135 +- .../P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.h | 2 +- .../susy_gg_t1t1.sa/src/HelAmps_MSSM_SLHA2.h | 2 +- .../src/Parameters_MSSM_SLHA2.cc | 2 +- .../src/Parameters_MSSM_SLHA2.h | 2 +- .../CODEGEN_mad_susy_gg_tt_log.txt | 84 +- .../susy_gg_tt.mad/Cards/ident_card.dat | 2 +- .../Cards/me5_configuration.txt | 4 +- .../susy_gg_tt.mad/Cards/proc_card_mg5.dat | 2 +- .../cudacpp/susy_gg_tt.mad/Cards/run_card.dat | 1 + .../susy_gg_tt.mad/Cards/run_card_default.dat | 1 + epochX/cudacpp/susy_gg_tt.mad/MGMEVersion.txt | 2 +- .../susy_gg_tt.mad/Source/alfas_functions.f | 4 + epochX/cudacpp/susy_gg_tt.mad/Source/cuts.inc | 4 +- .../cudacpp/susy_gg_tt.mad/Source/make_opts | 2 +- epochX/cudacpp/susy_gg_tt.mad/Source/makefile | 1 + .../susy_gg_tt.mad/Source/param_card.inc | 2 +- .../susy_gg_tt.mad/Source/run_card.inc | 2 + .../susy_gg_tt.mad/SubProcesses/Bridge.h | 12 +- .../susy_gg_tt.mad/SubProcesses/GpuRuntime.h | 6 +- .../susy_gg_tt.mad/SubProcesses/MGVersion.txt | 2 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../SubProcesses/P1_gg_ttx/CPPProcess.cc | 156 +- .../SubProcesses/P1_gg_ttx/CPPProcess.h | 2 +- .../SubProcesses/P1_gg_ttx/auto_dsig.f | 2 +- .../SubProcesses/P1_gg_ttx/auto_dsig1.f | 16 +- .../SubProcesses/P1_gg_ttx/matrix1.f | 21 +- .../susy_gg_tt.mad/SubProcesses/cuts.f | 18 +- .../susy_gg_tt.mad/SubProcesses/genps.f | 25 +- .../susy_gg_tt.mad/SubProcesses/myamp.f | 11 +- .../bin/internal/Gridpack/gridrun | 2 +- .../bin/internal/Gridpack/run.sh | 61 +- .../susy_gg_tt.mad/bin/internal/banner.py | 19 +- .../bin/internal/check_param_card.py | 4 +- .../bin/internal/common_run_interface.py | 25 +- .../bin/internal/extended_cmd.py | 7 +- .../bin/internal/file_writers.py | 6 +- .../susy_gg_tt.mad/bin/internal/files.py | 13 +- .../bin/internal/gen_cardhtml-pl | 2 +- .../bin/internal/gen_crossxhtml.py | 2 +- .../susy_gg_tt.mad/bin/internal/gen_jpeg-pl | 39 +- .../bin/internal/gen_ximprove.py | 92 +- .../bin/internal/hel_recycle.py | 2 +- .../susy_gg_tt.mad/bin/internal/histograms.py | 25 +- .../bin/internal/launch_plugin.py | 4 +- .../susy_gg_tt.mad/bin/internal/lhe_parser.py | 4 +- .../bin/internal/madevent_interface.py | 36 +- .../susy_gg_tt.mad/bin/internal/restore_data | 11 +- .../susy_gg_tt.mad/bin/internal/sum_html.py | 9 +- epochX/cudacpp/susy_gg_tt.mad/bin/madevent | 11 + .../susy_gg_tt.mad/src/HelAmps_MSSM_SLHA2.h | 2 +- .../src/Parameters_MSSM_SLHA2.cc | 2 +- .../src/Parameters_MSSM_SLHA2.h | 2 +- .../CODEGEN_cudacpp_susy_gg_tt_log.txt | 48 +- .../susy_gg_tt.sa/SubProcesses/Bridge.h | 12 +- .../susy_gg_tt.sa/SubProcesses/GpuRuntime.h | 6 +- .../SubProcesses/MatrixElementKernels.cc | 4 +- .../SubProcesses/MatrixElementKernels.h | 4 +- .../SubProcesses/MemoryAccessGs.h | 8 + .../SubProcesses/MemoryBuffers.h | 4 +- .../P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.cc | 135 +- .../P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.h | 2 +- .../susy_gg_tt.sa/src/HelAmps_MSSM_SLHA2.h | 2 +- .../src/Parameters_MSSM_SLHA2.cc | 2 +- .../susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.h | 2 +- 905 files changed, 19749 insertions(+), 20296 deletions(-) diff --git a/epochX/cudacpp/ee_mumu.mad/CODEGEN_mad_ee_mumu_log.txt b/epochX/cudacpp/ee_mumu.mad/CODEGEN_mad_ee_mumu_log.txt index db84a9053c..a6c8267949 100644 --- a/epochX/cudacpp/ee_mumu.mad/CODEGEN_mad_ee_mumu_log.txt +++ b/epochX/cudacpp/ee_mumu.mad/CODEGEN_mad_ee_mumu_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate e+ e- > mu+ mu- No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006200551986694336  +DEBUG: model prefixing takes 0.0018396377563476562  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -150,21 +152,21 @@ INFO: Checking for minimal orders which gives processes. INFO: Please specify coupling orders to bypass this step. INFO: Trying process: e+ e- > mu+ mu- WEIGHTED<=4 @1 INFO: Process has 2 diagrams -1 processes with 2 diagrams generated in 0.004 s +1 processes with 2 diagrams generated in 0.005 s Total: 1 processes with 2 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_ee_mumu --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_ee_mumu INFO: remove old information in CODEGEN_mad_ee_mumu DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: e+ e- > mu+ mu- WEIGHTED<=4 @1 INFO: Processing color information for process: e+ e- > mu+ mu- @1 @@ -176,22 +178,22 @@ FileWriter mu+ mu- WEIGHTED<=4 @1 INFO: Finding symmetric diagrams for subprocess group epem_mupmum -DEBUG: len(subproc_diagrams_for_config) =  2 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  2 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2} [model_handling.py at line 1563]  Generated helas calls for 1 subprocesses (2 diagrams) in 0.004 s -Wrote files for 8 helas calls in 0.070 s +Wrote files for 8 helas calls in 1.297 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFV2 routines ALOHA: aloha creates FFV4 routines -ALOHA: aloha creates 3 routines in 0.201 s +ALOHA: aloha creates 3 routines in 0.122 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFV2 routines ALOHA: aloha creates FFV4 routines ALOHA: aloha creates FFV2_4 routines -ALOHA: aloha creates 7 routines in 0.253 s +ALOHA: aloha creates 7 routines in 0.122 s FFV1 FFV1 FFV2 @@ -200,38 +202,40 @@ ALOHA: aloha creates 7 routines in 0.253 s FFV4 FFV2_4 FFV2_4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/SubProcesses/P1_epem_mupmum; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/SubProcesses/P1_epem_mupmum; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 236 (offset 9 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/README Run "open index.html" to see more information about this process. quit -real 0m2.054s -user 0m1.767s -sys 0m0.275s -Code generation completed in 2 seconds +real 0m6.345s +user 0m1.204s +sys 0m0.651s +Code generation completed in 7 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -244,7 +248,7 @@ Code generation completed in 2 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -252,13 +256,14 @@ Code generation completed in 2 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run +/shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/madgraph/various/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ quit INFO: launch in debug mode @@ -274,7 +279,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -282,10 +287,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_ee_mumu/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/ee_mumu.mad/Cards/me5_configuration.txt b/epochX/cudacpp/ee_mumu.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/ee_mumu.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/ee_mumu.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/ee_mumu.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/ee_mumu.mad/Cards/proc_card_mg5.dat index bb623f867a..884d65b94b 100644 --- a/epochX/cudacpp/ee_mumu.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/ee_mumu.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/ee_mumu.mad/Cards/run_card.dat b/epochX/cudacpp/ee_mumu.mad/Cards/run_card.dat index 74f70b567b..c1037c83d7 100644 --- a/epochX/cudacpp/ee_mumu.mad/Cards/run_card.dat +++ b/epochX/cudacpp/ee_mumu.mad/Cards/run_card.dat @@ -112,6 +112,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/ee_mumu.mad/Cards/run_card_default.dat b/epochX/cudacpp/ee_mumu.mad/Cards/run_card_default.dat index 68ee164d00..4ba7540657 100644 --- a/epochX/cudacpp/ee_mumu.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/ee_mumu.mad/Cards/run_card_default.dat @@ -112,6 +112,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/ee_mumu.mad/MGMEVersion.txt b/epochX/cudacpp/ee_mumu.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/ee_mumu.mad/MGMEVersion.txt +++ b/epochX/cudacpp/ee_mumu.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/ee_mumu.mad/Source/alfas_functions.f b/epochX/cudacpp/ee_mumu.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/ee_mumu.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/ee_mumu.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/ee_mumu.mad/Source/cuts.inc b/epochX/cudacpp/ee_mumu.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/ee_mumu.mad/Source/cuts.inc +++ b/epochX/cudacpp/ee_mumu.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/ee_mumu.mad/Source/make_opts b/epochX/cudacpp/ee_mumu.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/ee_mumu.mad/Source/make_opts +++ b/epochX/cudacpp/ee_mumu.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/ee_mumu.mad/Source/makefile b/epochX/cudacpp/ee_mumu.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/ee_mumu.mad/Source/makefile +++ b/epochX/cudacpp/ee_mumu.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/ee_mumu.mad/Source/run_card.inc b/epochX/cudacpp/ee_mumu.mad/Source/run_card.inc index 80d5ae41aa..83061d9ae9 100644 --- a/epochX/cudacpp/ee_mumu.mad/Source/run_card.inc +++ b/epochX/cudacpp/ee_mumu.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/Bridge.h b/epochX/cudacpp/ee_mumu.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/ee_mumu.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.cc b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.cc index 7bd57a8dbb..3c053daa0b 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.cc +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -335,8 +399,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[2], w_fp[3], w_fp[4], COUPs[ndcoup + 0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -348,8 +415,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV2_4_0( w_fp[2], w_fp[3], w_fp[4], COUPs[ndcoup + 1], 1.0, COUPs[ndcoup + 2], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -539,7 +609,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -908,9 +980,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -918,7 +987,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -943,11 +1011,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -960,17 +1029,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1085,38 +1144,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1289,11 +1317,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.h b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.h index 159826a904..8f9b209cbf 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.h +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig.f b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig.f index 70fe04e4d8..b60bf0aacb 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig.f +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig1.f b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig1.f index 280eff025e..661e3e2c4d 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig1.f +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,7 +140,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF EP1=PDG2PDF(LPP(IB(1)),-11, IB(1),XBK(IB(1)), QSCALE) IF (PDLABEL.EQ.'dressed') EP1_COMPONENTS(1:4 ) = @@ -149,7 +149,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF EM2=PDG2PDF(LPP(IB(2)),11, IB(2),XBK(IB(2)), QSCALE) IF (PDLABEL.EQ.'dressed') EM2_COMPONENTS(1:4 ) = @@ -228,7 +228,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -302,6 +302,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -385,14 +389,14 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) EP1(IVEC)=PDG2PDF(LPP(IB(1)),-11, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) IF (PDLABEL.EQ.'dressed') EP1_COMPONENTS(1:4 , IVEC) = $ EE_COMPONENTS(1:4) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) EM2(IVEC)=PDG2PDF(LPP(IB(2)),11, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) IF (PDLABEL.EQ.'dressed') EM2_COMPONENTS(1:4 , IVEC) = $ EE_COMPONENTS(1:4) ENDIF diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/matrix1.f b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/matrix1.f index 1a2e5df4e6..75e9aa1dc8 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/matrix1.f +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -325,7 +325,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -368,7 +368,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -411,7 +412,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 1) /1.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 1) /1/ C 1 ColorOne() C ---------- C BEGIN CODE @@ -455,10 +457,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -467,6 +471,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/cuts.f b/epochX/cudacpp/ee_mumu.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/genps.f b/epochX/cudacpp/ee_mumu.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/myamp.f b/epochX/cudacpp/ee_mumu.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/ee_mumu.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/banner.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/banner.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/check_param_card.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/file_writers.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/files.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/files.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/histograms.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/restore_data b/epochX/cudacpp/ee_mumu.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/restore_data +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/sum_html.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/ee_mumu.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/ee_mumu.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/ee_mumu.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/ee_mumu.mad/bin/madevent b/epochX/cudacpp/ee_mumu.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/ee_mumu.mad/bin/madevent +++ b/epochX/cudacpp/ee_mumu.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/ee_mumu.mad/src/HelAmps_sm.h b/epochX/cudacpp/ee_mumu.mad/src/HelAmps_sm.h index 18f664e0d1..337ed3e675 100644 --- a/epochX/cudacpp/ee_mumu.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/ee_mumu.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.cc b/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.cc index 37676c1d8d..a34d22a043 100644 --- a/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.h b/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.h index 5fcde71f6b..9d95e01e1b 100644 --- a/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/ee_mumu.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/ee_mumu.sa/CODEGEN_cudacpp_ee_mumu_log.txt b/epochX/cudacpp/ee_mumu.sa/CODEGEN_cudacpp_ee_mumu_log.txt index f27925604a..35d7ce4ba9 100644 --- a/epochX/cudacpp/ee_mumu.sa/CODEGEN_cudacpp_ee_mumu_log.txt +++ b/epochX/cudacpp/ee_mumu.sa/CODEGEN_cudacpp_ee_mumu_log.txt @@ -1,8 +1,18 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +/shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/madgraph/various/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ +/shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/madgraph/iolibs/export_v4.py:4187: SyntaxWarning: invalid escape sequence '\d' + arg['coup'] = re.sub('coup(\d+)\)s','coup\g<1>)s%(vec\g<1>)s', arg['coup']) +/shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/madgraph/iolibs/export_v4.py:4187: SyntaxWarning: invalid escape sequence '\g' + arg['coup'] = re.sub('coup(\d+)\)s','coup\g<1>)s%(vec\g<1>)s', arg['coup']) +Running MG5 in debug mode +('WARNING: loading of madgraph too slow!!!', 0.6939451694488525) +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +25,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +56,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +67,7 @@ generate e+ e- > mu+ mu- No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006340742111206055  +DEBUG: model prefixing takes 0.0018661022186279297  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -150,13 +159,13 @@ INFO: Checking for minimal orders which gives processes. INFO: Please specify coupling orders to bypass this step. INFO: Trying process: e+ e- > mu+ mu- WEIGHTED<=4 @1 INFO: Process has 2 diagrams -1 processes with 2 diagrams generated in 0.004 s +1 processes with 2 diagrams generated in 0.006 s Total: 1 processes with 2 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_ee_mumu Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: e+ e- > mu+ mu- WEIGHTED<=4 @1 INFO: Processing color information for process: e+ e- > mu+ mu- @1 @@ -165,17 +174,17 @@ INFO: Processing color information for process: e+ e- > mu+ mu- @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum/. +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/SubProcesses/P1_Sigma_sm_epem_mupmum/. Generated helas calls for 1 subprocesses (2 diagrams) in 0.004 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFV2 routines ALOHA: aloha creates FFV4 routines ALOHA: aloha creates FFV2_4 routines -ALOHA: aloha creates 4 routines in 0.267 s +ALOHA: aloha creates 4 routines in 0.124 s FFV1 FFV1 FFV2 @@ -184,17 +193,17 @@ ALOHA: aloha creates 4 routines in 0.267 s FFV4 FFV2_4 FFV2_4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_ee_mumu/src/. quit -real 0m0.659s -user 0m0.589s -sys 0m0.056s -Code generation completed in 1 seconds +real 0m1.908s +user 0m0.670s +sys 0m0.163s +Code generation completed in 2 seconds diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/Bridge.h b/epochX/cudacpp/ee_mumu.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/ee_mumu.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.cc b/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.cc index 16a91dd141..76f8b7f25c 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.cc +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -537,7 +601,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -906,9 +972,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -916,7 +979,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -941,11 +1003,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -958,17 +1021,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1083,38 +1136,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1287,11 +1309,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.h b/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.h index 159826a904..8f9b209cbf 100644 --- a/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.h +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/ee_mumu.sa/src/HelAmps_sm.h b/epochX/cudacpp/ee_mumu.sa/src/HelAmps_sm.h index 18f664e0d1..337ed3e675 100644 --- a/epochX/cudacpp/ee_mumu.sa/src/HelAmps_sm.h +++ b/epochX/cudacpp/ee_mumu.sa/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.cc b/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.cc index 37676c1d8d..a34d22a043 100644 --- a/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.cc +++ b/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.h b/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.h index 5fcde71f6b..9d95e01e1b 100644 --- a/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.h +++ b/epochX/cudacpp/ee_mumu.sa/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.mad/CODEGEN_mad_gg_tt_log.txt b/epochX/cudacpp/gg_tt.mad/CODEGEN_mad_gg_tt_log.txt index 453da8d298..2a280f1aa1 100644 --- a/epochX/cudacpp/gg_tt.mad/CODEGEN_mad_gg_tt_log.txt +++ b/epochX/cudacpp/gg_tt.mad/CODEGEN_mad_gg_tt_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.0065233707427978516  +DEBUG: model prefixing takes 0.0018689632415771484  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,21 +153,21 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=2: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ WEIGHTED<=2 @1 INFO: Process has 3 diagrams -1 processes with 3 diagrams generated in 0.009 s +1 processes with 3 diagrams generated in 0.012 s Total: 1 processes with 3 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_gg_tt --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_gg_tt INFO: remove old information in CODEGEN_mad_gg_tt DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ WEIGHTED<=2 @1 INFO: Processing color information for process: g g > t t~ @1 @@ -177,54 +179,56 @@ FileWriter t t~ WEIGHTED<=2 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttx -DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1552]  -Generated helas calls for 1 subprocesses (3 diagrams) in 0.006 s -Wrote files for 10 helas calls in 0.072 s +DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1563]  +Generated helas calls for 1 subprocesses (3 diagrams) in 0.005 s +Wrote files for 10 helas calls in 1.322 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines -ALOHA: aloha creates 2 routines in 0.144 s +ALOHA: aloha creates 2 routines in 0.065 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines -ALOHA: aloha creates 4 routines in 0.132 s +ALOHA: aloha creates 4 routines in 0.079 s VVV1 FFV1 FFV1 FFV1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/SubProcesses/P1_gg_ttx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/SubProcesses/P1_gg_ttx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/README Run "open index.html" to see more information about this process. quit -real 0m1.991s -user 0m1.616s -sys 0m0.275s -Code generation completed in 2 seconds +real 0m6.206s +user 0m1.186s +sys 0m0.626s +Code generation completed in 7 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -237,7 +241,7 @@ Code generation completed in 2 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -245,10 +249,9 @@ Code generation completed in 2 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -267,7 +270,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -275,10 +278,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/gg_tt.mad/Cards/me5_configuration.txt b/epochX/cudacpp/gg_tt.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/gg_tt.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/gg_tt.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/gg_tt.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/gg_tt.mad/Cards/proc_card_mg5.dat index 66598786f5..5763a666b2 100644 --- a/epochX/cudacpp/gg_tt.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/gg_tt.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/gg_tt.mad/Cards/run_card.dat b/epochX/cudacpp/gg_tt.mad/Cards/run_card.dat index 6b82577032..000832aacd 100644 --- a/epochX/cudacpp/gg_tt.mad/Cards/run_card.dat +++ b/epochX/cudacpp/gg_tt.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_tt.mad/Cards/run_card_default.dat b/epochX/cudacpp/gg_tt.mad/Cards/run_card_default.dat index b8db871c35..85e1d39035 100644 --- a/epochX/cudacpp/gg_tt.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/gg_tt.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_tt.mad/MGMEVersion.txt b/epochX/cudacpp/gg_tt.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_tt.mad/MGMEVersion.txt +++ b/epochX/cudacpp/gg_tt.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt.mad/Source/alfas_functions.f b/epochX/cudacpp/gg_tt.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/gg_tt.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/gg_tt.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/gg_tt.mad/Source/cuts.inc b/epochX/cudacpp/gg_tt.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/gg_tt.mad/Source/cuts.inc +++ b/epochX/cudacpp/gg_tt.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/gg_tt.mad/Source/make_opts b/epochX/cudacpp/gg_tt.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/gg_tt.mad/Source/make_opts +++ b/epochX/cudacpp/gg_tt.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/gg_tt.mad/Source/makefile b/epochX/cudacpp/gg_tt.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/gg_tt.mad/Source/makefile +++ b/epochX/cudacpp/gg_tt.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/gg_tt.mad/Source/run_card.inc b/epochX/cudacpp/gg_tt.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/gg_tt.mad/Source/run_card.inc +++ b/epochX/cudacpp/gg_tt.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/Bridge.h b/epochX/cudacpp/gg_tt.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_tt.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/gg_tt.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc index b32f4b931e..7387ab4335 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -335,8 +399,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[2], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -349,8 +416,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[4], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -362,8 +432,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[4], w_fp[2], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -555,7 +628,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -923,9 +998,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -933,7 +1005,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -958,11 +1029,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -975,17 +1047,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1100,38 +1162,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1304,11 +1335,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h index feff1cc6e1..c0ba6c2f8c 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f index bc9bcfeb9b..5d6ef2ba62 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f index db3c284caa..f46e9bfaf0 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f index 707ea40323..e6ca6093c7 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -307,7 +307,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -350,7 +350,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -393,11 +394,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /5.333333333333333D+00, - $ -6.666666666666666D-01/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 2) /16,-4/ C 1 T(1,2,3,4) - DATA (CF(I, 2),I= 1, 2) /-6.666666666666666D-01 - $ ,5.333333333333333D+00/ + DATA (CF(I),I= 3, 3) /16/ C 1 T(2,1,3,4) C ---------- C BEGIN CODE @@ -446,10 +446,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -458,6 +460,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/cuts.f b/epochX/cudacpp/gg_tt.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/genps.f b/epochX/cudacpp/gg_tt.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/myamp.f b/epochX/cudacpp/gg_tt.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/gg_tt.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/banner.py b/epochX/cudacpp/gg_tt.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/banner.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/check_param_card.py b/epochX/cudacpp/gg_tt.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/gg_tt.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/gg_tt.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/file_writers.py b/epochX/cudacpp/gg_tt.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/files.py b/epochX/cudacpp/gg_tt.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/files.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/gg_tt.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/histograms.py b/epochX/cudacpp/gg_tt.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/gg_tt.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/gg_tt.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/gg_tt.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/restore_data b/epochX/cudacpp/gg_tt.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/restore_data +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/sum_html.py b/epochX/cudacpp/gg_tt.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/gg_tt.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/gg_tt.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/gg_tt.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/gg_tt.mad/bin/madevent b/epochX/cudacpp/gg_tt.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/gg_tt.mad/bin/madevent +++ b/epochX/cudacpp/gg_tt.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/gg_tt.mad/src/HelAmps_sm.h b/epochX/cudacpp/gg_tt.mad/src/HelAmps_sm.h index febf1dcf42..c7283310f9 100644 --- a/epochX/cudacpp/gg_tt.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_tt.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.cc b/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.cc index d09f387480..c341b26e1e 100644 --- a/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.h b/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.h index ba434e7b98..1d880fe7d9 100644 --- a/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_tt.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.sa/CODEGEN_cudacpp_gg_tt_log.txt b/epochX/cudacpp/gg_tt.sa/CODEGEN_cudacpp_gg_tt_log.txt index 816b17272d..6ef99f7c49 100644 --- a/epochX/cudacpp/gg_tt.sa/CODEGEN_cudacpp_gg_tt_log.txt +++ b/epochX/cudacpp/gg_tt.sa/CODEGEN_cudacpp_gg_tt_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006091594696044922  +DEBUG: model prefixing takes 0.0018947124481201172  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,13 +153,13 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=2: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ WEIGHTED<=2 @1 INFO: Process has 3 diagrams -1 processes with 3 diagrams generated in 0.008 s +1 processes with 3 diagrams generated in 0.007 s Total: 1 processes with 3 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_gg_tt Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ WEIGHTED<=2 @1 INFO: Processing color information for process: g g > t t~ @1 @@ -166,30 +168,30 @@ INFO: Processing color information for process: g g > t t~ @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx/. -Generated helas calls for 1 subprocesses (3 diagrams) in 0.006 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/SubProcesses/P1_Sigma_sm_gg_ttx/. +Generated helas calls for 1 subprocesses (3 diagrams) in 0.005 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines -ALOHA: aloha creates 2 routines in 0.144 s +ALOHA: aloha creates 2 routines in 0.062 s VVV1 FFV1 FFV1 FFV1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_tt/src/. quit -real 0m0.544s -user 0m0.472s -sys 0m0.060s +real 0m1.240s +user 0m0.368s +sys 0m0.101s Code generation completed in 1 seconds diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/Bridge.h b/epochX/cudacpp/gg_tt.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_tt.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.cc b/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.cc index 5c7a133eed..ed4bdf6297 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.cc +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -552,7 +616,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -920,9 +986,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -930,7 +993,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -955,11 +1017,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -972,17 +1035,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1097,38 +1150,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1301,11 +1323,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.h b/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.h index feff1cc6e1..c0ba6c2f8c 100644 --- a/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.h +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.sa/src/HelAmps_sm.h b/epochX/cudacpp/gg_tt.sa/src/HelAmps_sm.h index febf1dcf42..c7283310f9 100644 --- a/epochX/cudacpp/gg_tt.sa/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_tt.sa/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.cc b/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.cc index d09f387480..c341b26e1e 100644 --- a/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.h b/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.h index ba434e7b98..1d880fe7d9 100644 --- a/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_tt.sa/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt01g.mad/CODEGEN_mad_gg_tt01g_log.txt b/epochX/cudacpp/gg_tt01g.mad/CODEGEN_mad_gg_tt01g_log.txt index 6466d14e6d..7fad274dea 100644 --- a/epochX/cudacpp/gg_tt01g.mad/CODEGEN_mad_gg_tt01g_log.txt +++ b/epochX/cudacpp/gg_tt01g.mad/CODEGEN_mad_gg_tt01g_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.00611424446105957  +DEBUG: model prefixing takes 0.0017981529235839844  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -164,16 +166,16 @@ Total: 2 processes with 19 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_gg_tt01g --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_gg_tt01g INFO: remove old information in CODEGEN_mad_gg_tt01g DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g WEIGHTED<=3 @2 INFO: Processing color information for process: g g > t t~ g @2 @@ -187,9 +189,9 @@ FileWriter t t~ g WEIGHTED<=3 @2 INFO: Finding symmetric diagrams for subprocess group gg_ttxg -DEBUG: len(subproc_diagrams_for_config) =  15 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  15 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gg_ttx DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -198,25 +200,25 @@ FileWriter t t~ WEIGHTED<=2 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttx -DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1552]  -Generated helas calls for 2 subprocesses (19 diagrams) in 0.043 s -Wrote files for 46 helas calls in 0.184 s +DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1563]  +Generated helas calls for 2 subprocesses (19 diagrams) in 0.020 s +Wrote files for 46 helas calls in 2.386 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 set of routines with options: P0 ALOHA: aloha creates VVVV3 set of routines with options: P0 ALOHA: aloha creates VVVV4 set of routines with options: P0 -ALOHA: aloha creates 5 routines in 0.322 s +ALOHA: aloha creates 5 routines in 0.180 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 set of routines with options: P0 ALOHA: aloha creates VVVV3 set of routines with options: P0 ALOHA: aloha creates VVVV4 set of routines with options: P0 -ALOHA: aloha creates 10 routines in 0.311 s +ALOHA: aloha creates 10 routines in 0.136 s VVV1 VVV1 FFV1 @@ -226,41 +228,43 @@ ALOHA: aloha creates 10 routines in 0.311 s VVVV1 VVVV3 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/SubProcesses/P1_gg_ttx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/SubProcesses/P1_gg_ttx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/SubProcesses/P2_gg_ttxg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/SubProcesses/P2_gg_ttxg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 243 (offset 16 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/README Run "open index.html" to see more information about this process. quit -real 0m2.583s -user 0m2.278s -sys 0m0.302s -Code generation completed in 3 seconds +real 0m7.842s +user 0m1.579s +sys 0m0.751s +Code generation completed in 8 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -273,7 +277,7 @@ Code generation completed in 3 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -281,10 +285,9 @@ Code generation completed in 3 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -303,7 +306,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -311,10 +314,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_tt01g/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/gg_tt01g.mad/Cards/me5_configuration.txt b/epochX/cudacpp/gg_tt01g.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/gg_tt01g.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/gg_tt01g.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/gg_tt01g.mad/Cards/proc_card_mg5.dat index e50becb2d9..5c24946480 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/gg_tt01g.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/gg_tt01g.mad/Cards/run_card.dat b/epochX/cudacpp/gg_tt01g.mad/Cards/run_card.dat index 1711d30371..d4c7c73e61 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Cards/run_card.dat +++ b/epochX/cudacpp/gg_tt01g.mad/Cards/run_card.dat @@ -125,6 +125,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_tt01g.mad/Cards/run_card_default.dat b/epochX/cudacpp/gg_tt01g.mad/Cards/run_card_default.dat index 364dbd21b0..730a05e322 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/gg_tt01g.mad/Cards/run_card_default.dat @@ -125,6 +125,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_tt01g.mad/MGMEVersion.txt b/epochX/cudacpp/gg_tt01g.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_tt01g.mad/MGMEVersion.txt +++ b/epochX/cudacpp/gg_tt01g.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt01g.mad/Source/alfas_functions.f b/epochX/cudacpp/gg_tt01g.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/gg_tt01g.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/gg_tt01g.mad/Source/cuts.inc b/epochX/cudacpp/gg_tt01g.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Source/cuts.inc +++ b/epochX/cudacpp/gg_tt01g.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/gg_tt01g.mad/Source/make_opts b/epochX/cudacpp/gg_tt01g.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Source/make_opts +++ b/epochX/cudacpp/gg_tt01g.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/gg_tt01g.mad/Source/makefile b/epochX/cudacpp/gg_tt01g.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Source/makefile +++ b/epochX/cudacpp/gg_tt01g.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/gg_tt01g.mad/Source/run_card.inc b/epochX/cudacpp/gg_tt01g.mad/Source/run_card.inc index 2588190439..e169c1f193 100644 --- a/epochX/cudacpp/gg_tt01g.mad/Source/run_card.inc +++ b/epochX/cudacpp/gg_tt01g.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/Bridge.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc index b32f4b931e..7387ab4335 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -335,8 +399,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[2], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -349,8 +416,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[4], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -362,8 +432,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[4], w_fp[2], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -555,7 +628,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -923,9 +998,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -933,7 +1005,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -958,11 +1029,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -975,17 +1047,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1100,38 +1162,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1304,11 +1335,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.h index feff1cc6e1..c0ba6c2f8c 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.h +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig.f index bc9bcfeb9b..5d6ef2ba62 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f index db3c284caa..f46e9bfaf0 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/matrix1.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/matrix1.f index 707ea40323..e6ca6093c7 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/matrix1.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -307,7 +307,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -350,7 +350,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -393,11 +394,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /5.333333333333333D+00, - $ -6.666666666666666D-01/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 2) /16,-4/ C 1 T(1,2,3,4) - DATA (CF(I, 2),I= 1, 2) /-6.666666666666666D-01 - $ ,5.333333333333333D+00/ + DATA (CF(I),I= 3, 3) /16/ C 1 T(2,1,3,4) C ---------- C BEGIN CODE @@ -446,10 +446,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -458,6 +460,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.cc b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.cc index c8b3dbf03c..f0f6679753 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.cc +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -338,8 +402,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 VVV1_0( w_fp[5], w_fp[6], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; jamp_sv[2] += amp_sv[0]; @@ -354,8 +421,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[7], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -368,8 +438,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[8], w_fp[2], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -383,8 +456,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[9], w_fp[5], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -396,8 +472,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[3], w_fp[5], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -410,8 +489,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[8], w_fp[5], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -424,8 +506,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[5], w_fp[11], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; @@ -437,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[5], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -451,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[5], w_fp[7], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; @@ -464,8 +555,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[3], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -478,8 +572,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[9], w_fp[2], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -492,8 +589,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 VVV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -508,8 +608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[8], w_fp[11], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; @@ -521,8 +624,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[9], w_fp[7], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; @@ -534,8 +640,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[0], w_fp[10], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -774,7 +883,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1144,9 +1255,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1154,7 +1262,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1179,11 +1286,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1196,17 +1304,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1321,38 +1419,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1525,11 +1592,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.h index b583fc85fe..97e301eb5a 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.h +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig.f index 8843b88a23..8c42969338 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig1.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig1.f index b22dde0f92..13aa155096 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig1.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix1.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix1.f index 7d44ae130e..cbadd0f13d 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix1.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -323,7 +323,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -366,7 +366,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(9) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -409,33 +410,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /7.111111111111111D+00, - $ -8.888888888888888D-01,-8.888888888888888D-01 - $ ,1.111111111111111D-01,1.111111111111111D-01,1.111111111111111D - $ +00/ + DATA DENOM/9/ + DATA (CF(I),I= 1, 6) /64,-16,-16,2,2,20/ C 1 T(1,2,5,3,4) - DATA (CF(I, 2),I= 1, 6) /-8.888888888888888D-01 - $ ,7.111111111111111D+00,1.111111111111111D-01,1.111111111111111D - $ +00,-8.888888888888888D-01,1.111111111111111D-01/ + DATA (CF(I),I= 7, 11) /64,2,20,-16,2/ C 1 T(1,5,2,3,4) - DATA (CF(I, 3),I= 1, 6) /-8.888888888888888D-01 - $ ,1.111111111111111D-01,7.111111111111111D+00, - $ -8.888888888888888D-01,1.111111111111111D+00,1.111111111111111D - $ -01/ + DATA (CF(I),I= 12, 15) /64,-16,20,2/ C 1 T(2,1,5,3,4) - DATA (CF(I, 4),I= 1, 6) /1.111111111111111D-01 - $ ,1.111111111111111D+00,-8.888888888888888D-01 - $ ,7.111111111111111D+00,1.111111111111111D-01, - $ -8.888888888888888D-01/ + DATA (CF(I),I= 16, 18) /64,2,-16/ C 1 T(2,5,1,3,4) - DATA (CF(I, 5),I= 1, 6) /1.111111111111111D-01, - $ -8.888888888888888D-01,1.111111111111111D+00,1.111111111111111D - $ -01,7.111111111111111D+00,-8.888888888888888D-01/ + DATA (CF(I),I= 19, 20) /64,-16/ C 1 T(5,1,2,3,4) - DATA (CF(I, 6),I= 1, 6) /1.111111111111111D+00 - $ ,1.111111111111111D-01,1.111111111111111D-01, - $ -8.888888888888888D-01,-8.888888888888888D-01 - $ ,7.111111111111111D+00/ + DATA (CF(I),I= 21, 21) /64/ C 1 T(5,2,1,3,4) C ---------- C BEGIN CODE @@ -549,10 +535,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -561,6 +549,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/cuts.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/genps.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/myamp.f b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/banner.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/banner.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/check_param_card.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/file_writers.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/files.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/files.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/histograms.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/restore_data b/epochX/cudacpp/gg_tt01g.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/restore_data +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/sum_html.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/gg_tt01g.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/gg_tt01g.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/gg_tt01g.mad/bin/madevent b/epochX/cudacpp/gg_tt01g.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/gg_tt01g.mad/bin/madevent +++ b/epochX/cudacpp/gg_tt01g.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/gg_tt01g.mad/src/HelAmps_sm.h b/epochX/cudacpp/gg_tt01g.mad/src/HelAmps_sm.h index ff9f0d7f00..63bc46f8b9 100644 --- a/epochX/cudacpp/gg_tt01g.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_tt01g.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.cc b/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.h b/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_tt01g.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.mad/CODEGEN_mad_gg_ttg_log.txt b/epochX/cudacpp/gg_ttg.mad/CODEGEN_mad_gg_ttg_log.txt index c216de0edd..21a520c613 100644 --- a/epochX/cudacpp/gg_ttg.mad/CODEGEN_mad_gg_ttg_log.txt +++ b/epochX/cudacpp/gg_ttg.mad/CODEGEN_mad_gg_ttg_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ g No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006003379821777344  +DEBUG: model prefixing takes 0.0018248558044433594  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,21 +153,21 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=3: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ g WEIGHTED<=3 @1 INFO: Process has 16 diagrams -1 processes with 16 diagrams generated in 0.021 s +1 processes with 16 diagrams generated in 0.012 s Total: 1 processes with 16 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_gg_ttg --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_gg_ttg INFO: remove old information in CODEGEN_mad_gg_ttg DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g WEIGHTED<=3 @1 INFO: Processing color information for process: g g > t t~ g @1 @@ -177,25 +179,25 @@ FileWriter t t~ g WEIGHTED<=3 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttxg -DEBUG: len(subproc_diagrams_for_config) =  15 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1552]  -Generated helas calls for 1 subprocesses (16 diagrams) in 0.037 s -Wrote files for 36 helas calls in 0.123 s +DEBUG: len(subproc_diagrams_for_config) =  15 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1563]  +Generated helas calls for 1 subprocesses (16 diagrams) in 0.015 s +Wrote files for 36 helas calls in 1.505 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 set of routines with options: P0 ALOHA: aloha creates VVVV3 set of routines with options: P0 ALOHA: aloha creates VVVV4 set of routines with options: P0 -ALOHA: aloha creates 5 routines in 0.331 s +ALOHA: aloha creates 5 routines in 0.181 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 set of routines with options: P0 ALOHA: aloha creates VVVV3 set of routines with options: P0 ALOHA: aloha creates VVVV4 set of routines with options: P0 -ALOHA: aloha creates 10 routines in 0.310 s +ALOHA: aloha creates 10 routines in 0.138 s VVV1 VVV1 FFV1 @@ -205,38 +207,40 @@ ALOHA: aloha creates 10 routines in 0.310 s VVVV1 VVVV3 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/SubProcesses/P1_gg_ttxg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/SubProcesses/P1_gg_ttxg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 243 (offset 16 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/README Run "open index.html" to see more information about this process. quit -real 0m2.439s -user 0m2.135s -sys 0m0.297s -Code generation completed in 2 seconds +real 0m6.976s +user 0m1.417s +sys 0m0.709s +Code generation completed in 7 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -249,7 +253,7 @@ Code generation completed in 2 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -257,10 +261,9 @@ Code generation completed in 2 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -279,7 +282,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -287,10 +290,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttg/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/gg_ttg.mad/Cards/me5_configuration.txt b/epochX/cudacpp/gg_ttg.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/gg_ttg.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/gg_ttg.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/gg_ttg.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/gg_ttg.mad/Cards/proc_card_mg5.dat index 3ace6e558c..ebd9e0f23b 100644 --- a/epochX/cudacpp/gg_ttg.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/gg_ttg.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/gg_ttg.mad/Cards/run_card.dat b/epochX/cudacpp/gg_ttg.mad/Cards/run_card.dat index d087670827..a16ea5dee6 100644 --- a/epochX/cudacpp/gg_ttg.mad/Cards/run_card.dat +++ b/epochX/cudacpp/gg_ttg.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_ttg.mad/Cards/run_card_default.dat b/epochX/cudacpp/gg_ttg.mad/Cards/run_card_default.dat index 43e93cbf40..cdcd77f36d 100644 --- a/epochX/cudacpp/gg_ttg.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/gg_ttg.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_ttg.mad/MGMEVersion.txt b/epochX/cudacpp/gg_ttg.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_ttg.mad/MGMEVersion.txt +++ b/epochX/cudacpp/gg_ttg.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttg.mad/Source/alfas_functions.f b/epochX/cudacpp/gg_ttg.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/gg_ttg.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/gg_ttg.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/gg_ttg.mad/Source/cuts.inc b/epochX/cudacpp/gg_ttg.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/gg_ttg.mad/Source/cuts.inc +++ b/epochX/cudacpp/gg_ttg.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/gg_ttg.mad/Source/make_opts b/epochX/cudacpp/gg_ttg.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/gg_ttg.mad/Source/make_opts +++ b/epochX/cudacpp/gg_ttg.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/gg_ttg.mad/Source/makefile b/epochX/cudacpp/gg_ttg.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/gg_ttg.mad/Source/makefile +++ b/epochX/cudacpp/gg_ttg.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/gg_ttg.mad/Source/run_card.inc b/epochX/cudacpp/gg_ttg.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/gg_ttg.mad/Source/run_card.inc +++ b/epochX/cudacpp/gg_ttg.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/Bridge.h b/epochX/cudacpp/gg_ttg.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_ttg.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc index 5de1c626c8..cd559e5714 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -338,8 +402,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 VVV1_0( w_fp[5], w_fp[6], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; jamp_sv[2] += amp_sv[0]; @@ -354,8 +421,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[7], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -368,8 +438,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[8], w_fp[2], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -383,8 +456,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[9], w_fp[5], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -396,8 +472,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[3], w_fp[5], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -410,8 +489,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[8], w_fp[5], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -424,8 +506,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[5], w_fp[11], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; @@ -437,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[5], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -451,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[5], w_fp[7], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; @@ -464,8 +555,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[3], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -478,8 +572,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[9], w_fp[2], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -492,8 +589,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 VVV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -508,8 +608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[8], w_fp[11], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; @@ -521,8 +624,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[9], w_fp[7], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; @@ -534,8 +640,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[0], w_fp[10], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -774,7 +883,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1144,9 +1255,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1154,7 +1262,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1179,11 +1286,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1196,17 +1304,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1321,38 +1419,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1525,11 +1592,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h index 2acfa000a7..f052d1a725 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f index 10496aa04d..b25c70108f 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f index 7c8695090c..ef24864bf5 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix1.f b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix1.f index 797b19405d..c0a032fb9f 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix1.f +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -323,7 +323,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -366,7 +366,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(9) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -409,33 +410,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /7.111111111111111D+00, - $ -8.888888888888888D-01,-8.888888888888888D-01 - $ ,1.111111111111111D-01,1.111111111111111D-01,1.111111111111111D - $ +00/ + DATA DENOM/9/ + DATA (CF(I),I= 1, 6) /64,-16,-16,2,2,20/ C 1 T(1,2,5,3,4) - DATA (CF(I, 2),I= 1, 6) /-8.888888888888888D-01 - $ ,7.111111111111111D+00,1.111111111111111D-01,1.111111111111111D - $ +00,-8.888888888888888D-01,1.111111111111111D-01/ + DATA (CF(I),I= 7, 11) /64,2,20,-16,2/ C 1 T(1,5,2,3,4) - DATA (CF(I, 3),I= 1, 6) /-8.888888888888888D-01 - $ ,1.111111111111111D-01,7.111111111111111D+00, - $ -8.888888888888888D-01,1.111111111111111D+00,1.111111111111111D - $ -01/ + DATA (CF(I),I= 12, 15) /64,-16,20,2/ C 1 T(2,1,5,3,4) - DATA (CF(I, 4),I= 1, 6) /1.111111111111111D-01 - $ ,1.111111111111111D+00,-8.888888888888888D-01 - $ ,7.111111111111111D+00,1.111111111111111D-01, - $ -8.888888888888888D-01/ + DATA (CF(I),I= 16, 18) /64,2,-16/ C 1 T(2,5,1,3,4) - DATA (CF(I, 5),I= 1, 6) /1.111111111111111D-01, - $ -8.888888888888888D-01,1.111111111111111D+00,1.111111111111111D - $ -01,7.111111111111111D+00,-8.888888888888888D-01/ + DATA (CF(I),I= 19, 20) /64,-16/ C 1 T(5,1,2,3,4) - DATA (CF(I, 6),I= 1, 6) /1.111111111111111D+00 - $ ,1.111111111111111D-01,1.111111111111111D-01, - $ -8.888888888888888D-01,-8.888888888888888D-01 - $ ,7.111111111111111D+00/ + DATA (CF(I),I= 21, 21) /64/ C 1 T(5,2,1,3,4) C ---------- C BEGIN CODE @@ -549,10 +535,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -561,6 +549,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/cuts.f b/epochX/cudacpp/gg_ttg.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/genps.f b/epochX/cudacpp/gg_ttg.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/myamp.f b/epochX/cudacpp/gg_ttg.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/gg_ttg.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/banner.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/banner.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/check_param_card.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/file_writers.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/files.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/files.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/histograms.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/restore_data b/epochX/cudacpp/gg_ttg.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/restore_data +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/sum_html.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/gg_ttg.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/gg_ttg.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/gg_ttg.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/gg_ttg.mad/bin/madevent b/epochX/cudacpp/gg_ttg.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/gg_ttg.mad/bin/madevent +++ b/epochX/cudacpp/gg_ttg.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/gg_ttg.mad/src/HelAmps_sm.h b/epochX/cudacpp/gg_ttg.mad/src/HelAmps_sm.h index ff9f0d7f00..63bc46f8b9 100644 --- a/epochX/cudacpp/gg_ttg.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_ttg.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.cc b/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.h b/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_ttg.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.sa/CODEGEN_cudacpp_gg_ttg_log.txt b/epochX/cudacpp/gg_ttg.sa/CODEGEN_cudacpp_gg_ttg_log.txt index 882c93c3a5..c431fd81b5 100644 --- a/epochX/cudacpp/gg_ttg.sa/CODEGEN_cudacpp_gg_ttg_log.txt +++ b/epochX/cudacpp/gg_ttg.sa/CODEGEN_cudacpp_gg_ttg_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ g No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006311178207397461  +DEBUG: model prefixing takes 0.0017962455749511719  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,13 +153,13 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=3: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ g WEIGHTED<=3 @1 INFO: Process has 16 diagrams -1 processes with 16 diagrams generated in 0.022 s +1 processes with 16 diagrams generated in 0.012 s Total: 1 processes with 16 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_gg_ttg Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g WEIGHTED<=3 @1 INFO: Processing color information for process: g g > t t~ g @1 @@ -166,18 +168,18 @@ INFO: Processing color information for process: g g > t t~ g @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg/. -Generated helas calls for 1 subprocesses (16 diagrams) in 0.037 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/SubProcesses/P1_Sigma_sm_gg_ttxg/. +Generated helas calls for 1 subprocesses (16 diagrams) in 0.015 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 set of routines with options: P0 ALOHA: aloha creates VVVV3 set of routines with options: P0 ALOHA: aloha creates VVVV4 set of routines with options: P0 -ALOHA: aloha creates 5 routines in 0.323 s +ALOHA: aloha creates 5 routines in 0.148 s VVV1 VVV1 FFV1 @@ -187,17 +189,17 @@ ALOHA: aloha creates 5 routines in 0.323 s VVVV1 VVVV3 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttg/src/. quit -real 0m0.791s -user 0m0.727s -sys 0m0.049s -Code generation completed in 0 seconds +real 0m1.371s +user 0m0.430s +sys 0m0.115s +Code generation completed in 1 seconds diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/Bridge.h b/epochX/cudacpp/gg_ttg.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_ttg.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.cc b/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.cc index bf77ac9970..c2cee023ce 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.cc +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -768,7 +832,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1138,9 +1204,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1148,7 +1211,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1173,11 +1235,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1190,17 +1253,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1315,38 +1368,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1519,11 +1541,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.h b/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.h index 2acfa000a7..f052d1a725 100644 --- a/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.h +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.sa/src/HelAmps_sm.h b/epochX/cudacpp/gg_ttg.sa/src/HelAmps_sm.h index ff9f0d7f00..63bc46f8b9 100644 --- a/epochX/cudacpp/gg_ttg.sa/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_ttg.sa/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.cc b/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.h b/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_ttg.sa/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.mad/CODEGEN_mad_gg_ttgg_log.txt b/epochX/cudacpp/gg_ttgg.mad/CODEGEN_mad_gg_ttgg_log.txt index 78cdfd68b2..fbb332dbfc 100644 --- a/epochX/cudacpp/gg_ttgg.mad/CODEGEN_mad_gg_ttgg_log.txt +++ b/epochX/cudacpp/gg_ttgg.mad/CODEGEN_mad_gg_ttgg_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ g g No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006547212600708008  +DEBUG: model prefixing takes 0.0018839836120605469  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,21 +153,21 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=4: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ g g WEIGHTED<=4 @1 INFO: Process has 123 diagrams -1 processes with 123 diagrams generated in 0.171 s +1 processes with 123 diagrams generated in 0.078 s Total: 1 processes with 123 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_gg_ttgg --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_gg_ttgg INFO: remove old information in CODEGEN_mad_gg_ttgg DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g g WEIGHTED<=4 @1 INFO: Processing color information for process: g g > t t~ g g @1 @@ -177,25 +179,25 @@ FileWriter t t~ g g WEIGHTED<=4 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttxgg -DEBUG: len(subproc_diagrams_for_config) =  105 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 30: 31, 31: 33, 32: 34, 33: 35, 34: 36, 35: 37, 36: 38, 37: 39, 38: 40, 39: 41, 40: 42, 41: 43, 42: 44, 43: 45, 44: 46, 45: 47, 46: 49, 47: 50, 48: 51, 49: 52, 50: 53, 51: 54, 52: 55, 53: 56, 54: 57, 55: 59, 56: 60, 57: 61, 58: 62, 59: 63, 60: 64, 61: 65, 62: 66, 63: 67, 64: 68, 65: 69, 66: 70, 67: 71, 68: 72, 69: 73, 70: 75, 71: 76, 72: 77, 73: 78, 74: 79, 75: 80, 76: 81, 77: 82, 78: 83, 79: 84, 80: 85, 81: 86, 82: 87, 83: 88, 84: 89, 85: 90, 86: 91, 87: 92, 88: 94, 89: 95, 90: 96, 91: 97, 92: 98, 93: 99, 94: 101, 95: 102, 96: 103, 97: 104, 98: 105, 99: 106, 100: 108, 101: 109, 102: 110, 103: 111, 104: 112, 105: 113} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 29, 31: 30, 33: 31, 34: 32, 35: 33, 36: 34, 37: 35, 38: 36, 39: 37, 40: 38, 41: 39, 42: 40, 43: 41, 44: 42, 45: 43, 46: 44, 47: 45, 49: 46, 50: 47, 51: 48, 52: 49, 53: 50, 54: 51, 55: 52, 56: 53, 57: 54, 59: 55, 60: 56, 61: 57, 62: 58, 63: 59, 64: 60, 65: 61, 66: 62, 67: 63, 68: 64, 69: 65, 70: 66, 71: 67, 72: 68, 73: 69, 75: 70, 76: 71, 77: 72, 78: 73, 79: 74, 80: 75, 81: 76, 82: 77, 83: 78, 84: 79, 85: 80, 86: 81, 87: 82, 88: 83, 89: 84, 90: 85, 91: 86, 92: 87, 94: 88, 95: 89, 96: 90, 97: 91, 98: 92, 99: 93, 101: 94, 102: 95, 103: 96, 104: 97, 105: 98, 106: 99, 108: 100, 109: 101, 110: 102, 111: 103, 112: 104, 113: 105} [model_handling.py at line 1552]  -Generated helas calls for 1 subprocesses (123 diagrams) in 0.423 s -Wrote files for 222 helas calls in 0.660 s +DEBUG: len(subproc_diagrams_for_config) =  105 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 30: 31, 31: 33, 32: 34, 33: 35, 34: 36, 35: 37, 36: 38, 37: 39, 38: 40, 39: 41, 40: 42, 41: 43, 42: 44, 43: 45, 44: 46, 45: 47, 46: 49, 47: 50, 48: 51, 49: 52, 50: 53, 51: 54, 52: 55, 53: 56, 54: 57, 55: 59, 56: 60, 57: 61, 58: 62, 59: 63, 60: 64, 61: 65, 62: 66, 63: 67, 64: 68, 65: 69, 66: 70, 67: 71, 68: 72, 69: 73, 70: 75, 71: 76, 72: 77, 73: 78, 74: 79, 75: 80, 76: 81, 77: 82, 78: 83, 79: 84, 80: 85, 81: 86, 82: 87, 83: 88, 84: 89, 85: 90, 86: 91, 87: 92, 88: 94, 89: 95, 90: 96, 91: 97, 92: 98, 93: 99, 94: 101, 95: 102, 96: 103, 97: 104, 98: 105, 99: 106, 100: 108, 101: 109, 102: 110, 103: 111, 104: 112, 105: 113} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 29, 31: 30, 33: 31, 34: 32, 35: 33, 36: 34, 37: 35, 38: 36, 39: 37, 40: 38, 41: 39, 42: 40, 43: 41, 44: 42, 45: 43, 46: 44, 47: 45, 49: 46, 50: 47, 51: 48, 52: 49, 53: 50, 54: 51, 55: 52, 56: 53, 57: 54, 59: 55, 60: 56, 61: 57, 62: 58, 63: 59, 64: 60, 65: 61, 66: 62, 67: 63, 68: 64, 69: 65, 70: 66, 71: 67, 72: 68, 73: 69, 75: 70, 76: 71, 77: 72, 78: 73, 79: 74, 80: 75, 81: 76, 82: 77, 83: 78, 84: 79, 85: 80, 86: 81, 87: 82, 88: 83, 89: 84, 90: 85, 91: 86, 92: 87, 94: 88, 95: 89, 96: 90, 97: 91, 98: 92, 99: 93, 101: 94, 102: 95, 103: 96, 104: 97, 105: 98, 106: 99, 108: 100, 109: 101, 110: 102, 111: 103, 112: 104, 113: 105} [model_handling.py at line 1563]  +Generated helas calls for 1 subprocesses (123 diagrams) in 0.155 s +Wrote files for 222 helas calls in 3.252 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 5 routines in 0.328 s +ALOHA: aloha creates 5 routines in 0.171 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 10 routines in 0.313 s +ALOHA: aloha creates 10 routines in 0.144 s VVV1 VVV1 FFV1 @@ -208,38 +210,40 @@ ALOHA: aloha creates 10 routines in 0.313 s VVVV3 VVVV4 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/SubProcesses/P1_gg_ttxgg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/SubProcesses/P1_gg_ttxgg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 275 (offset 48 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/README Run "open index.html" to see more information about this process. quit -real 0m4.934s -user 0m3.516s -sys 0m0.277s -Code generation completed in 5 seconds +real 0m8.933s +user 0m2.005s +sys 0m0.670s +Code generation completed in 9 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -252,7 +256,7 @@ Code generation completed in 5 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -260,10 +264,9 @@ Code generation completed in 5 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -282,7 +285,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -290,10 +293,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttgg/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/gg_ttgg.mad/Cards/me5_configuration.txt b/epochX/cudacpp/gg_ttgg.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/gg_ttgg.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/gg_ttgg.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/gg_ttgg.mad/Cards/proc_card_mg5.dat index 1fa5e235b3..83737ef020 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/gg_ttgg.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/gg_ttgg.mad/Cards/run_card.dat b/epochX/cudacpp/gg_ttgg.mad/Cards/run_card.dat index ecdc7fd25c..964b954d74 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Cards/run_card.dat +++ b/epochX/cudacpp/gg_ttgg.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_ttgg.mad/Cards/run_card_default.dat b/epochX/cudacpp/gg_ttgg.mad/Cards/run_card_default.dat index 7ec841d6c2..308f5bed4f 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/gg_ttgg.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_ttgg.mad/MGMEVersion.txt b/epochX/cudacpp/gg_ttgg.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_ttgg.mad/MGMEVersion.txt +++ b/epochX/cudacpp/gg_ttgg.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttgg.mad/Source/alfas_functions.f b/epochX/cudacpp/gg_ttgg.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/gg_ttgg.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/gg_ttgg.mad/Source/cuts.inc b/epochX/cudacpp/gg_ttgg.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Source/cuts.inc +++ b/epochX/cudacpp/gg_ttgg.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/gg_ttgg.mad/Source/make_opts b/epochX/cudacpp/gg_ttgg.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Source/make_opts +++ b/epochX/cudacpp/gg_ttgg.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/gg_ttgg.mad/Source/makefile b/epochX/cudacpp/gg_ttgg.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Source/makefile +++ b/epochX/cudacpp/gg_ttgg.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/gg_ttgg.mad/Source/run_card.inc b/epochX/cudacpp/gg_ttgg.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/gg_ttgg.mad/Source/run_card.inc +++ b/epochX/cudacpp/gg_ttgg.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/Bridge.h b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.cc b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.cc index c508e73f26..14cfeeef39 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.cc +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -374,8 +438,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 VVV1_0( w_fp[7], w_fp[5], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -394,8 +461,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[7], w_fp[4], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -414,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 VVV1_0( w_fp[6], w_fp[7], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -435,8 +508,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[12], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -449,8 +525,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[11], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -465,8 +544,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[13], w_fp[11], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -479,8 +561,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[12], w_fp[14], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -493,8 +578,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[3], w_fp[14], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -509,8 +597,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[15], w_fp[14], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -523,8 +614,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[15], w_fp[16], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -537,8 +631,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[15], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -553,8 +650,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[13], w_fp[16], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -567,8 +667,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[13], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -583,8 +686,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 FFV1_0( w_fp[3], w_fp[16], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -599,8 +705,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 FFV1_0( w_fp[12], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[17] -= amp_sv[0]; @@ -617,8 +726,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 17 FFV1_0( w_fp[16], w_fp[8], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 17 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[16] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; @@ -630,8 +742,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 FFV1_0( w_fp[16], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; @@ -643,8 +758,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 FFV1_0( w_fp[16], w_fp[12], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -658,8 +776,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV1_0( w_fp[6], w_fp[5], w_fp[17], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -674,8 +795,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 21 FFV1_0( w_fp[3], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 21 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[20] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -688,8 +812,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 FFV1_0( w_fp[13], w_fp[12], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -702,8 +829,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 VVV1_0( w_fp[18], w_fp[4], w_fp[17], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -718,8 +848,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 FFV1_0( w_fp[3], w_fp[8], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -732,8 +865,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 25 FFV1_0( w_fp[15], w_fp[12], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 25 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[24] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -746,8 +882,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[15], w_fp[19], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -759,8 +898,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[15], w_fp[9], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; @@ -772,8 +914,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 FFV1_0( w_fp[13], w_fp[19], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -785,8 +930,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[13], w_fp[8], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; @@ -798,8 +946,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 FFV1_0( w_fp[3], w_fp[19], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -812,8 +963,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 VVV1_0( w_fp[1], w_fp[10], w_fp[17], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -854,8 +1008,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[20], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] -= amp_sv[0]; @@ -867,8 +1024,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 34 FFV1_0( w_fp[21], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 34 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[33] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] -= amp_sv[0]; @@ -880,8 +1040,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 FFV1_0( w_fp[12], w_fp[9], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -894,8 +1057,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 VVV1_0( w_fp[6], w_fp[5], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -910,8 +1076,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 37 FFV1_0( w_fp[21], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 37 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[36] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -924,8 +1093,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 38 FFV1_0( w_fp[12], w_fp[14], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 38 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[37] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -938,8 +1110,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 39 VVV1_0( w_fp[18], w_fp[4], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 39 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[38] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -954,8 +1129,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 40 FFV1_0( w_fp[20], w_fp[2], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 40 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[39] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -968,8 +1146,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 41 FFV1_0( w_fp[12], w_fp[11], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 41 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[40] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -982,8 +1163,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 42 FFV1_0( w_fp[23], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 42 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[41] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] -= amp_sv[0]; @@ -995,8 +1179,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 43 FFV1_0( w_fp[21], w_fp[11], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 43 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[42] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] -= amp_sv[0]; @@ -1008,8 +1195,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 44 FFV1_0( w_fp[23], w_fp[14], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 44 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[43] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[23] -= amp_sv[0]; @@ -1021,8 +1211,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 45 FFV1_0( w_fp[20], w_fp[14], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 45 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[44] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] -= amp_sv[0]; @@ -1034,8 +1227,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 46 FFV1_0( w_fp[23], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 46 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[45] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1048,8 +1244,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 47 VVV1_0( w_fp[1], w_fp[10], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 47 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[46] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -1087,8 +1286,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 49 FFV1_0( w_fp[22], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 49 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[48] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1101,8 +1303,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 50 FFV1_0( w_fp[3], w_fp[9], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 50 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[49] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -1117,8 +1322,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 51 FFV1_0( w_fp[13], w_fp[9], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 51 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[50] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1131,8 +1339,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 52 FFV1_0( w_fp[16], w_fp[20], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 52 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[51] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1145,8 +1356,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 53 FFV1_0( w_fp[16], w_fp[2], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 53 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[52] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -1161,8 +1375,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 54 FFV1_0( w_fp[16], w_fp[14], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 54 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[53] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1175,8 +1392,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 55 FFV1_0( w_fp[3], w_fp[20], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 55 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[54] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[3] -= amp_sv[0]; @@ -1191,8 +1411,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 56 FFV1_0( w_fp[22], w_fp[2], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 56 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[55] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -1207,8 +1430,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 57 VVV1_0( w_fp[12], w_fp[18], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 57 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[56] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1261,8 +1487,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 59 VVV1_0( w_fp[7], w_fp[5], w_fp[21], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 59 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[58] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1281,8 +1510,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 60 VVV1_0( w_fp[1], w_fp[7], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 60 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[59] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1301,8 +1533,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 61 FFV1_0( w_fp[3], w_fp[14], w_fp[21], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 61 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[60] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -1317,8 +1552,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 62 FFV1_0( w_fp[22], w_fp[14], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 62 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[61] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1331,8 +1569,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 63 FFV1_0( w_fp[13], w_fp[2], w_fp[21], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 63 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[62] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -1347,8 +1588,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 64 FFV1_0( w_fp[13], w_fp[20], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 64 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[63] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1362,8 +1606,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 65 FFV1_0( w_fp[21], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 65 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[64] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1376,8 +1623,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 66 FFV1_0( w_fp[3], w_fp[9], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 66 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[65] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -1392,8 +1642,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 67 FFV1_0( w_fp[15], w_fp[9], w_fp[20], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 67 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[66] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1406,8 +1659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 68 FFV1_0( w_fp[16], w_fp[23], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 68 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[67] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1420,8 +1676,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 69 FFV1_0( w_fp[16], w_fp[2], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 69 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[68] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -1436,8 +1695,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 70 FFV1_0( w_fp[16], w_fp[11], w_fp[20], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 70 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[69] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[16] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1450,8 +1712,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 71 FFV1_0( w_fp[3], w_fp[23], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 71 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[70] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -1466,8 +1731,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 72 FFV1_0( w_fp[21], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 72 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[71] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[9] -= amp_sv[0]; @@ -1482,8 +1750,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 73 VVV1_0( w_fp[20], w_fp[6], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 73 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[72] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1536,8 +1807,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 75 VVV1_0( w_fp[7], w_fp[4], w_fp[12], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 75 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[74] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1556,8 +1830,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 76 VVV1_0( w_fp[1], w_fp[7], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 76 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[75] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1576,8 +1853,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 77 FFV1_0( w_fp[3], w_fp[11], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 77 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[76] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -1592,8 +1872,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 78 FFV1_0( w_fp[21], w_fp[11], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 78 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[77] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1606,8 +1889,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 79 FFV1_0( w_fp[15], w_fp[2], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 79 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[78] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -1622,8 +1908,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 80 FFV1_0( w_fp[15], w_fp[23], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 80 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[79] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1636,8 +1925,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 81 FFV1_0( w_fp[15], w_fp[23], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 81 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[80] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= amp_sv[0]; @@ -1649,8 +1941,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 82 FFV1_0( w_fp[12], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 82 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[81] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= amp_sv[0]; @@ -1662,8 +1957,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 83 FFV1_0( w_fp[13], w_fp[23], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 83 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[82] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= amp_sv[0]; @@ -1675,8 +1973,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 84 FFV1_0( w_fp[21], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 84 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[83] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= amp_sv[0]; @@ -1688,8 +1989,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 85 FFV1_0( w_fp[3], w_fp[23], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 85 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[84] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1702,8 +2006,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 86 FFV1_0( w_fp[3], w_fp[9], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 86 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[85] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -1718,8 +2025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 87 FFV1_0( w_fp[22], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 87 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[86] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= amp_sv[0]; @@ -1731,8 +2041,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 88 FFV1_0( w_fp[16], w_fp[20], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 88 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[87] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] -= amp_sv[0]; @@ -1744,8 +2057,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 89 FFV1_0( w_fp[22], w_fp[14], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 89 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[88] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] -= amp_sv[0]; @@ -1757,8 +2073,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 90 FFV1_0( w_fp[16], w_fp[24], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 90 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[89] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] -= amp_sv[0]; @@ -1770,8 +2089,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 91 FFV1_0( w_fp[22], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 91 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[90] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1784,8 +2106,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 92 FFV1_0( w_fp[16], w_fp[2], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 92 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[91] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -1834,8 +2159,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 94 VVV1_0( w_fp[7], w_fp[5], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 94 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[93] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1854,8 +2182,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 95 VVV1_0( w_fp[6], w_fp[5], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 95 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[94] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1874,8 +2205,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 96 FFV1_0( w_fp[3], w_fp[14], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 96 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[95] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[19] -= amp_sv[0]; @@ -1890,8 +2224,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 97 FFV1_0( w_fp[3], w_fp[24], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 97 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[96] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1904,8 +2241,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 98 FFV1_0( w_fp[13], w_fp[2], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 98 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[97] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -1920,8 +2260,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 99 FFV1_0( w_fp[21], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 99 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[98] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1968,8 +2311,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 101 VVV1_0( w_fp[7], w_fp[4], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 101 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[100] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1988,8 +2334,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 102 VVV1_0( w_fp[18], w_fp[4], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 102 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[101] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2008,8 +2357,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 103 FFV1_0( w_fp[3], w_fp[11], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 103 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[102] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -2024,8 +2376,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 104 FFV1_0( w_fp[3], w_fp[20], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 104 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[103] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2038,8 +2393,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 105 FFV1_0( w_fp[15], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 105 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[104] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[4] -= amp_sv[0]; @@ -2054,8 +2412,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 106 FFV1_0( w_fp[12], w_fp[2], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 106 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[105] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2102,8 +2463,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 108 VVV1_0( w_fp[1], w_fp[10], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 108 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[107] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2122,8 +2486,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 109 VVV1_0( w_fp[1], w_fp[7], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 109 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[108] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2142,8 +2509,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 110 FFV1_0( w_fp[13], w_fp[20], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 110 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[109] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= amp_sv[0]; @@ -2155,8 +2525,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 111 FFV1_0( w_fp[21], w_fp[11], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 111 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[110] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] -= amp_sv[0]; @@ -2168,8 +2541,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 112 FFV1_0( w_fp[15], w_fp[24], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 112 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[111] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= amp_sv[0]; @@ -2181,8 +2557,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 113 FFV1_0( w_fp[12], w_fp[14], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 113 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[112] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] -= amp_sv[0]; @@ -2718,7 +3097,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -3090,9 +3471,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -3100,7 +3478,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -3125,11 +3502,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -3142,17 +3520,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -3267,38 +3635,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -3471,11 +3808,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.h b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.h index 2b75e0f842..05b2f0ceaa 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.h +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig.f b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig.f index c087f3f747..91f78744cf 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig.f +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig1.f b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig1.f index ce5493be9b..d9ada568e2 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig1.f +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix1.f b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix1.f index 3ea53d8b21..5c9c38d121 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix1.f +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -355,7 +355,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -398,7 +398,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(155) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -441,397 +442,67 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ - DATA (CF(I, 1),I= 7, 12) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 1),I= 13, 18) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ - DATA (CF(I, 1),I= 19, 24) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ + DATA DENOM/54/ + DATA (CF(I),I= 1, 24) /512,-128,-128,16,16,160,-128,16,16,-2,-2 + $ ,-20,16,-2,160,-20,142,124,-2,-20,-20,124,124,-56/ C 1 T(1,2,5,6,3,4) - DATA (CF(I, 2),I= 1, 6) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ - DATA (CF(I, 2),I= 7, 12) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 2),I= 13, 18) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ - DATA (CF(I, 2),I= 19, 24) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ + DATA (CF(I),I= 25, 47) /512,16,160,-128,16,16,-128,-2,-20,16,-2, + $ -2,-20,-20,124,124,-56,16,-2,160,-20,142,124/ C 1 T(1,2,6,5,3,4) - DATA (CF(I, 3),I= 1, 6) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ - DATA (CF(I, 3),I= 7, 12) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ - DATA (CF(I, 3),I= 13, 18) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 3),I= 19, 24) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ + DATA (CF(I),I= 48, 69) /512,-128,160,16,16,-2,160,-20,142,124, + $ -128,16,16,-2,-2,-20,-20,-2,124,-56,-20,124/ C 1 T(1,5,2,6,3,4) - DATA (CF(I, 4),I= 1, 6) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 4),I= 7, 12) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ - DATA (CF(I, 4),I= 13, 18) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 4),I= 19, 24) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ + DATA (CF(I),I= 70, 90) /512,16,-128,-2,-20,-20,124,124,-56,16, + $ -128,-2,-20,16,-2,-2,16,142,124,160,-20/ C 1 T(1,5,6,2,3,4) - DATA (CF(I, 5),I= 1, 6) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ - DATA (CF(I, 5),I= 7, 12) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ - DATA (CF(I, 5),I= 13, 18) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 5),I= 19, 24) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ + DATA (CF(I),I= 91,110) /512,-128,-2,16,142,124,160,-20,-20,-2 + $ ,124,-56,-20,124,-128,16,16,-2,-2,-20/ C 1 T(1,6,2,5,3,4) - DATA (CF(I, 6),I= 1, 6) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ - DATA (CF(I, 6),I= 7, 12) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 6),I= 13, 18) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ - DATA (CF(I, 6),I= 19, 24) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ + DATA (CF(I),I=111,129) /512,-20,-2,124,-56,-20,124,-2,16,142,124 + $ ,160,-20,16,-128,-2,-20,16,-2/ C 1 T(1,6,5,2,3,4) - DATA (CF(I, 7),I= 1, 6) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 7),I= 7, 12) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ - DATA (CF(I, 7),I= 13, 18) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ - DATA (CF(I, 7),I= 19, 24) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ + DATA (CF(I),I=130,147) /512,-128,-128,16,16,160,160,-20,16,-2 + $ ,124,142,-20,124,-2,-20,-56,124/ C 1 T(2,1,5,6,3,4) - DATA (CF(I, 8),I= 1, 6) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 8),I= 7, 12) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ - DATA (CF(I, 8),I= 13, 18) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 8),I= 19, 24) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ + DATA (CF(I),I=148,164) /512,16,160,-128,16,-20,124,-2,-20,-56 + $ ,124,160,-20,16,-2,124,142/ C 1 T(2,1,6,5,3,4) - DATA (CF(I, 9),I= 1, 6) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ - DATA (CF(I, 9),I= 7, 12) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ - DATA (CF(I, 9),I= 13, 18) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 9),I= 19, 24) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ + DATA (CF(I),I=165,180) /512,-128,160,16,16,-2,-128,16,-20,-2,124 + $ ,-56,-20,-2,124,-20/ C 1 T(2,5,1,6,3,4) - DATA (CF(I, 10),I= 1, 6) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ - DATA (CF(I, 10),I= 7, 12) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 10),I= 13, 18) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 10),I= 19, 24) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ + DATA (CF(I),I=181,195) /512,16,-128,-2,-20,16,-128,-2,16,142,124 + $ ,-2,16,-20,160/ C 1 T(2,5,6,1,3,4) - DATA (CF(I, 11),I= 1, 6) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ - DATA (CF(I, 11),I= 7, 12) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ - DATA (CF(I, 11),I= 13, 18) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ - DATA (CF(I, 11),I= 19, 24) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ + DATA (CF(I),I=196,209) /512,-128,124,-56,-20,-2,124,-20,16,-2, + $ -128,16,-20,-2/ C 1 T(2,6,1,5,3,4) - DATA (CF(I, 12),I= 1, 6) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 12),I= 7, 12) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ - DATA (CF(I, 12),I= 13, 18) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ - DATA (CF(I, 12),I= 19, 24) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ + DATA (CF(I),I=210,222) /512,142,124,-2,16,-20,160,-2,-20,16,-128 + $ ,-2,16/ C 1 T(2,6,5,1,3,4) - DATA (CF(I, 13),I= 1, 6) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 13),I= 7, 12) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ - DATA (CF(I, 13),I= 13, 18) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ - DATA (CF(I, 13),I= 19, 24) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ + DATA (CF(I),I=223,234) /512,-128,-128,16,16,160,124,-20,-56,124, + $ -2,-20/ C 1 T(5,1,2,6,3,4) - DATA (CF(I, 14),I= 1, 6) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 14),I= 7, 12) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 14),I= 13, 18) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ - DATA (CF(I, 14),I= 19, 24) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ + DATA (CF(I),I=235,245) /512,16,160,-128,16,-20,160,124,142,16,-2/ C 1 T(5,1,6,2,3,4) - DATA (CF(I, 15),I= 1, 6) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ - DATA (CF(I, 15),I= 7, 12) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 15),I= 13, 18) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ - DATA (CF(I, 15),I= 19, 24) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ + DATA (CF(I),I=246,255) /512,-128,160,16,-56,124,124,-20,-20,-2/ C 1 T(5,2,1,6,3,4) - DATA (CF(I, 16),I= 1, 6) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 16),I= 7, 12) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 16),I= 13, 18) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 16),I= 19, 24) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ + DATA (CF(I),I=256,264) /512,16,-128,124,142,-20,160,-2,16/ C 1 T(5,2,6,1,3,4) - DATA (CF(I, 17),I= 1, 6) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ - DATA (CF(I, 17),I= 7, 12) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ - DATA (CF(I, 17),I= 13, 18) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ - DATA (CF(I, 17),I= 19, 24) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ + DATA (CF(I),I=265,272) /512,-128,-2,16,-20,-2,-128,16/ C 1 T(5,6,1,2,3,4) - DATA (CF(I, 18),I= 1, 6) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ - DATA (CF(I, 18),I= 7, 12) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ - DATA (CF(I, 18),I= 13, 18) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ - DATA (CF(I, 18),I= 19, 24) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ + DATA (CF(I),I=273,279) /512,-20,-2,-2,16,16,-128/ C 1 T(5,6,2,1,3,4) - DATA (CF(I, 19),I= 1, 6) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ - DATA (CF(I, 19),I= 7, 12) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ - DATA (CF(I, 19),I= 13, 18) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 19),I= 19, 24) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ + DATA (CF(I),I=280,285) /512,-128,-128,16,16,160/ C 1 T(6,1,2,5,3,4) - DATA (CF(I, 20),I= 1, 6) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 20),I= 7, 12) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 20),I= 13, 18) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ - DATA (CF(I, 20),I= 19, 24) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ + DATA (CF(I),I=286,290) /512,16,160,-128,16/ C 1 T(6,1,5,2,3,4) - DATA (CF(I, 21),I= 1, 6) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ - DATA (CF(I, 21),I= 7, 12) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ - DATA (CF(I, 21),I= 13, 18) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 21),I= 19, 24) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ + DATA (CF(I),I=291,294) /512,-128,160,16/ C 1 T(6,2,1,5,3,4) - DATA (CF(I, 22),I= 1, 6) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 22),I= 7, 12) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 22),I= 13, 18) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 22),I= 19, 24) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ + DATA (CF(I),I=295,297) /512,16,-128/ C 1 T(6,2,5,1,3,4) - DATA (CF(I, 23),I= 1, 6) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 23),I= 7, 12) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 23),I= 13, 18) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ - DATA (CF(I, 23),I= 19, 24) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ + DATA (CF(I),I=298,299) /512,-128/ C 1 T(6,5,1,2,3,4) - DATA (CF(I, 24),I= 1, 6) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 24),I= 7, 12) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 24),I= 13, 18) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 24),I= 19, 24) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ + DATA (CF(I),I=300,300) /512/ C 1 T(6,5,2,1,3,4) C ---------- C BEGIN CODE @@ -1547,10 +1218,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -1559,6 +1232,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(2)=AMP2(2)+AMP(4)*DCONJG(AMP(4)) diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/cuts.f b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/genps.f b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/myamp.f b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/banner.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/banner.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/check_param_card.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/file_writers.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/files.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/files.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/histograms.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/restore_data b/epochX/cudacpp/gg_ttgg.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/restore_data +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/sum_html.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/gg_ttgg.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/gg_ttgg.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/gg_ttgg.mad/bin/madevent b/epochX/cudacpp/gg_ttgg.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/gg_ttgg.mad/bin/madevent +++ b/epochX/cudacpp/gg_ttgg.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/gg_ttgg.mad/src/HelAmps_sm.h b/epochX/cudacpp/gg_ttgg.mad/src/HelAmps_sm.h index 53dd560ed6..921ace57e7 100644 --- a/epochX/cudacpp/gg_ttgg.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_ttgg.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.cc b/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.h b/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_ttgg.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.sa/CODEGEN_cudacpp_gg_ttgg_log.txt b/epochX/cudacpp/gg_ttgg.sa/CODEGEN_cudacpp_gg_ttgg_log.txt index 7e5a3007eb..7b2cecbb01 100644 --- a/epochX/cudacpp/gg_ttgg.sa/CODEGEN_cudacpp_gg_ttgg_log.txt +++ b/epochX/cudacpp/gg_ttgg.sa/CODEGEN_cudacpp_gg_ttgg_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ g g No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.0059185028076171875  +DEBUG: model prefixing takes 0.0019252300262451172  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,13 +153,13 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=4: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ g g WEIGHTED<=4 @1 INFO: Process has 123 diagrams -1 processes with 123 diagrams generated in 0.156 s +1 processes with 123 diagrams generated in 0.065 s Total: 1 processes with 123 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_gg_ttgg Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g g WEIGHTED<=4 @1 INFO: Processing color information for process: g g > t t~ g g @1 @@ -166,18 +168,18 @@ INFO: Processing color information for process: g g > t t~ g g @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg/. -Generated helas calls for 1 subprocesses (123 diagrams) in 0.422 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/SubProcesses/P1_Sigma_sm_gg_ttxgg/. +Generated helas calls for 1 subprocesses (123 diagrams) in 0.166 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 5 routines in 0.316 s +ALOHA: aloha creates 5 routines in 0.150 s VVV1 VVV1 FFV1 @@ -190,17 +192,17 @@ ALOHA: aloha creates 5 routines in 0.316 s VVVV3 VVVV4 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttgg/src/. quit -real 0m1.455s -user 0m1.362s -sys 0m0.060s +real 0m1.784s +user 0m0.725s +sys 0m0.134s Code generation completed in 1 seconds diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/Bridge.h b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.cc b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.cc index 5956559974..87e7972438 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.cc +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -2775,7 +2839,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -3147,9 +3213,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -3157,7 +3220,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -3182,11 +3244,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -3199,17 +3262,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -3324,38 +3377,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -3528,11 +3550,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.h b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.h index 2b75e0f842..05b2f0ceaa 100644 --- a/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.h +++ b/epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.sa/src/HelAmps_sm.h b/epochX/cudacpp/gg_ttgg.sa/src/HelAmps_sm.h index 53dd560ed6..921ace57e7 100644 --- a/epochX/cudacpp/gg_ttgg.sa/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_ttgg.sa/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.cc b/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.h b/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_ttgg.sa/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.mad/CODEGEN_mad_gg_ttggg_log.txt b/epochX/cudacpp/gg_ttggg.mad/CODEGEN_mad_gg_ttggg_log.txt index 1afa1ab2a5..be83997f88 100644 --- a/epochX/cudacpp/gg_ttggg.mad/CODEGEN_mad_gg_ttggg_log.txt +++ b/epochX/cudacpp/gg_ttggg.mad/CODEGEN_mad_gg_ttggg_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ g g g No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.005990028381347656  +DEBUG: model prefixing takes 0.0019114017486572266  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,27 +153,27 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=5: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ g g g WEIGHTED<=5 @1 INFO: Process has 1240 diagrams -1 processes with 1240 diagrams generated in 1.890 s +1 processes with 1240 diagrams generated in 0.749 s Total: 1 processes with 1240 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_gg_ttggg --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_gg_ttggg INFO: remove old information in CODEGEN_mad_gg_ttggg DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g g g WEIGHTED<=5 @1 INFO: Processing color information for process: g g > t t~ g g g @1 INFO: Creating files in directory P1_gg_ttxggg INFO: Computing Color-Flow optimization [15120 term] -INFO: Color-Flow passed to 1630 term in 8s. Introduce 3030 contraction +INFO: Color-Flow passed to 1630 term in 3s. Introduce 3030 contraction DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . FileWriter for ././CPPProcess.h @@ -179,25 +181,25 @@ FileWriter t t~ g g g WEIGHTED<=5 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttxggg -DEBUG: len(subproc_diagrams_for_config) =  945 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 4, 4: 5, 5: 7, 6: 8, 7: 14, 8: 15, 9: 16, 10: 18, 11: 19, 12: 20, 13: 22, 14: 23, 15: 24, 16: 26, 17: 27, 18: 28, 19: 29, 20: 30, 21: 31, 22: 33, 23: 34, 24: 35, 25: 36, 26: 37, 27: 38, 28: 39, 29: 40, 30: 41, 31: 42, 32: 43, 33: 44, 34: 45, 35: 46, 36: 47, 37: 49, 38: 50, 39: 51, 40: 52, 41: 53, 42: 54, 43: 55, 44: 56, 45: 57, 46: 58, 47: 59, 48: 60, 49: 61, 50: 62, 51: 63, 52: 65, 53: 66, 54: 67, 55: 68, 56: 69, 57: 70, 58: 71, 59: 72, 60: 73, 61: 74, 62: 75, 63: 76, 64: 77, 65: 78, 66: 79, 67: 81, 68: 82, 69: 83, 70: 84, 71: 85, 72: 86, 73: 87, 74: 88, 75: 89, 76: 91, 77: 92, 78: 93, 79: 94, 80: 95, 81: 96, 82: 97, 83: 98, 84: 99, 85: 101, 86: 102, 87: 103, 88: 104, 89: 105, 90: 106, 91: 107, 92: 108, 93: 109, 94: 110, 95: 111, 96: 112, 97: 113, 98: 114, 99: 115, 100: 116, 101: 117, 102: 118, 103: 119, 104: 120, 105: 121, 106: 124, 107: 125, 108: 126, 109: 127, 110: 128, 111: 129, 112: 130, 113: 131, 114: 132, 115: 133, 116: 134, 117: 135, 118: 136, 119: 137, 120: 138, 121: 140, 122: 141, 123: 143, 124: 144, 125: 145, 126: 146, 127: 147, 128: 148, 129: 149, 130: 150, 131: 151, 132: 152, 133: 153, 134: 154, 135: 155, 136: 156, 137: 157, 138: 159, 139: 160, 140: 161, 141: 162, 142: 163, 143: 164, 144: 165, 145: 166, 146: 167, 147: 168, 148: 169, 149: 170, 150: 171, 151: 172, 152: 173, 153: 175, 154: 176, 155: 177, 156: 178, 157: 179, 158: 180, 159: 181, 160: 182, 161: 183, 162: 184, 163: 185, 164: 186, 165: 187, 166: 188, 167: 189, 168: 190, 169: 191, 170: 192, 171: 193, 172: 194, 173: 195, 174: 196, 175: 197, 176: 198, 177: 199, 178: 200, 179: 201, 180: 202, 181: 203, 182: 204, 183: 205, 184: 206, 185: 207, 186: 208, 187: 209, 188: 210, 189: 211, 190: 212, 191: 213, 192: 214, 193: 215, 194: 216, 195: 217, 196: 218, 197: 220, 198: 221, 199: 222, 200: 223, 201: 224, 202: 225, 203: 227, 204: 228, 205: 229, 206: 230, 207: 231, 208: 232, 209: 234, 210: 235, 211: 247, 212: 248, 213: 249, 214: 250, 215: 251, 216: 252, 217: 253, 218: 254, 219: 255, 220: 256, 221: 257, 222: 258, 223: 259, 224: 260, 225: 261, 226: 263, 227: 264, 228: 266, 229: 267, 230: 268, 231: 269, 232: 270, 233: 271, 234: 272, 235: 273, 236: 274, 237: 275, 238: 276, 239: 277, 240: 278, 241: 279, 242: 280, 243: 282, 244: 283, 245: 284, 246: 285, 247: 286, 248: 287, 249: 288, 250: 289, 251: 290, 252: 291, 253: 292, 254: 293, 255: 294, 256: 295, 257: 296, 258: 298, 259: 299, 260: 300, 261: 301, 262: 302, 263: 303, 264: 304, 265: 305, 266: 306, 267: 307, 268: 308, 269: 309, 270: 310, 271: 311, 272: 312, 273: 313, 274: 314, 275: 315, 276: 316, 277: 317, 278: 318, 279: 319, 280: 320, 281: 321, 282: 322, 283: 323, 284: 324, 285: 325, 286: 326, 287: 327, 288: 328, 289: 329, 290: 330, 291: 331, 292: 332, 293: 333, 294: 334, 295: 335, 296: 336, 297: 337, 298: 338, 299: 339, 300: 340, 301: 341, 302: 343, 303: 344, 304: 345, 305: 346, 306: 347, 307: 348, 308: 350, 309: 351, 310: 352, 311: 353, 312: 354, 313: 355, 314: 357, 315: 358, 316: 370, 317: 371, 318: 372, 319: 373, 320: 374, 321: 375, 322: 377, 323: 378, 324: 379, 325: 380, 326: 381, 327: 382, 328: 383, 329: 384, 330: 385, 331: 386, 332: 387, 333: 388, 334: 389, 335: 390, 336: 391, 337: 393, 338: 394, 339: 395, 340: 396, 341: 397, 342: 398, 343: 399, 344: 400, 345: 401, 346: 402, 347: 403, 348: 404, 349: 405, 350: 406, 351: 407, 352: 409, 353: 410, 354: 411, 355: 412, 356: 413, 357: 414, 358: 415, 359: 416, 360: 417, 361: 418, 362: 419, 363: 420, 364: 421, 365: 422, 366: 423, 367: 425, 368: 426, 369: 427, 370: 428, 371: 429, 372: 430, 373: 431, 374: 432, 375: 433, 376: 434, 377: 435, 378: 437, 379: 438, 380: 440, 381: 441, 382: 447, 383: 448, 384: 449, 385: 450, 386: 451, 387: 452, 388: 453, 389: 454, 390: 455, 391: 457, 392: 458, 393: 459, 394: 460, 395: 461, 396: 462, 397: 463, 398: 464, 399: 465, 400: 467, 401: 468, 402: 469, 403: 470, 404: 471, 405: 472, 406: 473, 407: 474, 408: 475, 409: 477, 410: 478, 411: 479, 412: 480, 413: 481, 414: 482, 415: 484, 416: 485, 417: 486, 418: 487, 419: 488, 420: 489, 421: 493, 422: 494, 423: 495, 424: 496, 425: 497, 426: 498, 427: 500, 428: 501, 429: 502, 430: 503, 431: 504, 432: 505, 433: 506, 434: 507, 435: 508, 436: 509, 437: 510, 438: 511, 439: 512, 440: 513, 441: 514, 442: 516, 443: 517, 444: 518, 445: 519, 446: 520, 447: 521, 448: 522, 449: 523, 450: 524, 451: 525, 452: 526, 453: 527, 454: 528, 455: 529, 456: 530, 457: 532, 458: 533, 459: 534, 460: 535, 461: 536, 462: 537, 463: 538, 464: 539, 465: 540, 466: 541, 467: 542, 468: 543, 469: 544, 470: 545, 471: 546, 472: 548, 473: 549, 474: 550, 475: 551, 476: 552, 477: 553, 478: 554, 479: 555, 480: 556, 481: 557, 482: 558, 483: 560, 484: 561, 485: 563, 486: 564, 487: 570, 488: 571, 489: 572, 490: 573, 491: 574, 492: 575, 493: 576, 494: 577, 495: 578, 496: 580, 497: 581, 498: 582, 499: 583, 500: 584, 501: 585, 502: 586, 503: 587, 504: 588, 505: 590, 506: 591, 507: 592, 508: 593, 509: 594, 510: 595, 511: 596, 512: 597, 513: 598, 514: 600, 515: 601, 516: 602, 517: 603, 518: 604, 519: 605, 520: 607, 521: 608, 522: 609, 523: 610, 524: 611, 525: 612, 526: 616, 527: 617, 528: 618, 529: 619, 530: 620, 531: 621, 532: 623, 533: 624, 534: 625, 535: 626, 536: 627, 537: 628, 538: 629, 539: 630, 540: 631, 541: 632, 542: 633, 543: 634, 544: 635, 545: 636, 546: 637, 547: 639, 548: 640, 549: 641, 550: 642, 551: 643, 552: 644, 553: 645, 554: 646, 555: 647, 556: 648, 557: 649, 558: 650, 559: 651, 560: 652, 561: 653, 562: 655, 563: 656, 564: 657, 565: 658, 566: 659, 567: 660, 568: 661, 569: 662, 570: 663, 571: 664, 572: 665, 573: 666, 574: 667, 575: 668, 576: 669, 577: 671, 578: 672, 579: 673, 580: 674, 581: 675, 582: 676, 583: 677, 584: 678, 585: 679, 586: 680, 587: 681, 588: 683, 589: 684, 590: 686, 591: 687, 592: 693, 593: 694, 594: 695, 595: 696, 596: 697, 597: 698, 598: 699, 599: 700, 600: 701, 601: 703, 602: 704, 603: 705, 604: 706, 605: 707, 606: 708, 607: 709, 608: 710, 609: 711, 610: 713, 611: 714, 612: 715, 613: 716, 614: 717, 615: 718, 616: 719, 617: 720, 618: 721, 619: 723, 620: 724, 621: 725, 622: 726, 623: 727, 624: 728, 625: 730, 626: 731, 627: 732, 628: 733, 629: 734, 630: 735, 631: 739, 632: 740, 633: 741, 634: 742, 635: 743, 636: 744, 637: 745, 638: 746, 639: 747, 640: 748, 641: 749, 642: 750, 643: 751, 644: 752, 645: 753, 646: 754, 647: 755, 648: 756, 649: 757, 650: 758, 651: 759, 652: 760, 653: 761, 654: 762, 655: 763, 656: 764, 657: 765, 658: 766, 659: 767, 660: 768, 661: 769, 662: 770, 663: 771, 664: 773, 665: 774, 666: 775, 667: 776, 668: 777, 669: 778, 670: 780, 671: 781, 672: 782, 673: 783, 674: 784, 675: 785, 676: 789, 677: 790, 678: 791, 679: 792, 680: 793, 681: 794, 682: 795, 683: 796, 684: 797, 685: 798, 686: 799, 687: 800, 688: 801, 689: 802, 690: 803, 691: 804, 692: 805, 693: 806, 694: 807, 695: 808, 696: 809, 697: 810, 698: 811, 699: 812, 700: 813, 701: 814, 702: 815, 703: 816, 704: 817, 705: 818, 706: 819, 707: 820, 708: 821, 709: 823, 710: 824, 711: 825, 712: 826, 713: 827, 714: 828, 715: 830, 716: 831, 717: 832, 718: 833, 719: 834, 720: 835, 721: 839, 722: 840, 723: 842, 724: 843, 725: 845, 726: 846, 727: 852, 728: 853, 729: 854, 730: 855, 731: 856, 732: 857, 733: 858, 734: 859, 735: 860, 736: 862, 737: 863, 738: 864, 739: 865, 740: 866, 741: 867, 742: 868, 743: 869, 744: 870, 745: 872, 746: 873, 747: 874, 748: 875, 749: 876, 750: 877, 751: 878, 752: 879, 753: 880, 754: 882, 755: 883, 756: 884, 757: 885, 758: 886, 759: 887, 760: 889, 761: 890, 762: 891, 763: 892, 764: 893, 765: 894, 766: 895, 767: 896, 768: 898, 769: 899, 770: 901, 771: 902, 772: 908, 773: 909, 774: 910, 775: 911, 776: 912, 777: 913, 778: 914, 779: 915, 780: 916, 781: 918, 782: 919, 783: 920, 784: 921, 785: 922, 786: 923, 787: 924, 788: 925, 789: 926, 790: 928, 791: 929, 792: 930, 793: 931, 794: 932, 795: 933, 796: 934, 797: 935, 798: 936, 799: 938, 800: 939, 801: 940, 802: 941, 803: 942, 804: 943, 805: 945, 806: 946, 807: 947, 808: 948, 809: 949, 810: 950, 811: 951, 812: 952, 813: 954, 814: 955, 815: 957, 816: 958, 817: 964, 818: 965, 819: 966, 820: 967, 821: 968, 822: 969, 823: 970, 824: 971, 825: 972, 826: 974, 827: 975, 828: 976, 829: 977, 830: 978, 831: 979, 832: 980, 833: 981, 834: 982, 835: 984, 836: 985, 837: 986, 838: 987, 839: 988, 840: 989, 841: 990, 842: 991, 843: 992, 844: 994, 845: 995, 846: 996, 847: 997, 848: 998, 849: 999, 850: 1001, 851: 1002, 852: 1003, 853: 1004, 854: 1005, 855: 1006, 856: 1007, 857: 1008, 858: 1010, 859: 1011, 860: 1013, 861: 1014, 862: 1019, 863: 1020, 864: 1022, 865: 1023, 866: 1025, 867: 1026, 868: 1031, 869: 1032, 870: 1034, 871: 1035, 872: 1037, 873: 1038, 874: 1046, 875: 1047, 876: 1048, 877: 1049, 878: 1050, 879: 1051, 880: 1052, 881: 1053, 882: 1054, 883: 1055, 884: 1056, 885: 1057, 886: 1058, 887: 1059, 888: 1060, 889: 1061, 890: 1062, 891: 1063, 892: 1065, 893: 1066, 894: 1067, 895: 1068, 896: 1069, 897: 1070, 898: 1071, 899: 1072, 900: 1073, 901: 1074, 902: 1075, 903: 1076, 904: 1077, 905: 1078, 906: 1079, 907: 1080, 908: 1081, 909: 1082, 910: 1084, 911: 1085, 912: 1086, 913: 1087, 914: 1088, 915: 1089, 916: 1090, 917: 1091, 918: 1092, 919: 1093, 920: 1094, 921: 1095, 922: 1096, 923: 1097, 924: 1098, 925: 1099, 926: 1100, 927: 1101, 928: 1103, 929: 1104, 930: 1105, 931: 1106, 932: 1107, 933: 1108, 934: 1110, 935: 1111, 936: 1112, 937: 1113, 938: 1114, 939: 1115, 940: 1117, 941: 1118, 942: 1119, 943: 1120, 944: 1121, 945: 1122} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 4: 3, 5: 4, 7: 5, 8: 6, 14: 7, 15: 8, 16: 9, 18: 10, 19: 11, 20: 12, 22: 13, 23: 14, 24: 15, 26: 16, 27: 17, 28: 18, 29: 19, 30: 20, 31: 21, 33: 22, 34: 23, 35: 24, 36: 25, 37: 26, 38: 27, 39: 28, 40: 29, 41: 30, 42: 31, 43: 32, 44: 33, 45: 34, 46: 35, 47: 36, 49: 37, 50: 38, 51: 39, 52: 40, 53: 41, 54: 42, 55: 43, 56: 44, 57: 45, 58: 46, 59: 47, 60: 48, 61: 49, 62: 50, 63: 51, 65: 52, 66: 53, 67: 54, 68: 55, 69: 56, 70: 57, 71: 58, 72: 59, 73: 60, 74: 61, 75: 62, 76: 63, 77: 64, 78: 65, 79: 66, 81: 67, 82: 68, 83: 69, 84: 70, 85: 71, 86: 72, 87: 73, 88: 74, 89: 75, 91: 76, 92: 77, 93: 78, 94: 79, 95: 80, 96: 81, 97: 82, 98: 83, 99: 84, 101: 85, 102: 86, 103: 87, 104: 88, 105: 89, 106: 90, 107: 91, 108: 92, 109: 93, 110: 94, 111: 95, 112: 96, 113: 97, 114: 98, 115: 99, 116: 100, 117: 101, 118: 102, 119: 103, 120: 104, 121: 105, 124: 106, 125: 107, 126: 108, 127: 109, 128: 110, 129: 111, 130: 112, 131: 113, 132: 114, 133: 115, 134: 116, 135: 117, 136: 118, 137: 119, 138: 120, 140: 121, 141: 122, 143: 123, 144: 124, 145: 125, 146: 126, 147: 127, 148: 128, 149: 129, 150: 130, 151: 131, 152: 132, 153: 133, 154: 134, 155: 135, 156: 136, 157: 137, 159: 138, 160: 139, 161: 140, 162: 141, 163: 142, 164: 143, 165: 144, 166: 145, 167: 146, 168: 147, 169: 148, 170: 149, 171: 150, 172: 151, 173: 152, 175: 153, 176: 154, 177: 155, 178: 156, 179: 157, 180: 158, 181: 159, 182: 160, 183: 161, 184: 162, 185: 163, 186: 164, 187: 165, 188: 166, 189: 167, 190: 168, 191: 169, 192: 170, 193: 171, 194: 172, 195: 173, 196: 174, 197: 175, 198: 176, 199: 177, 200: 178, 201: 179, 202: 180, 203: 181, 204: 182, 205: 183, 206: 184, 207: 185, 208: 186, 209: 187, 210: 188, 211: 189, 212: 190, 213: 191, 214: 192, 215: 193, 216: 194, 217: 195, 218: 196, 220: 197, 221: 198, 222: 199, 223: 200, 224: 201, 225: 202, 227: 203, 228: 204, 229: 205, 230: 206, 231: 207, 232: 208, 234: 209, 235: 210, 247: 211, 248: 212, 249: 213, 250: 214, 251: 215, 252: 216, 253: 217, 254: 218, 255: 219, 256: 220, 257: 221, 258: 222, 259: 223, 260: 224, 261: 225, 263: 226, 264: 227, 266: 228, 267: 229, 268: 230, 269: 231, 270: 232, 271: 233, 272: 234, 273: 235, 274: 236, 275: 237, 276: 238, 277: 239, 278: 240, 279: 241, 280: 242, 282: 243, 283: 244, 284: 245, 285: 246, 286: 247, 287: 248, 288: 249, 289: 250, 290: 251, 291: 252, 292: 253, 293: 254, 294: 255, 295: 256, 296: 257, 298: 258, 299: 259, 300: 260, 301: 261, 302: 262, 303: 263, 304: 264, 305: 265, 306: 266, 307: 267, 308: 268, 309: 269, 310: 270, 311: 271, 312: 272, 313: 273, 314: 274, 315: 275, 316: 276, 317: 277, 318: 278, 319: 279, 320: 280, 321: 281, 322: 282, 323: 283, 324: 284, 325: 285, 326: 286, 327: 287, 328: 288, 329: 289, 330: 290, 331: 291, 332: 292, 333: 293, 334: 294, 335: 295, 336: 296, 337: 297, 338: 298, 339: 299, 340: 300, 341: 301, 343: 302, 344: 303, 345: 304, 346: 305, 347: 306, 348: 307, 350: 308, 351: 309, 352: 310, 353: 311, 354: 312, 355: 313, 357: 314, 358: 315, 370: 316, 371: 317, 372: 318, 373: 319, 374: 320, 375: 321, 377: 322, 378: 323, 379: 324, 380: 325, 381: 326, 382: 327, 383: 328, 384: 329, 385: 330, 386: 331, 387: 332, 388: 333, 389: 334, 390: 335, 391: 336, 393: 337, 394: 338, 395: 339, 396: 340, 397: 341, 398: 342, 399: 343, 400: 344, 401: 345, 402: 346, 403: 347, 404: 348, 405: 349, 406: 350, 407: 351, 409: 352, 410: 353, 411: 354, 412: 355, 413: 356, 414: 357, 415: 358, 416: 359, 417: 360, 418: 361, 419: 362, 420: 363, 421: 364, 422: 365, 423: 366, 425: 367, 426: 368, 427: 369, 428: 370, 429: 371, 430: 372, 431: 373, 432: 374, 433: 375, 434: 376, 435: 377, 437: 378, 438: 379, 440: 380, 441: 381, 447: 382, 448: 383, 449: 384, 450: 385, 451: 386, 452: 387, 453: 388, 454: 389, 455: 390, 457: 391, 458: 392, 459: 393, 460: 394, 461: 395, 462: 396, 463: 397, 464: 398, 465: 399, 467: 400, 468: 401, 469: 402, 470: 403, 471: 404, 472: 405, 473: 406, 474: 407, 475: 408, 477: 409, 478: 410, 479: 411, 480: 412, 481: 413, 482: 414, 484: 415, 485: 416, 486: 417, 487: 418, 488: 419, 489: 420, 493: 421, 494: 422, 495: 423, 496: 424, 497: 425, 498: 426, 500: 427, 501: 428, 502: 429, 503: 430, 504: 431, 505: 432, 506: 433, 507: 434, 508: 435, 509: 436, 510: 437, 511: 438, 512: 439, 513: 440, 514: 441, 516: 442, 517: 443, 518: 444, 519: 445, 520: 446, 521: 447, 522: 448, 523: 449, 524: 450, 525: 451, 526: 452, 527: 453, 528: 454, 529: 455, 530: 456, 532: 457, 533: 458, 534: 459, 535: 460, 536: 461, 537: 462, 538: 463, 539: 464, 540: 465, 541: 466, 542: 467, 543: 468, 544: 469, 545: 470, 546: 471, 548: 472, 549: 473, 550: 474, 551: 475, 552: 476, 553: 477, 554: 478, 555: 479, 556: 480, 557: 481, 558: 482, 560: 483, 561: 484, 563: 485, 564: 486, 570: 487, 571: 488, 572: 489, 573: 490, 574: 491, 575: 492, 576: 493, 577: 494, 578: 495, 580: 496, 581: 497, 582: 498, 583: 499, 584: 500, 585: 501, 586: 502, 587: 503, 588: 504, 590: 505, 591: 506, 592: 507, 593: 508, 594: 509, 595: 510, 596: 511, 597: 512, 598: 513, 600: 514, 601: 515, 602: 516, 603: 517, 604: 518, 605: 519, 607: 520, 608: 521, 609: 522, 610: 523, 611: 524, 612: 525, 616: 526, 617: 527, 618: 528, 619: 529, 620: 530, 621: 531, 623: 532, 624: 533, 625: 534, 626: 535, 627: 536, 628: 537, 629: 538, 630: 539, 631: 540, 632: 541, 633: 542, 634: 543, 635: 544, 636: 545, 637: 546, 639: 547, 640: 548, 641: 549, 642: 550, 643: 551, 644: 552, 645: 553, 646: 554, 647: 555, 648: 556, 649: 557, 650: 558, 651: 559, 652: 560, 653: 561, 655: 562, 656: 563, 657: 564, 658: 565, 659: 566, 660: 567, 661: 568, 662: 569, 663: 570, 664: 571, 665: 572, 666: 573, 667: 574, 668: 575, 669: 576, 671: 577, 672: 578, 673: 579, 674: 580, 675: 581, 676: 582, 677: 583, 678: 584, 679: 585, 680: 586, 681: 587, 683: 588, 684: 589, 686: 590, 687: 591, 693: 592, 694: 593, 695: 594, 696: 595, 697: 596, 698: 597, 699: 598, 700: 599, 701: 600, 703: 601, 704: 602, 705: 603, 706: 604, 707: 605, 708: 606, 709: 607, 710: 608, 711: 609, 713: 610, 714: 611, 715: 612, 716: 613, 717: 614, 718: 615, 719: 616, 720: 617, 721: 618, 723: 619, 724: 620, 725: 621, 726: 622, 727: 623, 728: 624, 730: 625, 731: 626, 732: 627, 733: 628, 734: 629, 735: 630, 739: 631, 740: 632, 741: 633, 742: 634, 743: 635, 744: 636, 745: 637, 746: 638, 747: 639, 748: 640, 749: 641, 750: 642, 751: 643, 752: 644, 753: 645, 754: 646, 755: 647, 756: 648, 757: 649, 758: 650, 759: 651, 760: 652, 761: 653, 762: 654, 763: 655, 764: 656, 765: 657, 766: 658, 767: 659, 768: 660, 769: 661, 770: 662, 771: 663, 773: 664, 774: 665, 775: 666, 776: 667, 777: 668, 778: 669, 780: 670, 781: 671, 782: 672, 783: 673, 784: 674, 785: 675, 789: 676, 790: 677, 791: 678, 792: 679, 793: 680, 794: 681, 795: 682, 796: 683, 797: 684, 798: 685, 799: 686, 800: 687, 801: 688, 802: 689, 803: 690, 804: 691, 805: 692, 806: 693, 807: 694, 808: 695, 809: 696, 810: 697, 811: 698, 812: 699, 813: 700, 814: 701, 815: 702, 816: 703, 817: 704, 818: 705, 819: 706, 820: 707, 821: 708, 823: 709, 824: 710, 825: 711, 826: 712, 827: 713, 828: 714, 830: 715, 831: 716, 832: 717, 833: 718, 834: 719, 835: 720, 839: 721, 840: 722, 842: 723, 843: 724, 845: 725, 846: 726, 852: 727, 853: 728, 854: 729, 855: 730, 856: 731, 857: 732, 858: 733, 859: 734, 860: 735, 862: 736, 863: 737, 864: 738, 865: 739, 866: 740, 867: 741, 868: 742, 869: 743, 870: 744, 872: 745, 873: 746, 874: 747, 875: 748, 876: 749, 877: 750, 878: 751, 879: 752, 880: 753, 882: 754, 883: 755, 884: 756, 885: 757, 886: 758, 887: 759, 889: 760, 890: 761, 891: 762, 892: 763, 893: 764, 894: 765, 895: 766, 896: 767, 898: 768, 899: 769, 901: 770, 902: 771, 908: 772, 909: 773, 910: 774, 911: 775, 912: 776, 913: 777, 914: 778, 915: 779, 916: 780, 918: 781, 919: 782, 920: 783, 921: 784, 922: 785, 923: 786, 924: 787, 925: 788, 926: 789, 928: 790, 929: 791, 930: 792, 931: 793, 932: 794, 933: 795, 934: 796, 935: 797, 936: 798, 938: 799, 939: 800, 940: 801, 941: 802, 942: 803, 943: 804, 945: 805, 946: 806, 947: 807, 948: 808, 949: 809, 950: 810, 951: 811, 952: 812, 954: 813, 955: 814, 957: 815, 958: 816, 964: 817, 965: 818, 966: 819, 967: 820, 968: 821, 969: 822, 970: 823, 971: 824, 972: 825, 974: 826, 975: 827, 976: 828, 977: 829, 978: 830, 979: 831, 980: 832, 981: 833, 982: 834, 984: 835, 985: 836, 986: 837, 987: 838, 988: 839, 989: 840, 990: 841, 991: 842, 992: 843, 994: 844, 995: 845, 996: 846, 997: 847, 998: 848, 999: 849, 1001: 850, 1002: 851, 1003: 852, 1004: 853, 1005: 854, 1006: 855, 1007: 856, 1008: 857, 1010: 858, 1011: 859, 1013: 860, 1014: 861, 1019: 862, 1020: 863, 1022: 864, 1023: 865, 1025: 866, 1026: 867, 1031: 868, 1032: 869, 1034: 870, 1035: 871, 1037: 872, 1038: 873, 1046: 874, 1047: 875, 1048: 876, 1049: 877, 1050: 878, 1051: 879, 1052: 880, 1053: 881, 1054: 882, 1055: 883, 1056: 884, 1057: 885, 1058: 886, 1059: 887, 1060: 888, 1061: 889, 1062: 890, 1063: 891, 1065: 892, 1066: 893, 1067: 894, 1068: 895, 1069: 896, 1070: 897, 1071: 898, 1072: 899, 1073: 900, 1074: 901, 1075: 902, 1076: 903, 1077: 904, 1078: 905, 1079: 906, 1080: 907, 1081: 908, 1082: 909, 1084: 910, 1085: 911, 1086: 912, 1087: 913, 1088: 914, 1089: 915, 1090: 916, 1091: 917, 1092: 918, 1093: 919, 1094: 920, 1095: 921, 1096: 922, 1097: 923, 1098: 924, 1099: 925, 1100: 926, 1101: 927, 1103: 928, 1104: 929, 1105: 930, 1106: 931, 1107: 932, 1108: 933, 1110: 934, 1111: 935, 1112: 936, 1113: 937, 1114: 938, 1115: 939, 1117: 940, 1118: 941, 1119: 942, 1120: 943, 1121: 944, 1122: 945} [model_handling.py at line 1552]  -Generated helas calls for 1 subprocesses (1240 diagrams) in 6.565 s -Wrote files for 2281 helas calls in 18.614 s +DEBUG: len(subproc_diagrams_for_config) =  945 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 4, 4: 5, 5: 7, 6: 8, 7: 14, 8: 15, 9: 16, 10: 18, 11: 19, 12: 20, 13: 22, 14: 23, 15: 24, 16: 26, 17: 27, 18: 28, 19: 29, 20: 30, 21: 31, 22: 33, 23: 34, 24: 35, 25: 36, 26: 37, 27: 38, 28: 39, 29: 40, 30: 41, 31: 42, 32: 43, 33: 44, 34: 45, 35: 46, 36: 47, 37: 49, 38: 50, 39: 51, 40: 52, 41: 53, 42: 54, 43: 55, 44: 56, 45: 57, 46: 58, 47: 59, 48: 60, 49: 61, 50: 62, 51: 63, 52: 65, 53: 66, 54: 67, 55: 68, 56: 69, 57: 70, 58: 71, 59: 72, 60: 73, 61: 74, 62: 75, 63: 76, 64: 77, 65: 78, 66: 79, 67: 81, 68: 82, 69: 83, 70: 84, 71: 85, 72: 86, 73: 87, 74: 88, 75: 89, 76: 91, 77: 92, 78: 93, 79: 94, 80: 95, 81: 96, 82: 97, 83: 98, 84: 99, 85: 101, 86: 102, 87: 103, 88: 104, 89: 105, 90: 106, 91: 107, 92: 108, 93: 109, 94: 110, 95: 111, 96: 112, 97: 113, 98: 114, 99: 115, 100: 116, 101: 117, 102: 118, 103: 119, 104: 120, 105: 121, 106: 124, 107: 125, 108: 126, 109: 127, 110: 128, 111: 129, 112: 130, 113: 131, 114: 132, 115: 133, 116: 134, 117: 135, 118: 136, 119: 137, 120: 138, 121: 140, 122: 141, 123: 143, 124: 144, 125: 145, 126: 146, 127: 147, 128: 148, 129: 149, 130: 150, 131: 151, 132: 152, 133: 153, 134: 154, 135: 155, 136: 156, 137: 157, 138: 159, 139: 160, 140: 161, 141: 162, 142: 163, 143: 164, 144: 165, 145: 166, 146: 167, 147: 168, 148: 169, 149: 170, 150: 171, 151: 172, 152: 173, 153: 175, 154: 176, 155: 177, 156: 178, 157: 179, 158: 180, 159: 181, 160: 182, 161: 183, 162: 184, 163: 185, 164: 186, 165: 187, 166: 188, 167: 189, 168: 190, 169: 191, 170: 192, 171: 193, 172: 194, 173: 195, 174: 196, 175: 197, 176: 198, 177: 199, 178: 200, 179: 201, 180: 202, 181: 203, 182: 204, 183: 205, 184: 206, 185: 207, 186: 208, 187: 209, 188: 210, 189: 211, 190: 212, 191: 213, 192: 214, 193: 215, 194: 216, 195: 217, 196: 218, 197: 220, 198: 221, 199: 222, 200: 223, 201: 224, 202: 225, 203: 227, 204: 228, 205: 229, 206: 230, 207: 231, 208: 232, 209: 234, 210: 235, 211: 247, 212: 248, 213: 249, 214: 250, 215: 251, 216: 252, 217: 253, 218: 254, 219: 255, 220: 256, 221: 257, 222: 258, 223: 259, 224: 260, 225: 261, 226: 263, 227: 264, 228: 266, 229: 267, 230: 268, 231: 269, 232: 270, 233: 271, 234: 272, 235: 273, 236: 274, 237: 275, 238: 276, 239: 277, 240: 278, 241: 279, 242: 280, 243: 282, 244: 283, 245: 284, 246: 285, 247: 286, 248: 287, 249: 288, 250: 289, 251: 290, 252: 291, 253: 292, 254: 293, 255: 294, 256: 295, 257: 296, 258: 298, 259: 299, 260: 300, 261: 301, 262: 302, 263: 303, 264: 304, 265: 305, 266: 306, 267: 307, 268: 308, 269: 309, 270: 310, 271: 311, 272: 312, 273: 313, 274: 314, 275: 315, 276: 316, 277: 317, 278: 318, 279: 319, 280: 320, 281: 321, 282: 322, 283: 323, 284: 324, 285: 325, 286: 326, 287: 327, 288: 328, 289: 329, 290: 330, 291: 331, 292: 332, 293: 333, 294: 334, 295: 335, 296: 336, 297: 337, 298: 338, 299: 339, 300: 340, 301: 341, 302: 343, 303: 344, 304: 345, 305: 346, 306: 347, 307: 348, 308: 350, 309: 351, 310: 352, 311: 353, 312: 354, 313: 355, 314: 357, 315: 358, 316: 370, 317: 371, 318: 372, 319: 373, 320: 374, 321: 375, 322: 377, 323: 378, 324: 379, 325: 380, 326: 381, 327: 382, 328: 383, 329: 384, 330: 385, 331: 386, 332: 387, 333: 388, 334: 389, 335: 390, 336: 391, 337: 393, 338: 394, 339: 395, 340: 396, 341: 397, 342: 398, 343: 399, 344: 400, 345: 401, 346: 402, 347: 403, 348: 404, 349: 405, 350: 406, 351: 407, 352: 409, 353: 410, 354: 411, 355: 412, 356: 413, 357: 414, 358: 415, 359: 416, 360: 417, 361: 418, 362: 419, 363: 420, 364: 421, 365: 422, 366: 423, 367: 425, 368: 426, 369: 427, 370: 428, 371: 429, 372: 430, 373: 431, 374: 432, 375: 433, 376: 434, 377: 435, 378: 437, 379: 438, 380: 440, 381: 441, 382: 447, 383: 448, 384: 449, 385: 450, 386: 451, 387: 452, 388: 453, 389: 454, 390: 455, 391: 457, 392: 458, 393: 459, 394: 460, 395: 461, 396: 462, 397: 463, 398: 464, 399: 465, 400: 467, 401: 468, 402: 469, 403: 470, 404: 471, 405: 472, 406: 473, 407: 474, 408: 475, 409: 477, 410: 478, 411: 479, 412: 480, 413: 481, 414: 482, 415: 484, 416: 485, 417: 486, 418: 487, 419: 488, 420: 489, 421: 493, 422: 494, 423: 495, 424: 496, 425: 497, 426: 498, 427: 500, 428: 501, 429: 502, 430: 503, 431: 504, 432: 505, 433: 506, 434: 507, 435: 508, 436: 509, 437: 510, 438: 511, 439: 512, 440: 513, 441: 514, 442: 516, 443: 517, 444: 518, 445: 519, 446: 520, 447: 521, 448: 522, 449: 523, 450: 524, 451: 525, 452: 526, 453: 527, 454: 528, 455: 529, 456: 530, 457: 532, 458: 533, 459: 534, 460: 535, 461: 536, 462: 537, 463: 538, 464: 539, 465: 540, 466: 541, 467: 542, 468: 543, 469: 544, 470: 545, 471: 546, 472: 548, 473: 549, 474: 550, 475: 551, 476: 552, 477: 553, 478: 554, 479: 555, 480: 556, 481: 557, 482: 558, 483: 560, 484: 561, 485: 563, 486: 564, 487: 570, 488: 571, 489: 572, 490: 573, 491: 574, 492: 575, 493: 576, 494: 577, 495: 578, 496: 580, 497: 581, 498: 582, 499: 583, 500: 584, 501: 585, 502: 586, 503: 587, 504: 588, 505: 590, 506: 591, 507: 592, 508: 593, 509: 594, 510: 595, 511: 596, 512: 597, 513: 598, 514: 600, 515: 601, 516: 602, 517: 603, 518: 604, 519: 605, 520: 607, 521: 608, 522: 609, 523: 610, 524: 611, 525: 612, 526: 616, 527: 617, 528: 618, 529: 619, 530: 620, 531: 621, 532: 623, 533: 624, 534: 625, 535: 626, 536: 627, 537: 628, 538: 629, 539: 630, 540: 631, 541: 632, 542: 633, 543: 634, 544: 635, 545: 636, 546: 637, 547: 639, 548: 640, 549: 641, 550: 642, 551: 643, 552: 644, 553: 645, 554: 646, 555: 647, 556: 648, 557: 649, 558: 650, 559: 651, 560: 652, 561: 653, 562: 655, 563: 656, 564: 657, 565: 658, 566: 659, 567: 660, 568: 661, 569: 662, 570: 663, 571: 664, 572: 665, 573: 666, 574: 667, 575: 668, 576: 669, 577: 671, 578: 672, 579: 673, 580: 674, 581: 675, 582: 676, 583: 677, 584: 678, 585: 679, 586: 680, 587: 681, 588: 683, 589: 684, 590: 686, 591: 687, 592: 693, 593: 694, 594: 695, 595: 696, 596: 697, 597: 698, 598: 699, 599: 700, 600: 701, 601: 703, 602: 704, 603: 705, 604: 706, 605: 707, 606: 708, 607: 709, 608: 710, 609: 711, 610: 713, 611: 714, 612: 715, 613: 716, 614: 717, 615: 718, 616: 719, 617: 720, 618: 721, 619: 723, 620: 724, 621: 725, 622: 726, 623: 727, 624: 728, 625: 730, 626: 731, 627: 732, 628: 733, 629: 734, 630: 735, 631: 739, 632: 740, 633: 741, 634: 742, 635: 743, 636: 744, 637: 745, 638: 746, 639: 747, 640: 748, 641: 749, 642: 750, 643: 751, 644: 752, 645: 753, 646: 754, 647: 755, 648: 756, 649: 757, 650: 758, 651: 759, 652: 760, 653: 761, 654: 762, 655: 763, 656: 764, 657: 765, 658: 766, 659: 767, 660: 768, 661: 769, 662: 770, 663: 771, 664: 773, 665: 774, 666: 775, 667: 776, 668: 777, 669: 778, 670: 780, 671: 781, 672: 782, 673: 783, 674: 784, 675: 785, 676: 789, 677: 790, 678: 791, 679: 792, 680: 793, 681: 794, 682: 795, 683: 796, 684: 797, 685: 798, 686: 799, 687: 800, 688: 801, 689: 802, 690: 803, 691: 804, 692: 805, 693: 806, 694: 807, 695: 808, 696: 809, 697: 810, 698: 811, 699: 812, 700: 813, 701: 814, 702: 815, 703: 816, 704: 817, 705: 818, 706: 819, 707: 820, 708: 821, 709: 823, 710: 824, 711: 825, 712: 826, 713: 827, 714: 828, 715: 830, 716: 831, 717: 832, 718: 833, 719: 834, 720: 835, 721: 839, 722: 840, 723: 842, 724: 843, 725: 845, 726: 846, 727: 852, 728: 853, 729: 854, 730: 855, 731: 856, 732: 857, 733: 858, 734: 859, 735: 860, 736: 862, 737: 863, 738: 864, 739: 865, 740: 866, 741: 867, 742: 868, 743: 869, 744: 870, 745: 872, 746: 873, 747: 874, 748: 875, 749: 876, 750: 877, 751: 878, 752: 879, 753: 880, 754: 882, 755: 883, 756: 884, 757: 885, 758: 886, 759: 887, 760: 889, 761: 890, 762: 891, 763: 892, 764: 893, 765: 894, 766: 895, 767: 896, 768: 898, 769: 899, 770: 901, 771: 902, 772: 908, 773: 909, 774: 910, 775: 911, 776: 912, 777: 913, 778: 914, 779: 915, 780: 916, 781: 918, 782: 919, 783: 920, 784: 921, 785: 922, 786: 923, 787: 924, 788: 925, 789: 926, 790: 928, 791: 929, 792: 930, 793: 931, 794: 932, 795: 933, 796: 934, 797: 935, 798: 936, 799: 938, 800: 939, 801: 940, 802: 941, 803: 942, 804: 943, 805: 945, 806: 946, 807: 947, 808: 948, 809: 949, 810: 950, 811: 951, 812: 952, 813: 954, 814: 955, 815: 957, 816: 958, 817: 964, 818: 965, 819: 966, 820: 967, 821: 968, 822: 969, 823: 970, 824: 971, 825: 972, 826: 974, 827: 975, 828: 976, 829: 977, 830: 978, 831: 979, 832: 980, 833: 981, 834: 982, 835: 984, 836: 985, 837: 986, 838: 987, 839: 988, 840: 989, 841: 990, 842: 991, 843: 992, 844: 994, 845: 995, 846: 996, 847: 997, 848: 998, 849: 999, 850: 1001, 851: 1002, 852: 1003, 853: 1004, 854: 1005, 855: 1006, 856: 1007, 857: 1008, 858: 1010, 859: 1011, 860: 1013, 861: 1014, 862: 1019, 863: 1020, 864: 1022, 865: 1023, 866: 1025, 867: 1026, 868: 1031, 869: 1032, 870: 1034, 871: 1035, 872: 1037, 873: 1038, 874: 1046, 875: 1047, 876: 1048, 877: 1049, 878: 1050, 879: 1051, 880: 1052, 881: 1053, 882: 1054, 883: 1055, 884: 1056, 885: 1057, 886: 1058, 887: 1059, 888: 1060, 889: 1061, 890: 1062, 891: 1063, 892: 1065, 893: 1066, 894: 1067, 895: 1068, 896: 1069, 897: 1070, 898: 1071, 899: 1072, 900: 1073, 901: 1074, 902: 1075, 903: 1076, 904: 1077, 905: 1078, 906: 1079, 907: 1080, 908: 1081, 909: 1082, 910: 1084, 911: 1085, 912: 1086, 913: 1087, 914: 1088, 915: 1089, 916: 1090, 917: 1091, 918: 1092, 919: 1093, 920: 1094, 921: 1095, 922: 1096, 923: 1097, 924: 1098, 925: 1099, 926: 1100, 927: 1101, 928: 1103, 929: 1104, 930: 1105, 931: 1106, 932: 1107, 933: 1108, 934: 1110, 935: 1111, 936: 1112, 937: 1113, 938: 1114, 939: 1115, 940: 1117, 941: 1118, 942: 1119, 943: 1120, 944: 1121, 945: 1122} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 4: 3, 5: 4, 7: 5, 8: 6, 14: 7, 15: 8, 16: 9, 18: 10, 19: 11, 20: 12, 22: 13, 23: 14, 24: 15, 26: 16, 27: 17, 28: 18, 29: 19, 30: 20, 31: 21, 33: 22, 34: 23, 35: 24, 36: 25, 37: 26, 38: 27, 39: 28, 40: 29, 41: 30, 42: 31, 43: 32, 44: 33, 45: 34, 46: 35, 47: 36, 49: 37, 50: 38, 51: 39, 52: 40, 53: 41, 54: 42, 55: 43, 56: 44, 57: 45, 58: 46, 59: 47, 60: 48, 61: 49, 62: 50, 63: 51, 65: 52, 66: 53, 67: 54, 68: 55, 69: 56, 70: 57, 71: 58, 72: 59, 73: 60, 74: 61, 75: 62, 76: 63, 77: 64, 78: 65, 79: 66, 81: 67, 82: 68, 83: 69, 84: 70, 85: 71, 86: 72, 87: 73, 88: 74, 89: 75, 91: 76, 92: 77, 93: 78, 94: 79, 95: 80, 96: 81, 97: 82, 98: 83, 99: 84, 101: 85, 102: 86, 103: 87, 104: 88, 105: 89, 106: 90, 107: 91, 108: 92, 109: 93, 110: 94, 111: 95, 112: 96, 113: 97, 114: 98, 115: 99, 116: 100, 117: 101, 118: 102, 119: 103, 120: 104, 121: 105, 124: 106, 125: 107, 126: 108, 127: 109, 128: 110, 129: 111, 130: 112, 131: 113, 132: 114, 133: 115, 134: 116, 135: 117, 136: 118, 137: 119, 138: 120, 140: 121, 141: 122, 143: 123, 144: 124, 145: 125, 146: 126, 147: 127, 148: 128, 149: 129, 150: 130, 151: 131, 152: 132, 153: 133, 154: 134, 155: 135, 156: 136, 157: 137, 159: 138, 160: 139, 161: 140, 162: 141, 163: 142, 164: 143, 165: 144, 166: 145, 167: 146, 168: 147, 169: 148, 170: 149, 171: 150, 172: 151, 173: 152, 175: 153, 176: 154, 177: 155, 178: 156, 179: 157, 180: 158, 181: 159, 182: 160, 183: 161, 184: 162, 185: 163, 186: 164, 187: 165, 188: 166, 189: 167, 190: 168, 191: 169, 192: 170, 193: 171, 194: 172, 195: 173, 196: 174, 197: 175, 198: 176, 199: 177, 200: 178, 201: 179, 202: 180, 203: 181, 204: 182, 205: 183, 206: 184, 207: 185, 208: 186, 209: 187, 210: 188, 211: 189, 212: 190, 213: 191, 214: 192, 215: 193, 216: 194, 217: 195, 218: 196, 220: 197, 221: 198, 222: 199, 223: 200, 224: 201, 225: 202, 227: 203, 228: 204, 229: 205, 230: 206, 231: 207, 232: 208, 234: 209, 235: 210, 247: 211, 248: 212, 249: 213, 250: 214, 251: 215, 252: 216, 253: 217, 254: 218, 255: 219, 256: 220, 257: 221, 258: 222, 259: 223, 260: 224, 261: 225, 263: 226, 264: 227, 266: 228, 267: 229, 268: 230, 269: 231, 270: 232, 271: 233, 272: 234, 273: 235, 274: 236, 275: 237, 276: 238, 277: 239, 278: 240, 279: 241, 280: 242, 282: 243, 283: 244, 284: 245, 285: 246, 286: 247, 287: 248, 288: 249, 289: 250, 290: 251, 291: 252, 292: 253, 293: 254, 294: 255, 295: 256, 296: 257, 298: 258, 299: 259, 300: 260, 301: 261, 302: 262, 303: 263, 304: 264, 305: 265, 306: 266, 307: 267, 308: 268, 309: 269, 310: 270, 311: 271, 312: 272, 313: 273, 314: 274, 315: 275, 316: 276, 317: 277, 318: 278, 319: 279, 320: 280, 321: 281, 322: 282, 323: 283, 324: 284, 325: 285, 326: 286, 327: 287, 328: 288, 329: 289, 330: 290, 331: 291, 332: 292, 333: 293, 334: 294, 335: 295, 336: 296, 337: 297, 338: 298, 339: 299, 340: 300, 341: 301, 343: 302, 344: 303, 345: 304, 346: 305, 347: 306, 348: 307, 350: 308, 351: 309, 352: 310, 353: 311, 354: 312, 355: 313, 357: 314, 358: 315, 370: 316, 371: 317, 372: 318, 373: 319, 374: 320, 375: 321, 377: 322, 378: 323, 379: 324, 380: 325, 381: 326, 382: 327, 383: 328, 384: 329, 385: 330, 386: 331, 387: 332, 388: 333, 389: 334, 390: 335, 391: 336, 393: 337, 394: 338, 395: 339, 396: 340, 397: 341, 398: 342, 399: 343, 400: 344, 401: 345, 402: 346, 403: 347, 404: 348, 405: 349, 406: 350, 407: 351, 409: 352, 410: 353, 411: 354, 412: 355, 413: 356, 414: 357, 415: 358, 416: 359, 417: 360, 418: 361, 419: 362, 420: 363, 421: 364, 422: 365, 423: 366, 425: 367, 426: 368, 427: 369, 428: 370, 429: 371, 430: 372, 431: 373, 432: 374, 433: 375, 434: 376, 435: 377, 437: 378, 438: 379, 440: 380, 441: 381, 447: 382, 448: 383, 449: 384, 450: 385, 451: 386, 452: 387, 453: 388, 454: 389, 455: 390, 457: 391, 458: 392, 459: 393, 460: 394, 461: 395, 462: 396, 463: 397, 464: 398, 465: 399, 467: 400, 468: 401, 469: 402, 470: 403, 471: 404, 472: 405, 473: 406, 474: 407, 475: 408, 477: 409, 478: 410, 479: 411, 480: 412, 481: 413, 482: 414, 484: 415, 485: 416, 486: 417, 487: 418, 488: 419, 489: 420, 493: 421, 494: 422, 495: 423, 496: 424, 497: 425, 498: 426, 500: 427, 501: 428, 502: 429, 503: 430, 504: 431, 505: 432, 506: 433, 507: 434, 508: 435, 509: 436, 510: 437, 511: 438, 512: 439, 513: 440, 514: 441, 516: 442, 517: 443, 518: 444, 519: 445, 520: 446, 521: 447, 522: 448, 523: 449, 524: 450, 525: 451, 526: 452, 527: 453, 528: 454, 529: 455, 530: 456, 532: 457, 533: 458, 534: 459, 535: 460, 536: 461, 537: 462, 538: 463, 539: 464, 540: 465, 541: 466, 542: 467, 543: 468, 544: 469, 545: 470, 546: 471, 548: 472, 549: 473, 550: 474, 551: 475, 552: 476, 553: 477, 554: 478, 555: 479, 556: 480, 557: 481, 558: 482, 560: 483, 561: 484, 563: 485, 564: 486, 570: 487, 571: 488, 572: 489, 573: 490, 574: 491, 575: 492, 576: 493, 577: 494, 578: 495, 580: 496, 581: 497, 582: 498, 583: 499, 584: 500, 585: 501, 586: 502, 587: 503, 588: 504, 590: 505, 591: 506, 592: 507, 593: 508, 594: 509, 595: 510, 596: 511, 597: 512, 598: 513, 600: 514, 601: 515, 602: 516, 603: 517, 604: 518, 605: 519, 607: 520, 608: 521, 609: 522, 610: 523, 611: 524, 612: 525, 616: 526, 617: 527, 618: 528, 619: 529, 620: 530, 621: 531, 623: 532, 624: 533, 625: 534, 626: 535, 627: 536, 628: 537, 629: 538, 630: 539, 631: 540, 632: 541, 633: 542, 634: 543, 635: 544, 636: 545, 637: 546, 639: 547, 640: 548, 641: 549, 642: 550, 643: 551, 644: 552, 645: 553, 646: 554, 647: 555, 648: 556, 649: 557, 650: 558, 651: 559, 652: 560, 653: 561, 655: 562, 656: 563, 657: 564, 658: 565, 659: 566, 660: 567, 661: 568, 662: 569, 663: 570, 664: 571, 665: 572, 666: 573, 667: 574, 668: 575, 669: 576, 671: 577, 672: 578, 673: 579, 674: 580, 675: 581, 676: 582, 677: 583, 678: 584, 679: 585, 680: 586, 681: 587, 683: 588, 684: 589, 686: 590, 687: 591, 693: 592, 694: 593, 695: 594, 696: 595, 697: 596, 698: 597, 699: 598, 700: 599, 701: 600, 703: 601, 704: 602, 705: 603, 706: 604, 707: 605, 708: 606, 709: 607, 710: 608, 711: 609, 713: 610, 714: 611, 715: 612, 716: 613, 717: 614, 718: 615, 719: 616, 720: 617, 721: 618, 723: 619, 724: 620, 725: 621, 726: 622, 727: 623, 728: 624, 730: 625, 731: 626, 732: 627, 733: 628, 734: 629, 735: 630, 739: 631, 740: 632, 741: 633, 742: 634, 743: 635, 744: 636, 745: 637, 746: 638, 747: 639, 748: 640, 749: 641, 750: 642, 751: 643, 752: 644, 753: 645, 754: 646, 755: 647, 756: 648, 757: 649, 758: 650, 759: 651, 760: 652, 761: 653, 762: 654, 763: 655, 764: 656, 765: 657, 766: 658, 767: 659, 768: 660, 769: 661, 770: 662, 771: 663, 773: 664, 774: 665, 775: 666, 776: 667, 777: 668, 778: 669, 780: 670, 781: 671, 782: 672, 783: 673, 784: 674, 785: 675, 789: 676, 790: 677, 791: 678, 792: 679, 793: 680, 794: 681, 795: 682, 796: 683, 797: 684, 798: 685, 799: 686, 800: 687, 801: 688, 802: 689, 803: 690, 804: 691, 805: 692, 806: 693, 807: 694, 808: 695, 809: 696, 810: 697, 811: 698, 812: 699, 813: 700, 814: 701, 815: 702, 816: 703, 817: 704, 818: 705, 819: 706, 820: 707, 821: 708, 823: 709, 824: 710, 825: 711, 826: 712, 827: 713, 828: 714, 830: 715, 831: 716, 832: 717, 833: 718, 834: 719, 835: 720, 839: 721, 840: 722, 842: 723, 843: 724, 845: 725, 846: 726, 852: 727, 853: 728, 854: 729, 855: 730, 856: 731, 857: 732, 858: 733, 859: 734, 860: 735, 862: 736, 863: 737, 864: 738, 865: 739, 866: 740, 867: 741, 868: 742, 869: 743, 870: 744, 872: 745, 873: 746, 874: 747, 875: 748, 876: 749, 877: 750, 878: 751, 879: 752, 880: 753, 882: 754, 883: 755, 884: 756, 885: 757, 886: 758, 887: 759, 889: 760, 890: 761, 891: 762, 892: 763, 893: 764, 894: 765, 895: 766, 896: 767, 898: 768, 899: 769, 901: 770, 902: 771, 908: 772, 909: 773, 910: 774, 911: 775, 912: 776, 913: 777, 914: 778, 915: 779, 916: 780, 918: 781, 919: 782, 920: 783, 921: 784, 922: 785, 923: 786, 924: 787, 925: 788, 926: 789, 928: 790, 929: 791, 930: 792, 931: 793, 932: 794, 933: 795, 934: 796, 935: 797, 936: 798, 938: 799, 939: 800, 940: 801, 941: 802, 942: 803, 943: 804, 945: 805, 946: 806, 947: 807, 948: 808, 949: 809, 950: 810, 951: 811, 952: 812, 954: 813, 955: 814, 957: 815, 958: 816, 964: 817, 965: 818, 966: 819, 967: 820, 968: 821, 969: 822, 970: 823, 971: 824, 972: 825, 974: 826, 975: 827, 976: 828, 977: 829, 978: 830, 979: 831, 980: 832, 981: 833, 982: 834, 984: 835, 985: 836, 986: 837, 987: 838, 988: 839, 989: 840, 990: 841, 991: 842, 992: 843, 994: 844, 995: 845, 996: 846, 997: 847, 998: 848, 999: 849, 1001: 850, 1002: 851, 1003: 852, 1004: 853, 1005: 854, 1006: 855, 1007: 856, 1008: 857, 1010: 858, 1011: 859, 1013: 860, 1014: 861, 1019: 862, 1020: 863, 1022: 864, 1023: 865, 1025: 866, 1026: 867, 1031: 868, 1032: 869, 1034: 870, 1035: 871, 1037: 872, 1038: 873, 1046: 874, 1047: 875, 1048: 876, 1049: 877, 1050: 878, 1051: 879, 1052: 880, 1053: 881, 1054: 882, 1055: 883, 1056: 884, 1057: 885, 1058: 886, 1059: 887, 1060: 888, 1061: 889, 1062: 890, 1063: 891, 1065: 892, 1066: 893, 1067: 894, 1068: 895, 1069: 896, 1070: 897, 1071: 898, 1072: 899, 1073: 900, 1074: 901, 1075: 902, 1076: 903, 1077: 904, 1078: 905, 1079: 906, 1080: 907, 1081: 908, 1082: 909, 1084: 910, 1085: 911, 1086: 912, 1087: 913, 1088: 914, 1089: 915, 1090: 916, 1091: 917, 1092: 918, 1093: 919, 1094: 920, 1095: 921, 1096: 922, 1097: 923, 1098: 924, 1099: 925, 1100: 926, 1101: 927, 1103: 928, 1104: 929, 1105: 930, 1106: 931, 1107: 932, 1108: 933, 1110: 934, 1111: 935, 1112: 936, 1113: 937, 1114: 938, 1115: 939, 1117: 940, 1118: 941, 1119: 942, 1120: 943, 1121: 944, 1122: 945} [model_handling.py at line 1563]  +Generated helas calls for 1 subprocesses (1240 diagrams) in 2.674 s +Wrote files for 2281 helas calls in 26.853 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 5 routines in 0.373 s +ALOHA: aloha creates 5 routines in 0.172 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 10 routines in 0.313 s +ALOHA: aloha creates 10 routines in 0.164 s VVV1 VVV1 FFV1 @@ -210,38 +212,40 @@ ALOHA: aloha creates 10 routines in 0.313 s VVVV3 VVVV4 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/SubProcesses/P1_gg_ttxggg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/SubProcesses/P1_gg_ttxggg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 339 (offset 112 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/README Run "open index.html" to see more information about this process. quit -real 0m33.065s -user 0m32.263s -sys 0m0.459s -Code generation completed in 33 seconds +real 0m37.728s +user 0m14.343s +sys 0m1.293s +Code generation completed in 38 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -254,7 +258,7 @@ Code generation completed in 33 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -262,10 +266,9 @@ Code generation completed in 33 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -284,7 +287,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -292,10 +295,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gg_ttggg/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/gg_ttggg.mad/Cards/me5_configuration.txt b/epochX/cudacpp/gg_ttggg.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/gg_ttggg.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/gg_ttggg.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/gg_ttggg.mad/Cards/proc_card_mg5.dat index cdd9d43b05..d6aed6685e 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/gg_ttggg.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/gg_ttggg.mad/Cards/run_card.dat b/epochX/cudacpp/gg_ttggg.mad/Cards/run_card.dat index a08f93d92b..596243d42e 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Cards/run_card.dat +++ b/epochX/cudacpp/gg_ttggg.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_ttggg.mad/Cards/run_card_default.dat b/epochX/cudacpp/gg_ttggg.mad/Cards/run_card_default.dat index 48050a5fd7..377d5bc1c7 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/gg_ttggg.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gg_ttggg.mad/MGMEVersion.txt b/epochX/cudacpp/gg_ttggg.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_ttggg.mad/MGMEVersion.txt +++ b/epochX/cudacpp/gg_ttggg.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttggg.mad/Source/alfas_functions.f b/epochX/cudacpp/gg_ttggg.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/gg_ttggg.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/gg_ttggg.mad/Source/cuts.inc b/epochX/cudacpp/gg_ttggg.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Source/cuts.inc +++ b/epochX/cudacpp/gg_ttggg.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/gg_ttggg.mad/Source/make_opts b/epochX/cudacpp/gg_ttggg.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Source/make_opts +++ b/epochX/cudacpp/gg_ttggg.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/gg_ttggg.mad/Source/makefile b/epochX/cudacpp/gg_ttggg.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Source/makefile +++ b/epochX/cudacpp/gg_ttggg.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/gg_ttggg.mad/Source/run_card.inc b/epochX/cudacpp/gg_ttggg.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/gg_ttggg.mad/Source/run_card.inc +++ b/epochX/cudacpp/gg_ttggg.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/Bridge.h b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.cc b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.cc index ba06f6ff44..a1dd41846a 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.cc +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 VVV1_0( w_fp[9], w_fp[10], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; jamp_sv[25] += amp_sv[0]; @@ -372,8 +439,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 VVV1_0( w_fp[9], w_fp[11], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; jamp_sv[24] += amp_sv[0]; @@ -459,8 +529,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 VVV1_0( w_fp[12], w_fp[13], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; jamp_sv[27] += amp_sv[0]; @@ -487,8 +560,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 VVV1_0( w_fp[12], w_fp[11], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; jamp_sv[26] += amp_sv[0]; @@ -573,8 +649,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 VVV1_0( w_fp[14], w_fp[13], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; jamp_sv[29] += amp_sv[0]; @@ -601,8 +680,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 VVV1_0( w_fp[14], w_fp[10], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; jamp_sv[28] += amp_sv[0]; @@ -925,8 +1007,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 VVV1_0( w_fp[24], w_fp[6], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -953,8 +1038,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[8], w_fp[6], w_fp[26], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -981,8 +1069,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 VVV1_0( w_fp[8], w_fp[24], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -1067,8 +1158,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 VVV1_0( w_fp[27], w_fp[5], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -1095,8 +1189,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 VVV1_0( w_fp[8], w_fp[5], w_fp[28], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[4] -= amp_sv[0]; @@ -1123,8 +1220,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV1_0( w_fp[8], w_fp[27], w_fp[12], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[3] -= amp_sv[0]; @@ -1209,8 +1309,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 VVV1_0( w_fp[4], w_fp[29], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -1237,8 +1340,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 VVV1_0( w_fp[8], w_fp[29], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -1265,8 +1371,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 VVV1_0( w_fp[8], w_fp[4], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -1355,8 +1464,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[34], w_fp[35], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[65] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1369,8 +1481,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[34], w_fp[36], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[70] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[71] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1383,8 +1498,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 VVV1_0( w_fp[12], w_fp[37], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[54] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1403,8 +1521,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[3], w_fp[36], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] += amp_sv[0]; jamp_sv[68] -= amp_sv[0]; @@ -1419,8 +1540,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 VVV1_0( w_fp[14], w_fp[37], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[55] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1439,8 +1563,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 FFV1_0( w_fp[3], w_fp[35], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] += amp_sv[0]; jamp_sv[62] -= amp_sv[0]; @@ -1490,8 +1617,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[38], w_fp[39], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[55] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1504,8 +1634,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 34 FFV1_0( w_fp[40], w_fp[33], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 34 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[33] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[68] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1518,8 +1651,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 FFV1_0( w_fp[38], w_fp[33], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] += amp_sv[0]; jamp_sv[55] -= amp_sv[0]; @@ -1534,8 +1670,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 FFV1_0( w_fp[41], w_fp[39], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[54] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1548,8 +1687,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 37 FFV1_0( w_fp[42], w_fp[33], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 37 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[36] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[62] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1562,8 +1704,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 38 FFV1_0( w_fp[41], w_fp[33], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 38 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[37] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += amp_sv[0]; jamp_sv[54] -= amp_sv[0]; @@ -1578,8 +1723,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 39 FFV1_0( w_fp[3], w_fp[39], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 39 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[38] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += amp_sv[0]; jamp_sv[49] -= amp_sv[0]; @@ -1594,8 +1742,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 40 FFV1_0( w_fp[34], w_fp[33], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 40 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[39] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] += amp_sv[0]; jamp_sv[65] -= amp_sv[0]; @@ -1610,8 +1761,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 41 FFV1_0( w_fp[3], w_fp[33], w_fp[25], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 41 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[40] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[49] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1631,8 +1785,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 42 FFV1_0( w_fp[34], w_fp[43], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 42 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[41] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[88] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[89] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1645,8 +1802,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 43 FFV1_0( w_fp[34], w_fp[44], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 43 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[42] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[94] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[95] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1659,8 +1819,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 44 VVV1_0( w_fp[9], w_fp[45], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 44 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[43] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[78] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1679,8 +1842,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 45 FFV1_0( w_fp[3], w_fp[44], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 45 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[44] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] += amp_sv[0]; jamp_sv[92] -= amp_sv[0]; @@ -1695,8 +1861,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 46 VVV1_0( w_fp[14], w_fp[45], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 46 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[45] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[79] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1715,8 +1884,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 47 FFV1_0( w_fp[3], w_fp[43], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 47 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[46] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[84] += amp_sv[0]; jamp_sv[86] -= amp_sv[0]; @@ -1766,8 +1938,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 49 FFV1_0( w_fp[46], w_fp[47], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 49 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[48] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[79] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1780,8 +1955,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 50 FFV1_0( w_fp[48], w_fp[39], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 50 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[49] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[92] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1794,8 +1972,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 51 FFV1_0( w_fp[46], w_fp[39], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 51 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[50] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] += amp_sv[0]; jamp_sv[79] -= amp_sv[0]; @@ -1810,8 +1991,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 52 FFV1_0( w_fp[41], w_fp[47], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 52 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[51] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[78] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1824,8 +2008,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 53 FFV1_0( w_fp[42], w_fp[39], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 53 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[52] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[84] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[86] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1838,8 +2025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 54 FFV1_0( w_fp[41], w_fp[39], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 54 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[53] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += amp_sv[0]; jamp_sv[78] -= amp_sv[0]; @@ -1854,8 +2044,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 55 FFV1_0( w_fp[3], w_fp[47], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 55 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[54] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += amp_sv[0]; jamp_sv[73] -= amp_sv[0]; @@ -1870,8 +2063,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 56 FFV1_0( w_fp[34], w_fp[39], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 56 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[55] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[88] += amp_sv[0]; jamp_sv[89] -= amp_sv[0]; @@ -1886,8 +2082,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 57 FFV1_0( w_fp[3], w_fp[39], w_fp[28], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 57 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[56] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[73] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1907,8 +2106,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 58 FFV1_0( w_fp[34], w_fp[49], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 58 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[57] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[112] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[113] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1921,8 +2123,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 59 FFV1_0( w_fp[34], w_fp[50], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 59 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[58] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[118] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[119] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1935,8 +2140,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 60 VVV1_0( w_fp[9], w_fp[51], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 60 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[59] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[102] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1955,8 +2163,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 61 FFV1_0( w_fp[3], w_fp[50], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 61 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[60] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[114] += amp_sv[0]; jamp_sv[116] -= amp_sv[0]; @@ -1971,8 +2182,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 62 VVV1_0( w_fp[12], w_fp[51], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 62 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[61] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[103] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1991,8 +2205,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 63 FFV1_0( w_fp[3], w_fp[49], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 63 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[62] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[108] += amp_sv[0]; jamp_sv[110] -= amp_sv[0]; @@ -2041,8 +2258,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 65 FFV1_0( w_fp[46], w_fp[52], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 65 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[64] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[103] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2055,8 +2275,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 66 FFV1_0( w_fp[48], w_fp[47], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 66 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[65] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[114] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[116] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2069,8 +2292,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 67 FFV1_0( w_fp[46], w_fp[47], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 67 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[66] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] += amp_sv[0]; jamp_sv[103] -= amp_sv[0]; @@ -2085,8 +2311,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 68 FFV1_0( w_fp[38], w_fp[52], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 68 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[67] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[102] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2099,8 +2328,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 69 FFV1_0( w_fp[40], w_fp[47], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 69 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[68] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[108] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[110] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2113,8 +2345,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 70 FFV1_0( w_fp[38], w_fp[47], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 70 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[69] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += amp_sv[0]; jamp_sv[102] -= amp_sv[0]; @@ -2129,8 +2364,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 71 FFV1_0( w_fp[3], w_fp[52], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 71 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[70] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += amp_sv[0]; jamp_sv[97] -= amp_sv[0]; @@ -2145,8 +2383,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 72 FFV1_0( w_fp[34], w_fp[47], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 72 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[71] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[112] += amp_sv[0]; jamp_sv[113] -= amp_sv[0]; @@ -2161,8 +2402,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 73 FFV1_0( w_fp[3], w_fp[47], w_fp[26], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 73 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[72] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[97] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2182,8 +2426,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 74 FFV1_0( w_fp[7], w_fp[52], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 74 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[73] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2196,8 +2443,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 75 FFV1_0( w_fp[53], w_fp[52], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 75 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[74] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[27] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2210,8 +2460,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 76 VVV1_0( w_fp[12], w_fp[54], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 76 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[75] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[27] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2230,8 +2483,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 77 FFV1_0( w_fp[53], w_fp[2], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 77 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[76] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[27] -= amp_sv[0]; @@ -2246,8 +2502,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 78 VVV1_0( w_fp[14], w_fp[54], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 78 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[77] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2266,8 +2525,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 79 FFV1_0( w_fp[7], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 79 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[78] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += amp_sv[0]; jamp_sv[29] -= amp_sv[0]; @@ -2316,8 +2578,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 81 FFV1_0( w_fp[46], w_fp[52], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 81 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[80] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -2332,8 +2597,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 82 FFV1_0( w_fp[48], w_fp[2], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 82 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[81] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] += amp_sv[0]; jamp_sv[92] -= amp_sv[0]; @@ -2348,8 +2616,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 83 FFV1_0( w_fp[46], w_fp[2], w_fp[25], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 83 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[82] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2368,8 +2639,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 84 FFV1_0( w_fp[25], w_fp[52], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 84 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[83] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[28] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2382,8 +2656,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 85 FFV1_0( w_fp[48], w_fp[52], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 85 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[84] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[25] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2396,8 +2673,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 86 VVV1_0( w_fp[9], w_fp[23], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 86 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[85] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[25] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2416,8 +2696,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 87 FFV1_0( w_fp[48], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 87 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[86] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[25] -= amp_sv[0]; @@ -2432,8 +2715,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 88 VVV1_0( w_fp[14], w_fp[23], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 88 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[87] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[28] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2452,8 +2738,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 89 FFV1_0( w_fp[25], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 89 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[88] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[28] -= amp_sv[0]; @@ -2502,8 +2791,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 91 FFV1_0( w_fp[38], w_fp[52], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 91 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[90] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[4] -= amp_sv[0]; @@ -2518,8 +2810,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 92 FFV1_0( w_fp[40], w_fp[2], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 92 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[91] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] += amp_sv[0]; jamp_sv[68] -= amp_sv[0]; @@ -2534,8 +2829,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 93 FFV1_0( w_fp[38], w_fp[2], w_fp[28], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 93 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[92] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2554,8 +2852,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 94 FFV1_0( w_fp[28], w_fp[52], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 94 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[93] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2568,8 +2869,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 95 FFV1_0( w_fp[40], w_fp[52], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 95 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[94] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[24] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2582,8 +2886,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 96 VVV1_0( w_fp[9], w_fp[20], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 96 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[95] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[24] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2602,8 +2909,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 97 FFV1_0( w_fp[40], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 97 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[96] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[24] -= amp_sv[0]; @@ -2618,8 +2928,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 98 VVV1_0( w_fp[12], w_fp[20], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 98 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[97] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2638,8 +2951,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 99 FFV1_0( w_fp[28], w_fp[2], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 99 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[98] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[26] -= amp_sv[0]; @@ -2688,8 +3004,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 101 FFV1_0( w_fp[41], w_fp[52], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 101 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[100] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -2704,8 +3023,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 102 FFV1_0( w_fp[42], w_fp[2], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 102 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[101] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] += amp_sv[0]; jamp_sv[62] -= amp_sv[0]; @@ -2720,8 +3042,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 103 FFV1_0( w_fp[41], w_fp[2], w_fp[26], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 103 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[102] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2740,8 +3065,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 104 FFV1_0( w_fp[26], w_fp[52], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 104 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[103] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -2756,8 +3084,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 105 FFV1_0( w_fp[3], w_fp[52], w_fp[42], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 105 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[104] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2776,8 +3107,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 106 FFV1_0( w_fp[34], w_fp[17], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 106 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[105] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] += amp_sv[0]; jamp_sv[65] -= amp_sv[0]; @@ -2792,8 +3126,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 107 FFV1_0( w_fp[34], w_fp[2], w_fp[42], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 107 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[106] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[65] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2812,8 +3149,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 108 FFV1_0( w_fp[3], w_fp[17], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 108 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[107] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[62] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2832,8 +3172,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 109 FFV1_0( w_fp[26], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 109 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[108] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2852,8 +3195,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 110 FFV1_0( w_fp[14], w_fp[52], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 110 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[109] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[3] -= amp_sv[0]; @@ -2868,8 +3214,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 111 FFV1_0( w_fp[3], w_fp[52], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 111 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[110] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2888,8 +3237,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 112 FFV1_0( w_fp[34], w_fp[15], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 112 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[111] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[70] += amp_sv[0]; jamp_sv[71] -= amp_sv[0]; @@ -2904,8 +3256,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 113 FFV1_0( w_fp[34], w_fp[2], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 113 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[112] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[70] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[71] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2924,8 +3279,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 114 FFV1_0( w_fp[3], w_fp[15], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 114 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[113] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[68] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2944,8 +3302,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 115 FFV1_0( w_fp[14], w_fp[2], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 115 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[114] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2964,8 +3325,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 116 FFV1_0( w_fp[12], w_fp[52], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 116 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[115] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -2980,8 +3344,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 117 FFV1_0( w_fp[3], w_fp[52], w_fp[19], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 117 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[116] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3000,8 +3367,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 118 FFV1_0( w_fp[34], w_fp[18], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 118 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[117] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[94] += amp_sv[0]; jamp_sv[95] -= amp_sv[0]; @@ -3016,8 +3386,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 119 FFV1_0( w_fp[34], w_fp[2], w_fp[19], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 119 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[118] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[65] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3036,8 +3409,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 120 FFV1_0( w_fp[3], w_fp[18], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 120 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[119] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[92] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3056,8 +3432,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 121 FFV1_0( w_fp[12], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 121 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[120] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3147,8 +3526,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 124 FFV1_0( w_fp[22], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 124 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[123] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] -= amp_sv[0]; @@ -3160,8 +3542,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 125 FFV1_0( w_fp[21], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 125 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[124] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] -= amp_sv[0]; @@ -3174,9 +3559,12 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 126 FFV1_0( w_fp[56], w_fp[55], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 126 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); -#endif + if( channelId != 0 ) + { + numerators_sv[125] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } +#endif jamp_sv[17] -= amp_sv[0]; // *** DIAGRAM 127 OF 1240 *** @@ -3187,8 +3575,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 127 FFV1_0( w_fp[21], w_fp[55], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 127 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[126] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] -= amp_sv[0]; @@ -3200,8 +3591,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 128 FFV1_0( w_fp[56], w_fp[57], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 128 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[127] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[23] -= amp_sv[0]; @@ -3213,8 +3607,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 129 FFV1_0( w_fp[22], w_fp[57], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 129 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[128] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] -= amp_sv[0]; @@ -3226,8 +3623,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 130 VVV1_0( w_fp[24], w_fp[6], w_fp[58], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 130 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[129] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -3242,8 +3642,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 131 FFV1_0( w_fp[52], w_fp[59], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 131 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[130] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3256,8 +3659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 132 FFV1_0( w_fp[52], w_fp[57], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 132 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[131] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3270,8 +3676,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 133 VVV1_0( w_fp[27], w_fp[5], w_fp[58], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 133 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[132] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -3286,8 +3695,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 134 FFV1_0( w_fp[52], w_fp[60], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 134 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[133] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3300,8 +3712,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 135 FFV1_0( w_fp[52], w_fp[55], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 135 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[134] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3314,8 +3729,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 136 VVV1_0( w_fp[4], w_fp[29], w_fp[58], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 136 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[135] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -3330,8 +3748,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 137 FFV1_0( w_fp[52], w_fp[9], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 137 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[136] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3344,8 +3765,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 138 FFV1_0( w_fp[52], w_fp[58], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 138 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[137] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3382,8 +3806,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 140 VVV1_0( w_fp[62], w_fp[63], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 140 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[139] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3402,8 +3829,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 141 VVV1_0( w_fp[62], w_fp[64], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 141 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[140] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3456,8 +3886,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 143 FFV1_0( w_fp[65], w_fp[55], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 143 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[142] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3470,8 +3903,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 144 FFV1_0( w_fp[3], w_fp[55], w_fp[64], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 144 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[143] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -3486,8 +3922,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 145 FFV1_0( w_fp[65], w_fp[57], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 145 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[144] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3500,8 +3939,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 146 FFV1_0( w_fp[3], w_fp[57], w_fp[63], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 146 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[145] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -3516,8 +3958,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 147 FFV1_0( w_fp[38], w_fp[66], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 147 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[146] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3530,8 +3975,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 148 VVV1_0( w_fp[61], w_fp[6], w_fp[67], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 148 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[147] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -3546,8 +3994,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 149 FFV1_0( w_fp[38], w_fp[57], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 149 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[148] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3560,8 +4011,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 150 FFV1_0( w_fp[41], w_fp[66], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 150 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[149] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3574,8 +4028,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 151 VVV1_0( w_fp[61], w_fp[5], w_fp[68], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 151 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[150] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -3590,8 +4047,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 152 FFV1_0( w_fp[41], w_fp[55], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 152 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[151] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3604,8 +4064,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 153 FFV1_0( w_fp[3], w_fp[66], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 153 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[152] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -3620,8 +4083,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 154 VVV1_0( w_fp[61], w_fp[29], w_fp[62], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 154 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[153] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3640,8 +4106,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 155 FFV1_0( w_fp[3], w_fp[58], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 155 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[154] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[17] -= amp_sv[0]; @@ -3657,8 +4126,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 156 VVV1_0( w_fp[62], w_fp[69], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 156 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[155] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3677,8 +4149,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 157 VVV1_0( w_fp[62], w_fp[70], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 157 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[156] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3731,8 +4206,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 159 FFV1_0( w_fp[71], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 159 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[158] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3745,8 +4223,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 160 FFV1_0( w_fp[3], w_fp[9], w_fp[70], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 160 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[159] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -3761,8 +4242,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 161 FFV1_0( w_fp[71], w_fp[57], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 161 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[160] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3775,8 +4259,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 162 FFV1_0( w_fp[3], w_fp[57], w_fp[69], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 162 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[161] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -3791,8 +4278,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 163 FFV1_0( w_fp[46], w_fp[72], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 163 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[162] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3805,8 +4295,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 164 VVV1_0( w_fp[66], w_fp[6], w_fp[73], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 164 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[163] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -3821,8 +4314,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 165 FFV1_0( w_fp[46], w_fp[57], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 165 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[164] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3835,8 +4331,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 166 FFV1_0( w_fp[41], w_fp[72], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 166 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[165] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3849,8 +4348,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 167 VVV1_0( w_fp[66], w_fp[4], w_fp[68], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 167 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[166] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -3865,8 +4367,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 168 FFV1_0( w_fp[41], w_fp[9], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 168 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[167] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -3879,8 +4384,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 169 FFV1_0( w_fp[3], w_fp[72], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 169 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[168] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[3] -= amp_sv[0]; @@ -3895,8 +4403,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 170 VVV1_0( w_fp[66], w_fp[27], w_fp[62], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 170 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[169] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3915,8 +4426,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 171 FFV1_0( w_fp[3], w_fp[60], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 171 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[170] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -3932,8 +4446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 172 VVV1_0( w_fp[62], w_fp[74], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 172 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[171] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -3952,8 +4469,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 173 VVV1_0( w_fp[62], w_fp[75], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 173 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[172] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4006,8 +4526,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 175 FFV1_0( w_fp[76], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 175 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[174] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4020,8 +4543,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 176 FFV1_0( w_fp[3], w_fp[9], w_fp[75], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 176 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[175] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -4036,8 +4562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 177 FFV1_0( w_fp[76], w_fp[55], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 177 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[176] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4050,8 +4579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 178 FFV1_0( w_fp[3], w_fp[55], w_fp[74], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 178 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[177] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -4066,8 +4598,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 179 FFV1_0( w_fp[46], w_fp[77], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 179 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[178] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4080,8 +4615,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 180 VVV1_0( w_fp[72], w_fp[5], w_fp[73], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 180 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[179] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -4096,8 +4634,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 181 FFV1_0( w_fp[46], w_fp[55], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 181 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[180] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[16] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4110,8 +4651,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 182 FFV1_0( w_fp[38], w_fp[77], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 182 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[181] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4124,8 +4668,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 183 VVV1_0( w_fp[72], w_fp[4], w_fp[67], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 183 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[182] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -4140,8 +4687,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 184 FFV1_0( w_fp[38], w_fp[9], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 184 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[183] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4154,8 +4704,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 185 FFV1_0( w_fp[3], w_fp[77], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 185 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[184] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -4170,8 +4723,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 186 VVV1_0( w_fp[72], w_fp[24], w_fp[62], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 186 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[185] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4190,8 +4746,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 187 FFV1_0( w_fp[3], w_fp[59], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 187 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[186] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[9] -= amp_sv[0]; @@ -4206,8 +4765,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 188 FFV1_0( w_fp[7], w_fp[77], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 188 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[187] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; @@ -4219,8 +4781,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 189 FFV1_0( w_fp[53], w_fp[77], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 189 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[188] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; @@ -4232,8 +4797,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 190 FFV1_0( w_fp[78], w_fp[55], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 190 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[189] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= amp_sv[0]; @@ -4245,8 +4813,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 191 FFV1_0( w_fp[53], w_fp[55], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 191 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[190] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] -= amp_sv[0]; @@ -4258,8 +4829,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 192 FFV1_0( w_fp[78], w_fp[57], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 192 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[191] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] -= amp_sv[0]; @@ -4271,8 +4845,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 193 FFV1_0( w_fp[7], w_fp[57], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 193 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[192] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] -= amp_sv[0]; @@ -4284,8 +4861,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 194 FFV1_0( w_fp[46], w_fp[77], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 194 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[193] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4298,8 +4878,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 195 VVV1_0( w_fp[1], w_fp[29], w_fp[73], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 195 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[194] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -4314,8 +4897,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 196 FFV1_0( w_fp[46], w_fp[58], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 196 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[195] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4328,8 +4914,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 197 FFV1_0( w_fp[25], w_fp[77], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 197 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[196] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; @@ -4341,8 +4930,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 198 FFV1_0( w_fp[48], w_fp[77], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 198 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[197] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -4354,8 +4946,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 199 FFV1_0( w_fp[58], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 199 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[198] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= amp_sv[0]; @@ -4367,8 +4962,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 200 FFV1_0( w_fp[48], w_fp[9], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 200 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[199] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= amp_sv[0]; @@ -4380,8 +4978,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 201 FFV1_0( w_fp[58], w_fp[57], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 201 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[200] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] -= amp_sv[0]; @@ -4393,8 +4994,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 202 FFV1_0( w_fp[25], w_fp[57], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 202 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[201] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= amp_sv[0]; @@ -4406,8 +5010,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 203 FFV1_0( w_fp[38], w_fp[77], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 203 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[202] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4420,8 +5027,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 204 VVV1_0( w_fp[1], w_fp[27], w_fp[67], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 204 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[203] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[4] -= amp_sv[0]; @@ -4436,8 +5046,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 205 FFV1_0( w_fp[38], w_fp[60], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 205 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[204] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4450,8 +5063,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 206 FFV1_0( w_fp[28], w_fp[77], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 206 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[205] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; @@ -4463,8 +5079,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 207 FFV1_0( w_fp[40], w_fp[77], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 207 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[206] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -4476,8 +5095,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 208 FFV1_0( w_fp[60], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 208 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[207] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= amp_sv[0]; @@ -4489,8 +5111,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 209 FFV1_0( w_fp[40], w_fp[9], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 209 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[208] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= amp_sv[0]; @@ -4502,8 +5127,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 210 FFV1_0( w_fp[60], w_fp[55], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 210 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[209] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] -= amp_sv[0]; @@ -4515,8 +5143,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 211 FFV1_0( w_fp[28], w_fp[55], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 211 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[210] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= amp_sv[0]; @@ -4528,8 +5159,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 212 FFV1_0( w_fp[41], w_fp[77], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 212 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[211] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4542,8 +5176,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 213 VVV1_0( w_fp[1], w_fp[24], w_fp[68], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 213 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[212] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -4558,8 +5195,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 214 FFV1_0( w_fp[41], w_fp[59], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 214 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[213] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4572,8 +5212,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 215 FFV1_0( w_fp[26], w_fp[77], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 215 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[214] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4586,8 +5229,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 216 FFV1_0( w_fp[3], w_fp[77], w_fp[42], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 216 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[215] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -4602,8 +5248,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 217 VVV1_0( w_fp[62], w_fp[59], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 217 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[216] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4622,8 +5271,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 218 VVV1_0( w_fp[62], w_fp[1], w_fp[42], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 218 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[217] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4676,8 +5328,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 220 FFV1_0( w_fp[3], w_fp[57], w_fp[59], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 220 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[219] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[19] -= amp_sv[0]; @@ -4692,8 +5347,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 221 FFV1_0( w_fp[26], w_fp[57], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 221 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[220] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4706,8 +5364,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 222 FFV1_0( w_fp[14], w_fp[77], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 222 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[221] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4720,8 +5381,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 223 FFV1_0( w_fp[3], w_fp[77], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 223 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[222] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -4736,8 +5400,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 224 VVV1_0( w_fp[62], w_fp[68], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 224 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[223] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4756,8 +5423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 225 VVV1_0( w_fp[62], w_fp[1], w_fp[16], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 225 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[224] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4810,8 +5480,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 227 FFV1_0( w_fp[3], w_fp[55], w_fp[68], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 227 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[226] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -4826,8 +5499,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 228 FFV1_0( w_fp[14], w_fp[55], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 228 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[227] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4840,8 +5516,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 229 FFV1_0( w_fp[12], w_fp[77], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 229 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[228] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -4854,8 +5533,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 230 FFV1_0( w_fp[3], w_fp[77], w_fp[19], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 230 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[229] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -4870,8 +5552,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 231 VVV1_0( w_fp[62], w_fp[67], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 231 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[230] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4890,8 +5575,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 232 VVV1_0( w_fp[62], w_fp[1], w_fp[19], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 232 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[231] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; @@ -4944,8 +5632,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 234 FFV1_0( w_fp[3], w_fp[9], w_fp[67], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 234 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[233] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -4960,8 +5651,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 235 FFV1_0( w_fp[12], w_fp[9], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 235 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[234] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5273,8 +5967,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 247 FFV1_0( w_fp[34], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 247 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[246] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[41] -= amp_sv[0]; @@ -5286,8 +5983,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 248 FFV1_0( w_fp[34], w_fp[85], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 248 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[247] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[47] -= amp_sv[0]; @@ -5300,8 +6000,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 249 FFV1_0( w_fp[86], w_fp[87], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 249 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[248] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] -= amp_sv[0]; @@ -5313,8 +6016,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 250 FFV1_0( w_fp[86], w_fp[85], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 250 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[249] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[45] -= amp_sv[0]; @@ -5326,8 +6032,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 251 FFV1_0( w_fp[88], w_fp[87], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 251 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[250] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] -= amp_sv[0]; @@ -5339,8 +6048,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 252 FFV1_0( w_fp[88], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 252 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[251] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[39] -= amp_sv[0]; @@ -5352,8 +6064,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 253 VVV1_0( w_fp[24], w_fp[6], w_fp[89], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 253 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[252] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += amp_sv[0]; jamp_sv[39] -= amp_sv[0]; @@ -5368,8 +6083,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 254 FFV1_0( w_fp[90], w_fp[77], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 254 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[253] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[45] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[47] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5382,8 +6100,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 255 FFV1_0( w_fp[88], w_fp[77], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 255 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[254] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[39] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5396,8 +6117,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 256 VVV1_0( w_fp[27], w_fp[5], w_fp[89], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 256 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[255] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] += amp_sv[0]; jamp_sv[39] -= amp_sv[0]; @@ -5412,8 +6136,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 257 FFV1_0( w_fp[91], w_fp[77], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 257 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[256] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[39] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[41] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5426,8 +6153,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 258 FFV1_0( w_fp[86], w_fp[77], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 258 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[257] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[45] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5440,8 +6170,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 259 VVV1_0( w_fp[4], w_fp[29], w_fp[89], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 259 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[258] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += amp_sv[0]; jamp_sv[35] -= amp_sv[0]; @@ -5456,8 +6189,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 260 FFV1_0( w_fp[34], w_fp[77], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 260 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[259] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[41] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[47] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5470,8 +6206,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 261 FFV1_0( w_fp[89], w_fp[77], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 261 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[260] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[35] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5506,8 +6245,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 263 VVV1_0( w_fp[92], w_fp[63], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 263 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[262] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[57] += cxtype( 0, 1 ) * amp_sv[0]; @@ -5526,8 +6268,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 264 VVV1_0( w_fp[92], w_fp[64], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 264 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[263] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[59] += cxtype( 0, 1 ) * amp_sv[0]; @@ -5580,8 +6325,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 266 FFV1_0( w_fp[86], w_fp[93], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 266 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[265] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[59] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5594,8 +6342,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 267 FFV1_0( w_fp[86], w_fp[2], w_fp[64], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 267 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[266] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] += amp_sv[0]; jamp_sv[59] -= amp_sv[0]; @@ -5610,8 +6361,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 268 FFV1_0( w_fp[88], w_fp[93], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 268 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[267] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[57] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5624,8 +6378,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 269 FFV1_0( w_fp[88], w_fp[2], w_fp[63], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 269 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[268] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += amp_sv[0]; jamp_sv[57] -= amp_sv[0]; @@ -5640,8 +6397,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 270 FFV1_0( w_fp[94], w_fp[39], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 270 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[269] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[93] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[95] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5654,8 +6414,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 271 VVV1_0( w_fp[61], w_fp[6], w_fp[95], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 271 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[270] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[81] += amp_sv[0]; jamp_sv[87] -= amp_sv[0]; @@ -5670,8 +6433,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 272 FFV1_0( w_fp[88], w_fp[39], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 272 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[271] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[81] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[87] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5684,8 +6450,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 273 FFV1_0( w_fp[94], w_fp[47], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 273 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[272] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[117] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[119] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5698,8 +6467,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 274 VVV1_0( w_fp[61], w_fp[5], w_fp[96], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 274 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[273] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[105] += amp_sv[0]; jamp_sv[111] -= amp_sv[0]; @@ -5714,8 +6486,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 275 FFV1_0( w_fp[86], w_fp[47], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 275 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[274] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[105] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[111] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5728,8 +6503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 276 FFV1_0( w_fp[94], w_fp[2], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 276 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[275] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[93] += amp_sv[0]; jamp_sv[95] -= amp_sv[0]; @@ -5744,8 +6522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 277 VVV1_0( w_fp[61], w_fp[29], w_fp[92], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 277 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[276] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[35] += cxtype( 0, 1 ) * amp_sv[0]; @@ -5764,8 +6545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 278 FFV1_0( w_fp[89], w_fp[2], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 278 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[277] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += amp_sv[0]; jamp_sv[35] -= amp_sv[0]; @@ -5780,8 +6564,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 279 VVV1_0( w_fp[92], w_fp[69], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 279 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[278] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[39] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[57] += cxtype( 0, 1 ) * amp_sv[0]; @@ -5800,8 +6587,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 280 VVV1_0( w_fp[92], w_fp[70], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 280 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[279] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[41] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[57] += cxtype( 0, 1 ) * amp_sv[0]; @@ -5854,8 +6644,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 282 FFV1_0( w_fp[34], w_fp[94], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 282 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[281] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[41] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[83] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5868,8 +6661,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 283 FFV1_0( w_fp[34], w_fp[2], w_fp[70], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 283 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[282] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[41] += amp_sv[0]; jamp_sv[83] -= amp_sv[0]; @@ -5884,8 +6680,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 284 FFV1_0( w_fp[88], w_fp[94], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 284 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[283] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[39] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[81] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5898,8 +6697,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 285 FFV1_0( w_fp[88], w_fp[2], w_fp[69], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 285 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[284] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[39] += amp_sv[0]; jamp_sv[57] -= amp_sv[0]; @@ -5914,8 +6716,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 286 FFV1_0( w_fp[97], w_fp[33], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 286 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[285] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[69] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[71] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5928,8 +6733,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 287 VVV1_0( w_fp[66], w_fp[6], w_fp[98], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 287 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[286] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[57] += amp_sv[0]; jamp_sv[63] -= amp_sv[0]; @@ -5944,8 +6752,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 288 FFV1_0( w_fp[88], w_fp[33], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 288 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[287] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[57] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[63] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5958,8 +6769,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 289 FFV1_0( w_fp[97], w_fp[47], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 289 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[288] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[111] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[113] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -5972,8 +6786,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 290 VVV1_0( w_fp[66], w_fp[4], w_fp[96], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 290 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[289] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[107] += amp_sv[0]; jamp_sv[111] -= amp_sv[0]; @@ -5988,8 +6805,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 291 FFV1_0( w_fp[34], w_fp[47], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 291 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[290] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[107] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[117] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6002,8 +6822,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 292 FFV1_0( w_fp[97], w_fp[2], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 292 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[291] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[69] += amp_sv[0]; jamp_sv[71] -= amp_sv[0]; @@ -6018,8 +6841,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 293 VVV1_0( w_fp[66], w_fp[27], w_fp[92], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 293 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[292] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[39] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[41] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6038,8 +6864,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 294 FFV1_0( w_fp[91], w_fp[2], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 294 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[293] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[39] += amp_sv[0]; jamp_sv[41] -= amp_sv[0]; @@ -6054,8 +6883,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 295 VVV1_0( w_fp[92], w_fp[74], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 295 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[294] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[45] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[59] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6074,8 +6906,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 296 VVV1_0( w_fp[92], w_fp[75], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 296 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[295] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[47] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[59] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6128,8 +6963,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 298 FFV1_0( w_fp[34], w_fp[97], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 298 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[297] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[47] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[107] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6142,8 +6980,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 299 FFV1_0( w_fp[34], w_fp[2], w_fp[75], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 299 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[298] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[47] += amp_sv[0]; jamp_sv[83] -= amp_sv[0]; @@ -6158,8 +6999,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 300 FFV1_0( w_fp[86], w_fp[97], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 300 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[299] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[45] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[105] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6172,8 +7016,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 301 FFV1_0( w_fp[86], w_fp[2], w_fp[74], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 301 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[300] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[45] += amp_sv[0]; jamp_sv[59] -= amp_sv[0]; @@ -6188,8 +7035,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 302 FFV1_0( w_fp[99], w_fp[33], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 302 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[301] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[63] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[65] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6202,8 +7052,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 303 VVV1_0( w_fp[72], w_fp[5], w_fp[98], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 303 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[302] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[59] += amp_sv[0]; jamp_sv[63] -= amp_sv[0]; @@ -6218,8 +7071,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 304 FFV1_0( w_fp[86], w_fp[33], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 304 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[303] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[59] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[69] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6232,8 +7088,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 305 FFV1_0( w_fp[99], w_fp[39], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 305 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[304] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[87] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[89] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6246,8 +7105,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 306 VVV1_0( w_fp[72], w_fp[4], w_fp[95], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 306 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[305] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[83] += amp_sv[0]; jamp_sv[87] -= amp_sv[0]; @@ -6262,8 +7124,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 307 FFV1_0( w_fp[34], w_fp[39], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 307 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[306] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[83] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[93] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6276,8 +7141,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 308 FFV1_0( w_fp[99], w_fp[2], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 308 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[307] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[63] += amp_sv[0]; jamp_sv[65] -= amp_sv[0]; @@ -6292,8 +7160,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 309 VVV1_0( w_fp[72], w_fp[24], w_fp[92], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 309 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[308] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[45] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[47] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6312,8 +7183,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 310 FFV1_0( w_fp[90], w_fp[2], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 310 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[309] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[45] += amp_sv[0]; jamp_sv[47] -= amp_sv[0]; @@ -6328,8 +7202,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 311 FFV1_0( w_fp[99], w_fp[35], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 311 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[310] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[65] -= amp_sv[0]; @@ -6341,8 +7218,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 312 FFV1_0( w_fp[99], w_fp[36], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 312 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[311] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[71] -= amp_sv[0]; @@ -6354,8 +7234,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 313 FFV1_0( w_fp[86], w_fp[100], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 313 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[312] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[59] -= amp_sv[0]; @@ -6367,8 +7250,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 314 FFV1_0( w_fp[86], w_fp[36], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 314 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[313] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[69] -= amp_sv[0]; @@ -6380,8 +7266,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 315 FFV1_0( w_fp[88], w_fp[100], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 315 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[314] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[57] -= amp_sv[0]; @@ -6393,8 +7282,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 316 FFV1_0( w_fp[88], w_fp[35], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 316 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[315] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[63] -= amp_sv[0]; @@ -6406,8 +7298,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 317 FFV1_0( w_fp[99], w_fp[33], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 317 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[316] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[65] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[71] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6420,8 +7315,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 318 VVV1_0( w_fp[1], w_fp[29], w_fp[98], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 318 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[317] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[57] += amp_sv[0]; jamp_sv[59] -= amp_sv[0]; @@ -6436,8 +7334,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 319 FFV1_0( w_fp[89], w_fp[33], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 319 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[318] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[57] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[59] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6450,8 +7351,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 320 FFV1_0( w_fp[99], w_fp[43], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 320 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[319] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[89] -= amp_sv[0]; @@ -6463,8 +7367,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 321 FFV1_0( w_fp[99], w_fp[44], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 321 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[320] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[95] -= amp_sv[0]; @@ -6476,8 +7383,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 322 FFV1_0( w_fp[34], w_fp[89], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 322 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[321] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[83] -= amp_sv[0]; @@ -6489,8 +7399,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 323 FFV1_0( w_fp[34], w_fp[44], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 323 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[322] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[93] -= amp_sv[0]; @@ -6502,8 +7415,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 324 FFV1_0( w_fp[88], w_fp[89], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 324 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[323] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[81] -= amp_sv[0]; @@ -6515,8 +7431,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 325 FFV1_0( w_fp[88], w_fp[43], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 325 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[324] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[87] -= amp_sv[0]; @@ -6528,8 +7447,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 326 FFV1_0( w_fp[99], w_fp[39], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 326 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[325] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[89] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[95] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6542,8 +7464,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 327 VVV1_0( w_fp[1], w_fp[27], w_fp[95], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 327 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[326] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[81] += amp_sv[0]; jamp_sv[83] -= amp_sv[0]; @@ -6558,8 +7483,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 328 FFV1_0( w_fp[91], w_fp[39], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 328 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[327] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[81] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[83] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6572,8 +7500,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 329 FFV1_0( w_fp[99], w_fp[49], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 329 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[328] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[113] -= amp_sv[0]; @@ -6585,8 +7516,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 330 FFV1_0( w_fp[99], w_fp[50], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 330 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[329] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[119] -= amp_sv[0]; @@ -6598,8 +7532,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 331 FFV1_0( w_fp[34], w_fp[91], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 331 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[330] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[107] -= amp_sv[0]; @@ -6611,8 +7548,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 332 FFV1_0( w_fp[34], w_fp[50], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 332 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[331] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[117] -= amp_sv[0]; @@ -6624,8 +7564,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 333 FFV1_0( w_fp[86], w_fp[91], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 333 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[332] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[105] -= amp_sv[0]; @@ -6637,8 +7580,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 334 FFV1_0( w_fp[86], w_fp[49], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 334 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[333] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[111] -= amp_sv[0]; @@ -6650,8 +7596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 335 FFV1_0( w_fp[99], w_fp[47], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 335 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[334] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[113] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[119] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6664,8 +7613,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 336 VVV1_0( w_fp[1], w_fp[24], w_fp[96], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 336 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[335] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[105] += amp_sv[0]; jamp_sv[107] -= amp_sv[0]; @@ -6680,8 +7632,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 337 FFV1_0( w_fp[90], w_fp[47], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 337 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[336] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[105] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[107] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6694,8 +7649,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 338 FFV1_0( w_fp[99], w_fp[17], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 338 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[337] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[65] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[89] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6708,8 +7666,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 339 FFV1_0( w_fp[99], w_fp[2], w_fp[42], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 339 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[338] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[65] += amp_sv[0]; jamp_sv[89] -= amp_sv[0]; @@ -6724,8 +7685,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 340 VVV1_0( w_fp[92], w_fp[59], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 340 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[339] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[39] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6744,8 +7708,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 341 VVV1_0( w_fp[92], w_fp[1], w_fp[42], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 341 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[340] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[39] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6798,8 +7765,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 343 FFV1_0( w_fp[88], w_fp[2], w_fp[59], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 343 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[342] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] += amp_sv[0]; jamp_sv[39] -= amp_sv[0]; @@ -6814,8 +7784,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 344 FFV1_0( w_fp[88], w_fp[17], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 344 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[343] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[63] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[87] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6828,8 +7801,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 345 FFV1_0( w_fp[99], w_fp[15], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 345 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[344] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[71] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[113] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6842,8 +7818,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 346 FFV1_0( w_fp[99], w_fp[2], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 346 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[345] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[71] += amp_sv[0]; jamp_sv[89] -= amp_sv[0]; @@ -6858,8 +7837,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 347 VVV1_0( w_fp[92], w_fp[68], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 347 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[346] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[45] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6878,8 +7860,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 348 VVV1_0( w_fp[92], w_fp[1], w_fp[16], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 348 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[347] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[39] += cxtype( 0, 1 ) * amp_sv[0]; @@ -6932,8 +7917,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 350 FFV1_0( w_fp[86], w_fp[2], w_fp[68], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 350 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[349] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[35] += amp_sv[0]; jamp_sv[45] -= amp_sv[0]; @@ -6948,8 +7936,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 351 FFV1_0( w_fp[86], w_fp[15], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 351 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[350] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[69] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[111] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6962,8 +7953,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 352 FFV1_0( w_fp[99], w_fp[18], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 352 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[351] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[95] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[119] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -6976,8 +7970,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 353 FFV1_0( w_fp[99], w_fp[2], w_fp[19], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 353 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[352] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[65] += amp_sv[0]; jamp_sv[71] -= amp_sv[0]; @@ -6992,8 +7989,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 354 VVV1_0( w_fp[92], w_fp[67], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 354 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[353] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[41] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[47] += cxtype( 0, 1 ) * amp_sv[0]; @@ -7012,8 +8012,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 355 VVV1_0( w_fp[92], w_fp[1], w_fp[19], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 355 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[354] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[33] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[35] += cxtype( 0, 1 ) * amp_sv[0]; @@ -7066,8 +8069,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 357 FFV1_0( w_fp[34], w_fp[2], w_fp[67], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 357 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[356] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[41] += amp_sv[0]; jamp_sv[47] -= amp_sv[0]; @@ -7082,8 +8088,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 358 FFV1_0( w_fp[34], w_fp[18], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 358 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[357] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[93] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[117] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7387,8 +8396,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 370 FFV1_0( w_fp[99], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 370 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[369] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[41] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7401,8 +8413,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 371 FFV1_0( w_fp[99], w_fp[85], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 371 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[370] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[46] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[47] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7416,8 +8431,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 372 VVV1_0( w_fp[62], w_fp[34], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 372 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[371] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[30] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7436,8 +8454,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 373 FFV1_0( w_fp[3], w_fp[85], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 373 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[372] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] += amp_sv[0]; jamp_sv[44] -= amp_sv[0]; @@ -7452,8 +8473,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 374 VVV1_0( w_fp[86], w_fp[34], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 374 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[373] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[31] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7472,8 +8496,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 375 FFV1_0( w_fp[3], w_fp[9], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 375 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[374] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] += amp_sv[0]; jamp_sv[38] -= amp_sv[0]; @@ -7524,8 +8551,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 377 FFV1_0( w_fp[38], w_fp[95], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 377 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[376] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[31] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7538,8 +8568,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 378 FFV1_0( w_fp[98], w_fp[77], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 378 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[377] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[44] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7552,8 +8585,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 379 FFV1_0( w_fp[38], w_fp[77], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 379 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[378] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += amp_sv[0]; jamp_sv[31] -= amp_sv[0]; @@ -7568,8 +8604,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 380 FFV1_0( w_fp[41], w_fp[95], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 380 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[379] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[30] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7582,8 +8621,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 381 FFV1_0( w_fp[101], w_fp[77], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 381 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[380] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[38] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7596,8 +8638,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 382 FFV1_0( w_fp[41], w_fp[77], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 382 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[381] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += amp_sv[0]; jamp_sv[30] -= amp_sv[0]; @@ -7612,8 +8657,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 383 FFV1_0( w_fp[3], w_fp[95], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 383 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[382] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += amp_sv[0]; jamp_sv[25] -= amp_sv[0]; @@ -7628,8 +8676,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 384 FFV1_0( w_fp[99], w_fp[77], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 384 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[383] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] += amp_sv[0]; jamp_sv[41] -= amp_sv[0]; @@ -7644,8 +8695,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 385 FFV1_0( w_fp[3], w_fp[77], w_fp[95], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 385 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[384] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[25] += cxtype( 0, 1 ) * amp_sv[0]; @@ -7664,8 +8718,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 386 FFV1_0( w_fp[22], w_fp[102], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 386 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[385] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7678,8 +8735,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 387 FFV1_0( w_fp[21], w_fp[102], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 387 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[386] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[51] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7692,8 +8752,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 388 VVV1_0( w_fp[62], w_fp[103], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 388 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[387] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[51] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7712,8 +8775,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 389 FFV1_0( w_fp[21], w_fp[2], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 389 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[388] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[51] -= amp_sv[0]; @@ -7728,8 +8794,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 390 VVV1_0( w_fp[86], w_fp[103], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 390 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[389] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7748,8 +8817,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 391 FFV1_0( w_fp[22], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 391 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[390] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[53] -= amp_sv[0]; @@ -7798,8 +8870,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 393 FFV1_0( w_fp[104], w_fp[39], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 393 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[392] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[91] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[94] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7812,8 +8887,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 394 FFV1_0( w_fp[52], w_fp[105], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 394 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[393] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[75] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[85] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7826,8 +8904,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 395 FFV1_0( w_fp[52], w_fp[39], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 395 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[394] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[75] += amp_sv[0]; jamp_sv[85] -= amp_sv[0]; @@ -7842,8 +8923,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 396 FFV1_0( w_fp[104], w_fp[47], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 396 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[395] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[115] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[118] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7856,8 +8940,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 397 FFV1_0( w_fp[52], w_fp[106], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 397 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[396] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[99] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[109] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -7870,8 +8957,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 398 FFV1_0( w_fp[52], w_fp[47], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 398 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[397] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[99] += amp_sv[0]; jamp_sv[109] -= amp_sv[0]; @@ -7886,8 +8976,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 399 FFV1_0( w_fp[104], w_fp[2], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 399 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[398] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[91] += amp_sv[0]; jamp_sv[94] -= amp_sv[0]; @@ -7902,8 +8995,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 400 FFV1_0( w_fp[52], w_fp[102], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 400 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[399] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -7918,8 +9014,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 401 FFV1_0( w_fp[52], w_fp[2], w_fp[95], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 401 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[400] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; @@ -7938,8 +9037,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 402 FFV1_0( w_fp[71], w_fp[102], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 402 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[401] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -7954,8 +9056,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 403 FFV1_0( w_fp[3], w_fp[102], w_fp[70], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 403 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[402] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; @@ -7974,8 +9079,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 404 FFV1_0( w_fp[99], w_fp[94], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 404 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[403] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] += amp_sv[0]; jamp_sv[41] -= amp_sv[0]; @@ -7990,8 +9098,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 405 FFV1_0( w_fp[99], w_fp[2], w_fp[70], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 405 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[404] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[41] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8010,8 +9121,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 406 FFV1_0( w_fp[3], w_fp[94], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 406 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[405] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[38] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8030,8 +9144,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 407 FFV1_0( w_fp[71], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 407 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[406] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8108,8 +9225,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 409 VVV1_0( w_fp[8], w_fp[6], w_fp[104], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 409 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[408] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -8136,8 +9256,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 410 VVV1_0( w_fp[66], w_fp[6], w_fp[107], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 410 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[409] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -8164,8 +9287,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 411 VVV1_0( w_fp[66], w_fp[8], w_fp[86], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 411 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[410] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= amp_sv[0]; jamp_sv[11] += amp_sv[0]; @@ -8192,8 +9318,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 412 FFV1_0( w_fp[3], w_fp[47], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 412 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[411] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[98] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[99] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8212,8 +9341,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 413 FFV1_0( w_fp[3], w_fp[106], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 413 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[412] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[98] += amp_sv[0]; jamp_sv[99] -= amp_sv[0]; @@ -8228,8 +9360,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 414 FFV1_0( w_fp[99], w_fp[47], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 414 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[413] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[106] += amp_sv[0]; jamp_sv[107] -= amp_sv[0]; @@ -8244,8 +9379,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 415 FFV1_0( w_fp[41], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 415 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[414] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8264,8 +9402,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 416 FFV1_0( w_fp[41], w_fp[102], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 416 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[415] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -8280,8 +9421,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 417 FFV1_0( w_fp[101], w_fp[2], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 417 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[416] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] += amp_sv[0]; jamp_sv[38] -= amp_sv[0]; @@ -8296,8 +9440,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 418 FFV1_0( w_fp[76], w_fp[102], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 418 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[417] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[9] -= amp_sv[0]; @@ -8312,8 +9459,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 419 FFV1_0( w_fp[3], w_fp[102], w_fp[75], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 419 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[418] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8332,8 +9482,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 420 FFV1_0( w_fp[99], w_fp[97], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 420 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[419] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[46] += amp_sv[0]; jamp_sv[47] -= amp_sv[0]; @@ -8348,8 +9501,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 421 FFV1_0( w_fp[99], w_fp[2], w_fp[75], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 421 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[420] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[46] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[47] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8368,8 +9524,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 422 FFV1_0( w_fp[3], w_fp[97], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 422 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[421] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[44] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8388,8 +9547,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 423 FFV1_0( w_fp[76], w_fp[2], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 423 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[422] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8466,8 +9628,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 425 VVV1_0( w_fp[8], w_fp[5], w_fp[104], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 425 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[424] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += amp_sv[0]; jamp_sv[10] -= amp_sv[0]; @@ -8494,8 +9659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 426 VVV1_0( w_fp[72], w_fp[5], w_fp[107], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 426 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[425] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -8522,8 +9690,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 427 VVV1_0( w_fp[72], w_fp[8], w_fp[62], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 427 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[426] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= amp_sv[0]; jamp_sv[9] += amp_sv[0]; @@ -8550,8 +9721,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 428 FFV1_0( w_fp[3], w_fp[39], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 428 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[427] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[74] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[75] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8570,8 +9744,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 429 FFV1_0( w_fp[3], w_fp[105], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 429 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[428] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[74] += amp_sv[0]; jamp_sv[75] -= amp_sv[0]; @@ -8586,8 +9763,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 430 FFV1_0( w_fp[99], w_fp[39], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 430 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[429] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[82] += amp_sv[0]; jamp_sv[83] -= amp_sv[0]; @@ -8602,8 +9782,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 431 FFV1_0( w_fp[38], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 431 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[430] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; @@ -8622,8 +9805,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 432 FFV1_0( w_fp[38], w_fp[102], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 432 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[431] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += amp_sv[0]; jamp_sv[10] -= amp_sv[0]; @@ -8638,8 +9824,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 433 FFV1_0( w_fp[98], w_fp[2], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 433 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[432] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] += amp_sv[0]; jamp_sv[44] -= amp_sv[0]; @@ -8654,8 +9843,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 434 VVV1_0( w_fp[104], w_fp[10], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 434 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[433] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= amp_sv[0]; jamp_sv[25] += amp_sv[0]; @@ -8682,8 +9874,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 435 VVV1_0( w_fp[104], w_fp[11], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 435 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[434] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= amp_sv[0]; jamp_sv[24] += amp_sv[0]; @@ -8768,8 +9963,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 437 VVV1_0( w_fp[62], w_fp[108], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 437 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[436] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[24] -= amp_sv[0]; @@ -8796,8 +9994,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 438 VVV1_0( w_fp[62], w_fp[1], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 438 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[437] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[24] -= amp_sv[0]; @@ -8882,8 +10083,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 440 VVV1_0( w_fp[86], w_fp[108], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 440 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[439] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[25] -= amp_sv[0]; @@ -8910,8 +10114,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 441 VVV1_0( w_fp[86], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 441 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[440] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[25] -= amp_sv[0]; @@ -9232,8 +10439,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 447 VVV1_0( w_fp[8], w_fp[29], w_fp[104], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 447 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[446] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -9260,8 +10470,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 448 VVV1_0( w_fp[1], w_fp[29], w_fp[107], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 448 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[447] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -9288,8 +10501,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 449 VVV1_0( w_fp[1], w_fp[8], w_fp[95], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 449 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[448] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] -= amp_sv[0]; jamp_sv[11] += amp_sv[0]; @@ -9316,8 +10532,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 450 VVV1_0( w_fp[104], w_fp[45], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 450 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[449] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[74] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[78] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9336,8 +10555,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 451 FFV1_0( w_fp[3], w_fp[44], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 451 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[450] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[91] += amp_sv[0]; jamp_sv[92] -= amp_sv[0]; @@ -9352,8 +10574,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 452 FFV1_0( w_fp[99], w_fp[89], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 452 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[451] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[82] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[83] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9366,8 +10591,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 453 FFV1_0( w_fp[99], w_fp[44], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 453 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[452] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[92] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[93] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9380,8 +10608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 454 FFV1_0( w_fp[3], w_fp[89], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 454 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[453] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[78] += amp_sv[0]; jamp_sv[80] -= amp_sv[0]; @@ -9396,8 +10627,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 455 VVV1_0( w_fp[86], w_fp[1], w_fp[45], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 455 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[454] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[75] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[78] += cxtype( 0, 1 ) * amp_sv[0]; @@ -9450,8 +10684,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 457 FFV1_0( w_fp[41], w_fp[39], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 457 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[456] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[74] += amp_sv[0]; jamp_sv[78] -= amp_sv[0]; @@ -9466,8 +10703,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 458 FFV1_0( w_fp[41], w_fp[105], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 458 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[457] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[74] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[84] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9480,8 +10720,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 459 FFV1_0( w_fp[101], w_fp[39], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 459 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[458] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[78] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[80] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9494,8 +10737,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 460 VVV1_0( w_fp[104], w_fp[51], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 460 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[459] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[98] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[102] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9514,8 +10760,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 461 FFV1_0( w_fp[3], w_fp[50], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 461 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[460] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[115] += amp_sv[0]; jamp_sv[116] -= amp_sv[0]; @@ -9530,8 +10779,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 462 FFV1_0( w_fp[99], w_fp[91], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 462 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[461] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[106] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[107] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9544,8 +10796,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 463 FFV1_0( w_fp[99], w_fp[50], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 463 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[462] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[116] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[117] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9558,8 +10813,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 464 FFV1_0( w_fp[3], w_fp[91], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 464 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[463] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[102] += amp_sv[0]; jamp_sv[104] -= amp_sv[0]; @@ -9574,8 +10832,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 465 VVV1_0( w_fp[62], w_fp[1], w_fp[51], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 465 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[464] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[99] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[102] += cxtype( 0, 1 ) * amp_sv[0]; @@ -9628,8 +10889,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 467 FFV1_0( w_fp[38], w_fp[47], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 467 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[466] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[98] += amp_sv[0]; jamp_sv[102] -= amp_sv[0]; @@ -9644,8 +10908,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 468 FFV1_0( w_fp[38], w_fp[106], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 468 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[467] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[98] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[108] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9658,8 +10925,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 469 FFV1_0( w_fp[98], w_fp[47], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 469 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[468] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[102] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[104] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9672,8 +10942,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 470 VVV1_0( w_fp[104], w_fp[23], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 470 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[469] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[25] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9692,8 +10965,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 471 FFV1_0( w_fp[48], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 471 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[470] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += amp_sv[0]; jamp_sv[25] -= amp_sv[0]; @@ -9708,8 +10984,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 472 FFV1_0( w_fp[58], w_fp[102], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 472 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[471] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[52] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9722,8 +11001,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 473 FFV1_0( w_fp[48], w_fp[102], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 473 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[472] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[49] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9736,8 +11018,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 474 FFV1_0( w_fp[58], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 474 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[473] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[52] -= amp_sv[0]; @@ -9752,8 +11037,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 475 VVV1_0( w_fp[86], w_fp[1], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 475 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[474] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[25] += cxtype( 0, 1 ) * amp_sv[0]; @@ -9806,8 +11094,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 477 VVV1_0( w_fp[104], w_fp[20], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 477 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[476] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[24] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9826,8 +11117,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 478 FFV1_0( w_fp[40], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 478 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[477] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[24] -= amp_sv[0]; @@ -9842,8 +11136,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 479 FFV1_0( w_fp[60], w_fp[102], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 479 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[478] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[50] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9856,8 +11153,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 480 FFV1_0( w_fp[40], w_fp[102], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 480 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[479] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[48] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -9870,8 +11170,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 481 FFV1_0( w_fp[60], w_fp[2], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 481 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[480] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[50] -= amp_sv[0]; @@ -9886,8 +11189,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 482 VVV1_0( w_fp[62], w_fp[1], w_fp[20], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 482 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[481] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; @@ -9940,8 +11246,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 484 FFV1_0( w_fp[3], w_fp[18], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 484 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[483] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[91] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[92] += cxtype( 0, 1 ) * amp_sv[0]; @@ -9960,8 +11269,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 485 FFV1_0( w_fp[12], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 485 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[484] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -9980,8 +11292,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 486 FFV1_0( w_fp[3], w_fp[102], w_fp[67], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 486 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[485] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10000,8 +11315,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 487 FFV1_0( w_fp[12], w_fp[102], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 487 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[486] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -10016,8 +11334,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 488 FFV1_0( w_fp[99], w_fp[2], w_fp[67], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 488 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[487] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[41] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10036,8 +11357,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 489 FFV1_0( w_fp[99], w_fp[18], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 489 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[488] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[92] += amp_sv[0]; jamp_sv[93] -= amp_sv[0]; @@ -10179,8 +11503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 493 FFV1_0( w_fp[99], w_fp[87], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 493 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[492] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[35] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10193,8 +11520,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 494 FFV1_0( w_fp[99], w_fp[85], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 494 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[493] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[44] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[45] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10207,8 +11537,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 495 VVV1_0( w_fp[102], w_fp[34], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 495 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[494] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[26] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[30] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10227,8 +11560,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 496 FFV1_0( w_fp[3], w_fp[85], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 496 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[495] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[43] += amp_sv[0]; jamp_sv[44] -= amp_sv[0]; @@ -10243,8 +11579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 497 VVV1_0( w_fp[104], w_fp[34], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 497 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[496] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[27] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[30] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10263,8 +11602,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 498 FFV1_0( w_fp[3], w_fp[87], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 498 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[497] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] += amp_sv[0]; jamp_sv[32] -= amp_sv[0]; @@ -10315,8 +11657,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 500 FFV1_0( w_fp[46], w_fp[62], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 500 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[499] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[27] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[37] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10329,8 +11674,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 501 FFV1_0( w_fp[114], w_fp[77], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 501 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[500] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[43] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[46] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10343,8 +11691,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 502 FFV1_0( w_fp[46], w_fp[77], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 502 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[501] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[27] += amp_sv[0]; jamp_sv[37] -= amp_sv[0]; @@ -10359,8 +11710,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 503 FFV1_0( w_fp[41], w_fp[62], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 503 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[502] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[26] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[36] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10373,8 +11727,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 504 FFV1_0( w_fp[113], w_fp[77], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 504 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[503] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[32] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10387,8 +11744,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 505 FFV1_0( w_fp[41], w_fp[77], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 505 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[504] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[26] += amp_sv[0]; jamp_sv[30] -= amp_sv[0]; @@ -10403,8 +11763,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 506 FFV1_0( w_fp[3], w_fp[62], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 506 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[505] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[26] += amp_sv[0]; jamp_sv[27] -= amp_sv[0]; @@ -10419,8 +11782,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 507 FFV1_0( w_fp[99], w_fp[77], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 507 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[506] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] += amp_sv[0]; jamp_sv[35] -= amp_sv[0]; @@ -10435,8 +11801,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 508 FFV1_0( w_fp[3], w_fp[77], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 508 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[507] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[27] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10455,8 +11824,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 509 FFV1_0( w_fp[56], w_fp[112], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 509 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[508] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[77] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10469,8 +11841,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 510 FFV1_0( w_fp[21], w_fp[112], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 510 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[509] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[75] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10483,8 +11858,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 511 VVV1_0( w_fp[102], w_fp[103], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 511 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[510] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[51] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10503,8 +11881,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 512 FFV1_0( w_fp[21], w_fp[2], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 512 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[511] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += amp_sv[0]; jamp_sv[51] -= amp_sv[0]; @@ -10519,8 +11900,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 513 VVV1_0( w_fp[104], w_fp[103], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 513 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[512] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[51] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10539,8 +11923,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 514 FFV1_0( w_fp[56], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 514 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[513] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += amp_sv[0]; jamp_sv[77] -= amp_sv[0]; @@ -10589,8 +11976,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 516 FFV1_0( w_fp[86], w_fp[33], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 516 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[515] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[67] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[70] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10603,8 +11993,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 517 FFV1_0( w_fp[52], w_fp[98], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 517 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[516] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[51] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[61] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10617,8 +12010,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 518 FFV1_0( w_fp[52], w_fp[33], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 518 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[517] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[51] += amp_sv[0]; jamp_sv[61] -= amp_sv[0]; @@ -10633,8 +12029,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 519 FFV1_0( w_fp[86], w_fp[47], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 519 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[518] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[109] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[112] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10647,8 +12046,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 520 FFV1_0( w_fp[52], w_fp[106], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 520 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[519] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[101] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[115] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -10661,8 +12063,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 521 FFV1_0( w_fp[52], w_fp[47], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 521 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[520] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[101] += amp_sv[0]; jamp_sv[109] -= amp_sv[0]; @@ -10677,8 +12082,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 522 FFV1_0( w_fp[86], w_fp[2], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 522 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[521] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[67] += amp_sv[0]; jamp_sv[70] -= amp_sv[0]; @@ -10693,8 +12101,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 523 FFV1_0( w_fp[52], w_fp[112], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 523 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[522] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += amp_sv[0]; jamp_sv[17] -= amp_sv[0]; @@ -10709,8 +12120,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 524 FFV1_0( w_fp[52], w_fp[2], w_fp[62], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 524 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[523] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10729,8 +12143,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 525 FFV1_0( w_fp[65], w_fp[112], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 525 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[524] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[17] -= amp_sv[0]; @@ -10745,8 +12162,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 526 FFV1_0( w_fp[3], w_fp[112], w_fp[64], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 526 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[525] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10765,8 +12185,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 527 FFV1_0( w_fp[99], w_fp[93], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 527 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[526] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] += amp_sv[0]; jamp_sv[35] -= amp_sv[0]; @@ -10781,8 +12204,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 528 FFV1_0( w_fp[99], w_fp[2], w_fp[64], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 528 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[527] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[35] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10801,8 +12227,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 529 FFV1_0( w_fp[3], w_fp[93], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 529 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[528] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[32] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10821,8 +12250,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 530 FFV1_0( w_fp[65], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 530 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[529] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; @@ -10899,8 +12331,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 532 VVV1_0( w_fp[8], w_fp[6], w_fp[86], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 532 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[531] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -10927,8 +12362,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 533 VVV1_0( w_fp[61], w_fp[6], w_fp[101], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 533 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[532] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -10955,8 +12393,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 534 VVV1_0( w_fp[61], w_fp[8], w_fp[104], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 534 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[533] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= amp_sv[0]; jamp_sv[17] += amp_sv[0]; @@ -10983,8 +12424,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 535 FFV1_0( w_fp[3], w_fp[47], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 535 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[534] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[100] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[101] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11003,8 +12447,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 536 FFV1_0( w_fp[3], w_fp[106], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 536 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[535] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[100] += amp_sv[0]; jamp_sv[101] -= amp_sv[0]; @@ -11019,8 +12466,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 537 FFV1_0( w_fp[99], w_fp[47], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 537 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[536] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[104] += amp_sv[0]; jamp_sv[105] -= amp_sv[0]; @@ -11035,8 +12485,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 538 FFV1_0( w_fp[41], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 538 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[537] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11055,8 +12508,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 539 FFV1_0( w_fp[41], w_fp[112], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 539 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[538] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -11071,8 +12527,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 540 FFV1_0( w_fp[113], w_fp[2], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 540 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[539] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] += amp_sv[0]; jamp_sv[32] -= amp_sv[0]; @@ -11087,8 +12546,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 541 FFV1_0( w_fp[76], w_fp[112], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 541 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[540] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -11103,8 +12565,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 542 FFV1_0( w_fp[3], w_fp[112], w_fp[74], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 542 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[541] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11123,8 +12588,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 543 FFV1_0( w_fp[99], w_fp[97], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 543 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[542] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[44] += amp_sv[0]; jamp_sv[45] -= amp_sv[0]; @@ -11139,8 +12607,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 544 FFV1_0( w_fp[99], w_fp[2], w_fp[74], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 544 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[543] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[44] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[45] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11159,8 +12630,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 545 FFV1_0( w_fp[3], w_fp[97], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 545 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[544] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[43] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[44] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11179,8 +12653,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 546 FFV1_0( w_fp[76], w_fp[2], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 546 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[545] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11257,8 +12734,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 548 VVV1_0( w_fp[8], w_fp[4], w_fp[86], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 548 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[547] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += amp_sv[0]; jamp_sv[16] -= amp_sv[0]; @@ -11285,8 +12765,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 549 VVV1_0( w_fp[72], w_fp[4], w_fp[101], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 549 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[548] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -11313,8 +12796,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 550 VVV1_0( w_fp[72], w_fp[8], w_fp[102], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 550 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[549] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] -= amp_sv[0]; jamp_sv[15] += amp_sv[0]; @@ -11341,8 +12827,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 551 FFV1_0( w_fp[3], w_fp[33], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 551 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[550] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[50] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[51] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11361,8 +12850,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 552 FFV1_0( w_fp[3], w_fp[98], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 552 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[551] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[50] += amp_sv[0]; jamp_sv[51] -= amp_sv[0]; @@ -11377,8 +12869,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 553 FFV1_0( w_fp[99], w_fp[33], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 553 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[552] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[58] += amp_sv[0]; jamp_sv[59] -= amp_sv[0]; @@ -11393,8 +12888,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 554 FFV1_0( w_fp[46], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 554 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[553] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; @@ -11413,8 +12911,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 555 FFV1_0( w_fp[46], w_fp[112], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 555 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[554] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += amp_sv[0]; jamp_sv[16] -= amp_sv[0]; @@ -11429,8 +12930,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 556 FFV1_0( w_fp[114], w_fp[2], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 556 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[555] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[43] += amp_sv[0]; jamp_sv[46] -= amp_sv[0]; @@ -11445,8 +12949,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 557 VVV1_0( w_fp[86], w_fp[13], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 557 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[556] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] -= amp_sv[0]; jamp_sv[27] += amp_sv[0]; @@ -11473,8 +12980,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 558 VVV1_0( w_fp[86], w_fp[11], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 558 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[557] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= amp_sv[0]; jamp_sv[26] += amp_sv[0]; @@ -11559,8 +13069,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 560 VVV1_0( w_fp[102], w_fp[108], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 560 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[559] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += amp_sv[0]; jamp_sv[26] -= amp_sv[0]; @@ -11587,8 +13100,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 561 VVV1_0( w_fp[102], w_fp[1], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 561 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[560] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] += amp_sv[0]; jamp_sv[26] -= amp_sv[0]; @@ -11673,8 +13189,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 563 VVV1_0( w_fp[104], w_fp[108], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 563 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[562] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += amp_sv[0]; jamp_sv[27] -= amp_sv[0]; @@ -11701,8 +13220,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 564 VVV1_0( w_fp[104], w_fp[1], w_fp[13], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 564 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[563] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[27] -= amp_sv[0]; @@ -12023,8 +13545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 570 VVV1_0( w_fp[8], w_fp[27], w_fp[86], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 570 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[569] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -12051,8 +13576,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 571 VVV1_0( w_fp[1], w_fp[27], w_fp[101], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 571 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[570] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -12079,8 +13607,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 572 VVV1_0( w_fp[1], w_fp[8], w_fp[62], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 572 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[571] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] -= amp_sv[0]; jamp_sv[17] += amp_sv[0]; @@ -12107,8 +13638,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 573 VVV1_0( w_fp[86], w_fp[37], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 573 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[572] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[50] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[54] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12127,8 +13661,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 574 FFV1_0( w_fp[3], w_fp[36], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 574 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[573] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[67] += amp_sv[0]; jamp_sv[68] -= amp_sv[0]; @@ -12143,8 +13680,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 575 FFV1_0( w_fp[99], w_fp[100], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 575 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[574] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[58] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[59] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12157,8 +13697,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 576 FFV1_0( w_fp[99], w_fp[36], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 576 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[575] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[68] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[69] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12171,8 +13714,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 577 FFV1_0( w_fp[3], w_fp[100], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 577 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[576] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[54] += amp_sv[0]; jamp_sv[56] -= amp_sv[0]; @@ -12187,8 +13733,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 578 VVV1_0( w_fp[104], w_fp[1], w_fp[37], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 578 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[577] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[51] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[54] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12241,8 +13790,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 580 FFV1_0( w_fp[41], w_fp[33], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 580 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[579] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[50] += amp_sv[0]; jamp_sv[54] -= amp_sv[0]; @@ -12257,8 +13809,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 581 FFV1_0( w_fp[41], w_fp[98], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 581 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[580] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[50] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[60] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12271,8 +13826,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 582 FFV1_0( w_fp[113], w_fp[33], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 582 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[581] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[54] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[56] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12285,8 +13843,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 583 VVV1_0( w_fp[86], w_fp[51], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 583 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[582] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[100] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[103] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12305,8 +13866,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 584 FFV1_0( w_fp[3], w_fp[49], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 584 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[583] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[109] += amp_sv[0]; jamp_sv[110] -= amp_sv[0]; @@ -12321,8 +13885,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 585 FFV1_0( w_fp[99], w_fp[91], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 585 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[584] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[104] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[105] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12335,8 +13902,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 586 FFV1_0( w_fp[99], w_fp[49], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 586 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[585] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[110] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[111] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12349,8 +13919,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 587 FFV1_0( w_fp[3], w_fp[91], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 587 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[586] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[103] += amp_sv[0]; jamp_sv[104] -= amp_sv[0]; @@ -12365,8 +13938,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 588 VVV1_0( w_fp[102], w_fp[1], w_fp[51], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 588 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[587] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[101] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[103] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12419,8 +13995,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 590 FFV1_0( w_fp[46], w_fp[47], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 590 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[589] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[100] += amp_sv[0]; jamp_sv[103] -= amp_sv[0]; @@ -12435,8 +14014,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 591 FFV1_0( w_fp[46], w_fp[106], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 591 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[590] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[100] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[114] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12449,8 +14031,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 592 FFV1_0( w_fp[114], w_fp[47], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 592 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[591] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[103] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[106] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12463,8 +14048,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 593 VVV1_0( w_fp[86], w_fp[54], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 593 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[592] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[27] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12483,8 +14071,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 594 FFV1_0( w_fp[53], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 594 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[593] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += amp_sv[0]; jamp_sv[27] -= amp_sv[0]; @@ -12499,8 +14090,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 595 FFV1_0( w_fp[78], w_fp[112], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 595 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[594] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[76] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12513,8 +14107,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 596 FFV1_0( w_fp[53], w_fp[112], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 596 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[595] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[73] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12527,8 +14124,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 597 FFV1_0( w_fp[78], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 597 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[596] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[76] -= amp_sv[0]; @@ -12543,8 +14143,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 598 VVV1_0( w_fp[104], w_fp[1], w_fp[54], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 598 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[597] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[27] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12597,8 +14200,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 600 VVV1_0( w_fp[86], w_fp[20], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 600 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[599] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12617,8 +14223,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 601 FFV1_0( w_fp[28], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 601 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[600] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[26] -= amp_sv[0]; @@ -12633,8 +14242,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 602 FFV1_0( w_fp[60], w_fp[112], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 602 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[601] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[74] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12647,8 +14259,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 603 FFV1_0( w_fp[28], w_fp[112], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 603 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[602] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[72] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12661,8 +14276,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 604 FFV1_0( w_fp[60], w_fp[2], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 604 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[603] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] += amp_sv[0]; jamp_sv[50] -= amp_sv[0]; @@ -12677,8 +14295,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 605 VVV1_0( w_fp[102], w_fp[1], w_fp[20], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 605 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[604] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12731,8 +14352,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 607 FFV1_0( w_fp[3], w_fp[15], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 607 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[606] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[67] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[68] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12751,8 +14375,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 608 FFV1_0( w_fp[14], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 608 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[607] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12771,8 +14398,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 609 FFV1_0( w_fp[3], w_fp[112], w_fp[68], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 609 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[608] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12791,8 +14421,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 610 FFV1_0( w_fp[14], w_fp[112], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 610 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[609] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -12807,8 +14440,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 611 FFV1_0( w_fp[99], w_fp[2], w_fp[68], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 611 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[610] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[35] += cxtype( 0, 1 ) * amp_sv[0]; @@ -12827,8 +14463,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 612 FFV1_0( w_fp[99], w_fp[15], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 612 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[611] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[68] += amp_sv[0]; jamp_sv[69] -= amp_sv[0]; @@ -12970,8 +14609,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 616 FFV1_0( w_fp[99], w_fp[87], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 616 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[615] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[33] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12984,8 +14626,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 617 FFV1_0( w_fp[99], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 617 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[616] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[38] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[39] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -12998,8 +14643,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 618 VVV1_0( w_fp[112], w_fp[34], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 618 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[617] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[28] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[31] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13018,8 +14666,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 619 FFV1_0( w_fp[3], w_fp[9], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 619 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[618] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[37] += amp_sv[0]; jamp_sv[38] -= amp_sv[0]; @@ -13034,8 +14685,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 620 VVV1_0( w_fp[86], w_fp[34], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 620 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[619] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[29] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[31] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13054,8 +14708,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 621 FFV1_0( w_fp[3], w_fp[87], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 621 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[620] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[31] += amp_sv[0]; jamp_sv[32] -= amp_sv[0]; @@ -13106,8 +14763,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 623 FFV1_0( w_fp[46], w_fp[102], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 623 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[622] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[29] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[43] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13120,8 +14780,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 624 FFV1_0( w_fp[88], w_fp[77], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 624 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[623] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[37] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[40] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13134,8 +14797,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 625 FFV1_0( w_fp[46], w_fp[77], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 625 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[624] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[29] += amp_sv[0]; jamp_sv[37] -= amp_sv[0]; @@ -13150,8 +14816,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 626 FFV1_0( w_fp[38], w_fp[102], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 626 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[625] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[28] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[42] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13164,8 +14833,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 627 FFV1_0( w_fp[90], w_fp[77], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 627 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[626] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[31] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[34] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13178,8 +14850,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 628 FFV1_0( w_fp[38], w_fp[77], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 628 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[627] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[28] += amp_sv[0]; jamp_sv[31] -= amp_sv[0]; @@ -13194,8 +14869,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 629 FFV1_0( w_fp[3], w_fp[102], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 629 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[628] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[28] += amp_sv[0]; jamp_sv[29] -= amp_sv[0]; @@ -13210,8 +14888,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 630 FFV1_0( w_fp[99], w_fp[77], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 630 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[629] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] += amp_sv[0]; jamp_sv[33] -= amp_sv[0]; @@ -13226,8 +14907,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 631 FFV1_0( w_fp[3], w_fp[77], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 631 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[630] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[28] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13246,8 +14930,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 632 FFV1_0( w_fp[56], w_fp[96], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 632 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[631] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[23] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[101] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13260,8 +14947,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 633 FFV1_0( w_fp[22], w_fp[96], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 633 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[632] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[99] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13274,8 +14964,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 634 VVV1_0( w_fp[112], w_fp[103], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 634 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[633] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13294,8 +14987,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 635 FFV1_0( w_fp[22], w_fp[2], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 635 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[634] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += amp_sv[0]; jamp_sv[53] -= amp_sv[0]; @@ -13310,8 +15006,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 636 VVV1_0( w_fp[86], w_fp[103], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 636 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[635] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[23] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13330,8 +15029,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 637 FFV1_0( w_fp[56], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 637 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[636] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[23] += amp_sv[0]; jamp_sv[77] -= amp_sv[0]; @@ -13380,8 +15082,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 639 FFV1_0( w_fp[104], w_fp[33], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 639 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[638] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[61] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[64] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13394,8 +15099,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 640 FFV1_0( w_fp[52], w_fp[114], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 640 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[639] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[53] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[67] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13408,8 +15116,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 641 FFV1_0( w_fp[52], w_fp[33], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 641 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[640] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[53] += amp_sv[0]; jamp_sv[61] -= amp_sv[0]; @@ -13424,8 +15135,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 642 FFV1_0( w_fp[104], w_fp[39], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 642 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[641] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[85] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[88] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13438,8 +15152,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 643 FFV1_0( w_fp[52], w_fp[106], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 643 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[642] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[77] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[91] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -13452,8 +15169,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 644 FFV1_0( w_fp[52], w_fp[39], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 644 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[643] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[77] += amp_sv[0]; jamp_sv[85] -= amp_sv[0]; @@ -13468,8 +15188,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 645 FFV1_0( w_fp[104], w_fp[2], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 645 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[644] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[61] += amp_sv[0]; jamp_sv[64] -= amp_sv[0]; @@ -13484,8 +15207,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 646 FFV1_0( w_fp[52], w_fp[96], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 646 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[645] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += amp_sv[0]; jamp_sv[23] -= amp_sv[0]; @@ -13500,8 +15226,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 647 FFV1_0( w_fp[52], w_fp[2], w_fp[102], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 647 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[646] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13520,8 +15249,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 648 FFV1_0( w_fp[65], w_fp[96], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 648 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[647] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] += amp_sv[0]; jamp_sv[23] -= amp_sv[0]; @@ -13536,8 +15268,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 649 FFV1_0( w_fp[3], w_fp[96], w_fp[63], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 649 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[648] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13556,8 +15291,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 650 FFV1_0( w_fp[99], w_fp[93], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 650 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[649] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] += amp_sv[0]; jamp_sv[33] -= amp_sv[0]; @@ -13572,8 +15310,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 651 FFV1_0( w_fp[99], w_fp[2], w_fp[63], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 651 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[650] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[33] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13592,8 +15333,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 652 FFV1_0( w_fp[3], w_fp[93], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 652 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[651] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[31] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[32] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13612,8 +15356,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 653 FFV1_0( w_fp[65], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 653 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[652] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13690,8 +15437,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 655 VVV1_0( w_fp[8], w_fp[5], w_fp[104], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 655 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[654] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -13718,8 +15468,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 656 VVV1_0( w_fp[61], w_fp[5], w_fp[113], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 656 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[655] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -13746,8 +15499,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 657 VVV1_0( w_fp[61], w_fp[8], w_fp[86], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 657 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[656] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] -= amp_sv[0]; jamp_sv[23] += amp_sv[0]; @@ -13774,8 +15530,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 658 FFV1_0( w_fp[3], w_fp[39], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 658 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[657] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[76] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[77] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13794,8 +15553,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 659 FFV1_0( w_fp[3], w_fp[106], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 659 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[658] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[76] += amp_sv[0]; jamp_sv[77] -= amp_sv[0]; @@ -13810,8 +15572,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 660 FFV1_0( w_fp[99], w_fp[39], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 660 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[659] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[80] += amp_sv[0]; jamp_sv[81] -= amp_sv[0]; @@ -13826,8 +15591,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 661 FFV1_0( w_fp[38], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 661 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[660] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13846,8 +15614,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 662 FFV1_0( w_fp[38], w_fp[96], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 662 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[661] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -13862,8 +15633,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 663 FFV1_0( w_fp[90], w_fp[2], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 663 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[662] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[31] += amp_sv[0]; jamp_sv[34] -= amp_sv[0]; @@ -13878,8 +15652,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 664 FFV1_0( w_fp[71], w_fp[96], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 664 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[663] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] += amp_sv[0]; jamp_sv[21] -= amp_sv[0]; @@ -13894,8 +15671,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 665 FFV1_0( w_fp[3], w_fp[96], w_fp[69], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 665 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[664] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13914,8 +15694,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 666 FFV1_0( w_fp[99], w_fp[94], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 666 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[665] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[38] += amp_sv[0]; jamp_sv[39] -= amp_sv[0]; @@ -13930,8 +15713,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 667 FFV1_0( w_fp[99], w_fp[2], w_fp[69], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 667 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[666] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[38] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[39] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13950,8 +15736,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 668 FFV1_0( w_fp[3], w_fp[94], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 668 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[667] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[37] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[38] += cxtype( 0, 1 ) * amp_sv[0]; @@ -13970,8 +15759,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 669 FFV1_0( w_fp[71], w_fp[2], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 669 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[668] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] += cxtype( 0, 1 ) * amp_sv[0]; @@ -14048,8 +15840,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 671 VVV1_0( w_fp[8], w_fp[4], w_fp[104], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 671 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[670] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += amp_sv[0]; jamp_sv[22] -= amp_sv[0]; @@ -14076,8 +15871,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 672 VVV1_0( w_fp[66], w_fp[4], w_fp[113], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 672 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[671] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -14104,8 +15902,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 673 VVV1_0( w_fp[66], w_fp[8], w_fp[112], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 673 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[672] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] -= amp_sv[0]; jamp_sv[21] += amp_sv[0]; @@ -14132,8 +15933,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 674 FFV1_0( w_fp[3], w_fp[33], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 674 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[673] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[52] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] += cxtype( 0, 1 ) * amp_sv[0]; @@ -14152,8 +15956,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 675 FFV1_0( w_fp[3], w_fp[114], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 675 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[674] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[52] += amp_sv[0]; jamp_sv[53] -= amp_sv[0]; @@ -14168,8 +15975,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 676 FFV1_0( w_fp[99], w_fp[33], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 676 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[675] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[56] += amp_sv[0]; jamp_sv[57] -= amp_sv[0]; @@ -14184,8 +15994,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 677 FFV1_0( w_fp[46], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 677 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[676] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] += cxtype( 0, 1 ) * amp_sv[0]; @@ -14204,8 +16017,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 678 FFV1_0( w_fp[46], w_fp[96], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 678 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[677] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += amp_sv[0]; jamp_sv[22] -= amp_sv[0]; @@ -14220,8 +16036,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 679 FFV1_0( w_fp[88], w_fp[2], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 679 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[678] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[37] += amp_sv[0]; jamp_sv[40] -= amp_sv[0]; @@ -14236,8 +16055,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 680 VVV1_0( w_fp[104], w_fp[13], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 680 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[679] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] -= amp_sv[0]; jamp_sv[29] += amp_sv[0]; @@ -14264,8 +16086,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 681 VVV1_0( w_fp[104], w_fp[10], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 681 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[680] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= amp_sv[0]; jamp_sv[28] += amp_sv[0]; @@ -14350,8 +16175,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 683 VVV1_0( w_fp[112], w_fp[108], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 683 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[682] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += amp_sv[0]; jamp_sv[28] -= amp_sv[0]; @@ -14378,8 +16206,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 684 VVV1_0( w_fp[112], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 684 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[683] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] += amp_sv[0]; jamp_sv[28] -= amp_sv[0]; @@ -14464,8 +16295,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 686 VVV1_0( w_fp[86], w_fp[108], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 686 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[685] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[23] += amp_sv[0]; jamp_sv[29] -= amp_sv[0]; @@ -14492,8 +16326,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 687 VVV1_0( w_fp[86], w_fp[1], w_fp[13], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 687 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[686] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] += amp_sv[0]; jamp_sv[29] -= amp_sv[0]; @@ -14814,8 +16651,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 693 VVV1_0( w_fp[8], w_fp[24], w_fp[104], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 693 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[692] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[19] -= amp_sv[0]; @@ -14842,8 +16682,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 694 VVV1_0( w_fp[1], w_fp[24], w_fp[113], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 694 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[693] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[19] -= amp_sv[0]; @@ -14870,8 +16713,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 695 VVV1_0( w_fp[1], w_fp[8], w_fp[102], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 695 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[694] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] -= amp_sv[0]; jamp_sv[23] += amp_sv[0]; @@ -14898,8 +16744,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 696 VVV1_0( w_fp[104], w_fp[37], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 696 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[695] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[52] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[55] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -14918,8 +16767,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 697 FFV1_0( w_fp[3], w_fp[35], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 697 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[696] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[61] += amp_sv[0]; jamp_sv[62] -= amp_sv[0]; @@ -14934,8 +16786,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 698 FFV1_0( w_fp[99], w_fp[100], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 698 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[697] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[56] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[57] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -14948,8 +16803,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 699 FFV1_0( w_fp[99], w_fp[35], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 699 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[698] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[62] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[63] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -14962,8 +16820,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 700 FFV1_0( w_fp[3], w_fp[100], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 700 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[699] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[55] += amp_sv[0]; jamp_sv[56] -= amp_sv[0]; @@ -14978,8 +16839,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 701 VVV1_0( w_fp[86], w_fp[1], w_fp[37], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 701 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[700] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[53] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[55] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15032,8 +16896,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 703 FFV1_0( w_fp[38], w_fp[33], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 703 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[702] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[52] += amp_sv[0]; jamp_sv[55] -= amp_sv[0]; @@ -15048,8 +16915,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 704 FFV1_0( w_fp[38], w_fp[114], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 704 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[703] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[52] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[66] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15062,8 +16932,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 705 FFV1_0( w_fp[90], w_fp[33], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 705 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[704] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[55] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[58] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15076,8 +16949,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 706 VVV1_0( w_fp[104], w_fp[45], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 706 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[705] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[76] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[79] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15096,8 +16972,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 707 FFV1_0( w_fp[3], w_fp[43], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 707 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[706] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[85] += amp_sv[0]; jamp_sv[86] -= amp_sv[0]; @@ -15112,8 +16991,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 708 FFV1_0( w_fp[99], w_fp[89], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 708 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[707] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[80] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[81] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15126,8 +17008,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 709 FFV1_0( w_fp[99], w_fp[43], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 709 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[708] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[86] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[87] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15140,8 +17025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 710 FFV1_0( w_fp[3], w_fp[89], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 710 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[709] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[79] += amp_sv[0]; jamp_sv[80] -= amp_sv[0]; @@ -15156,8 +17044,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 711 VVV1_0( w_fp[112], w_fp[1], w_fp[45], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 711 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[710] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[77] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[79] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15210,8 +17101,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 713 FFV1_0( w_fp[46], w_fp[39], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 713 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[712] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[76] += amp_sv[0]; jamp_sv[79] -= amp_sv[0]; @@ -15226,8 +17120,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 714 FFV1_0( w_fp[46], w_fp[106], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 714 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[713] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[76] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[90] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15240,8 +17137,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 715 FFV1_0( w_fp[88], w_fp[39], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 715 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[714] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[79] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[82] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15254,8 +17154,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 716 VVV1_0( w_fp[104], w_fp[54], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 716 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[715] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15274,8 +17177,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 717 FFV1_0( w_fp[7], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 717 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[716] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += amp_sv[0]; jamp_sv[29] -= amp_sv[0]; @@ -15290,8 +17196,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 718 FFV1_0( w_fp[78], w_fp[96], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 718 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[717] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[100] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15304,8 +17213,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 719 FFV1_0( w_fp[7], w_fp[96], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 719 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[718] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[97] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15318,8 +17230,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 720 FFV1_0( w_fp[78], w_fp[2], w_fp[86], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 720 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[719] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] += amp_sv[0]; jamp_sv[76] -= amp_sv[0]; @@ -15334,8 +17249,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 721 VVV1_0( w_fp[86], w_fp[1], w_fp[54], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 721 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[720] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15388,8 +17306,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 723 VVV1_0( w_fp[104], w_fp[23], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 723 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[722] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[28] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15408,8 +17329,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 724 FFV1_0( w_fp[25], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 724 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[723] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[28] -= amp_sv[0]; @@ -15424,8 +17348,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 725 FFV1_0( w_fp[58], w_fp[96], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 725 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[724] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[98] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15438,8 +17365,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 726 FFV1_0( w_fp[25], w_fp[96], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 726 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[725] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[96] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15452,8 +17382,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 727 FFV1_0( w_fp[58], w_fp[2], w_fp[112], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 727 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[726] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] += amp_sv[0]; jamp_sv[52] -= amp_sv[0]; @@ -15468,8 +17401,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 728 VVV1_0( w_fp[112], w_fp[1], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 728 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[727] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[28] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15522,8 +17458,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 730 FFV1_0( w_fp[3], w_fp[17], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 730 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[729] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[61] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[62] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15542,8 +17481,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 731 FFV1_0( w_fp[26], w_fp[2], w_fp[104], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 731 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[730] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15562,8 +17504,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 732 FFV1_0( w_fp[3], w_fp[96], w_fp[59], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 732 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[731] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15582,8 +17527,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 733 FFV1_0( w_fp[26], w_fp[96], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 733 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[732] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[19] -= amp_sv[0]; @@ -15598,8 +17546,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 734 FFV1_0( w_fp[99], w_fp[2], w_fp[59], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 734 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[733] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[33] += cxtype( 0, 1 ) * amp_sv[0]; @@ -15618,8 +17569,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 735 FFV1_0( w_fp[99], w_fp[17], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 735 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[734] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[62] += amp_sv[0]; jamp_sv[63] -= amp_sv[0]; @@ -15760,8 +17714,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 739 FFV1_0( w_fp[7], w_fp[92], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 739 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[738] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[29] -= amp_sv[0]; @@ -15773,8 +17730,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 740 FFV1_0( w_fp[53], w_fp[92], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 740 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[739] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[27] -= amp_sv[0]; @@ -15786,8 +17746,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 741 FFV1_0( w_fp[99], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 741 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[740] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] -= amp_sv[0]; @@ -15799,8 +17762,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 742 FFV1_0( w_fp[99], w_fp[85], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 742 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[741] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[46] -= amp_sv[0]; @@ -15812,8 +17778,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 743 FFV1_0( w_fp[53], w_fp[9], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 743 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[742] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[37] -= amp_sv[0]; @@ -15825,8 +17794,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 744 FFV1_0( w_fp[7], w_fp[85], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 744 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[743] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[43] -= amp_sv[0]; @@ -15838,8 +17810,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 745 FFV1_0( w_fp[46], w_fp[92], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 745 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[744] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[27] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15852,8 +17827,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 746 FFV1_0( w_fp[99], w_fp[77], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 746 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[745] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[46] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15866,8 +17844,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 747 FFV1_0( w_fp[46], w_fp[77], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 747 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[746] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[27] += amp_sv[0]; jamp_sv[29] -= amp_sv[0]; @@ -15882,8 +17863,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 748 FFV1_0( w_fp[25], w_fp[92], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 748 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[747] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[28] -= amp_sv[0]; @@ -15895,8 +17879,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 749 FFV1_0( w_fp[48], w_fp[92], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 749 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[748] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] -= amp_sv[0]; @@ -15908,8 +17895,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 750 FFV1_0( w_fp[104], w_fp[87], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 750 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[749] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] -= amp_sv[0]; @@ -15921,8 +17911,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 751 FFV1_0( w_fp[104], w_fp[85], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 751 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[750] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[44] -= amp_sv[0]; @@ -15934,8 +17927,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 752 FFV1_0( w_fp[48], w_fp[87], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 752 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[751] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[31] -= amp_sv[0]; @@ -15947,8 +17943,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 753 FFV1_0( w_fp[25], w_fp[85], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 753 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[752] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] -= amp_sv[0]; @@ -15960,8 +17959,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 754 FFV1_0( w_fp[38], w_fp[92], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 754 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[753] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[28] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15974,8 +17976,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 755 FFV1_0( w_fp[104], w_fp[77], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 755 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[754] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[44] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -15988,8 +17993,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 756 FFV1_0( w_fp[38], w_fp[77], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 756 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[755] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += amp_sv[0]; jamp_sv[28] -= amp_sv[0]; @@ -16004,8 +18012,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 757 FFV1_0( w_fp[28], w_fp[92], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 757 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[756] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[26] -= amp_sv[0]; @@ -16017,8 +18028,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 758 FFV1_0( w_fp[40], w_fp[92], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 758 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[757] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] -= amp_sv[0]; @@ -16030,8 +18044,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 759 FFV1_0( w_fp[62], w_fp[87], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 759 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[758] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] -= amp_sv[0]; @@ -16043,8 +18060,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 760 FFV1_0( w_fp[62], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 760 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[759] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[38] -= amp_sv[0]; @@ -16056,8 +18076,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 761 FFV1_0( w_fp[40], w_fp[87], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 761 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[760] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] -= amp_sv[0]; @@ -16069,8 +18092,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 762 FFV1_0( w_fp[28], w_fp[9], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 762 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[761] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] -= amp_sv[0]; @@ -16082,8 +18108,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 763 FFV1_0( w_fp[41], w_fp[92], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 763 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[762] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16096,8 +18125,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 764 FFV1_0( w_fp[62], w_fp[77], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 764 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[763] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[38] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16110,8 +18142,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 765 FFV1_0( w_fp[41], w_fp[77], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 765 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[764] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += amp_sv[0]; jamp_sv[26] -= amp_sv[0]; @@ -16126,8 +18161,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 766 FFV1_0( w_fp[26], w_fp[92], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 766 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[765] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[28] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16140,8 +18178,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 767 FFV1_0( w_fp[3], w_fp[92], w_fp[42], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 767 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[766] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += amp_sv[0]; jamp_sv[26] -= amp_sv[0]; @@ -16156,8 +18197,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 768 VVV1_0( w_fp[98], w_fp[34], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 768 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[767] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16176,8 +18220,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 769 FFV1_0( w_fp[3], w_fp[85], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 769 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[768] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] += amp_sv[0]; jamp_sv[43] -= amp_sv[0]; @@ -16192,8 +18239,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 770 VVV1_0( w_fp[0], w_fp[34], w_fp[42], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 770 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[769] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16212,8 +18262,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 771 FFV1_0( w_fp[26], w_fp[85], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 771 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[770] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[43] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16262,8 +18315,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 773 FFV1_0( w_fp[14], w_fp[92], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 773 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[772] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[26] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[27] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16276,8 +18332,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 774 FFV1_0( w_fp[3], w_fp[92], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 774 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[773] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += amp_sv[0]; jamp_sv[26] -= amp_sv[0]; @@ -16292,8 +18351,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 775 VVV1_0( w_fp[101], w_fp[34], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 775 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[774] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[28] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16312,8 +18374,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 776 FFV1_0( w_fp[3], w_fp[9], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 776 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[775] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] += amp_sv[0]; jamp_sv[37] -= amp_sv[0]; @@ -16328,8 +18393,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 777 VVV1_0( w_fp[0], w_fp[34], w_fp[16], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 777 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[776] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[25] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[26] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16348,8 +18416,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 778 FFV1_0( w_fp[14], w_fp[9], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 778 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[777] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[37] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16398,8 +18469,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 780 FFV1_0( w_fp[12], w_fp[92], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 780 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[779] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[25] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16412,8 +18486,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 781 FFV1_0( w_fp[3], w_fp[92], w_fp[19], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 781 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[780] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += amp_sv[0]; jamp_sv[25] -= amp_sv[0]; @@ -16428,8 +18505,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 782 VVV1_0( w_fp[96], w_fp[34], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 782 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[781] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[27] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[29] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16448,8 +18528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 783 FFV1_0( w_fp[3], w_fp[87], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 783 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[782] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] += amp_sv[0]; jamp_sv[31] -= amp_sv[0]; @@ -16464,8 +18547,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 784 VVV1_0( w_fp[0], w_fp[34], w_fp[19], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 784 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[783] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[24] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[25] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16484,8 +18570,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 785 FFV1_0( w_fp[12], w_fp[87], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 785 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[784] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[31] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16592,8 +18681,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 789 FFV1_0( w_fp[90], w_fp[35], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 789 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[788] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] -= amp_sv[0]; @@ -16605,8 +18697,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 790 FFV1_0( w_fp[90], w_fp[36], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 790 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[789] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[70] -= amp_sv[0]; @@ -16618,8 +18713,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 791 FFV1_0( w_fp[22], w_fp[114], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 791 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[790] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[53] -= amp_sv[0]; @@ -16631,8 +18729,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 792 FFV1_0( w_fp[21], w_fp[114], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 792 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[791] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[51] -= amp_sv[0]; @@ -16644,8 +18745,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 793 FFV1_0( w_fp[22], w_fp[36], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 793 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[792] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[67] -= amp_sv[0]; @@ -16657,8 +18761,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 794 FFV1_0( w_fp[21], w_fp[35], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 794 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[793] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[61] -= amp_sv[0]; @@ -16670,8 +18777,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 795 FFV1_0( w_fp[90], w_fp[33], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 795 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[794] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[70] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16684,8 +18794,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 796 FFV1_0( w_fp[52], w_fp[114], w_fp[29], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 796 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[795] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[51] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16698,8 +18811,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 797 FFV1_0( w_fp[52], w_fp[33], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 797 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[796] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[51] += amp_sv[0]; jamp_sv[53] -= amp_sv[0]; @@ -16714,8 +18830,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 798 FFV1_0( w_fp[90], w_fp[43], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 798 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[797] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[88] -= amp_sv[0]; @@ -16727,8 +18846,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 799 FFV1_0( w_fp[90], w_fp[44], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 799 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[798] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[94] -= amp_sv[0]; @@ -16740,8 +18862,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 800 FFV1_0( w_fp[56], w_fp[102], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 800 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[799] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[77] -= amp_sv[0]; @@ -16753,8 +18878,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 801 FFV1_0( w_fp[21], w_fp[102], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 801 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[800] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[75] -= amp_sv[0]; @@ -16766,8 +18894,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 802 FFV1_0( w_fp[56], w_fp[44], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 802 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[801] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[91] -= amp_sv[0]; @@ -16779,8 +18910,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 803 FFV1_0( w_fp[21], w_fp[43], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 803 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[802] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[85] -= amp_sv[0]; @@ -16792,8 +18926,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 804 FFV1_0( w_fp[90], w_fp[39], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 804 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[803] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[88] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[94] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16806,8 +18943,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 805 FFV1_0( w_fp[52], w_fp[102], w_fp[27], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 805 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[804] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[75] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[77] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16820,8 +18960,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 806 FFV1_0( w_fp[52], w_fp[39], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 806 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[805] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[75] += amp_sv[0]; jamp_sv[77] -= amp_sv[0]; @@ -16836,8 +18979,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 807 FFV1_0( w_fp[90], w_fp[49], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 807 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[806] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[112] -= amp_sv[0]; @@ -16849,8 +18995,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 808 FFV1_0( w_fp[90], w_fp[50], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 808 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[807] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[118] -= amp_sv[0]; @@ -16862,8 +19011,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 809 FFV1_0( w_fp[56], w_fp[113], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 809 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[808] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[101] -= amp_sv[0]; @@ -16875,8 +19027,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 810 FFV1_0( w_fp[22], w_fp[113], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 810 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[809] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[99] -= amp_sv[0]; @@ -16888,8 +19043,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 811 FFV1_0( w_fp[56], w_fp[50], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 811 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[810] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[115] -= amp_sv[0]; @@ -16901,8 +19059,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 812 FFV1_0( w_fp[22], w_fp[49], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 812 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[811] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[109] -= amp_sv[0]; @@ -16914,8 +19075,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 813 FFV1_0( w_fp[90], w_fp[47], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 813 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[812] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[112] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[118] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16928,8 +19092,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 814 FFV1_0( w_fp[52], w_fp[113], w_fp[24], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 814 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[813] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[99] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[101] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16942,8 +19109,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 815 FFV1_0( w_fp[52], w_fp[47], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 815 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[814] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[99] += amp_sv[0]; jamp_sv[101] -= amp_sv[0]; @@ -16958,8 +19128,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 816 FFV1_0( w_fp[90], w_fp[17], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 816 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[815] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[88] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -16972,8 +19145,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 817 FFV1_0( w_fp[90], w_fp[2], w_fp[42], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 817 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[816] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] += amp_sv[0]; jamp_sv[88] -= amp_sv[0]; @@ -16988,8 +19164,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 818 VVV1_0( w_fp[98], w_fp[103], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 818 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[817] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17008,8 +19187,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 819 FFV1_0( w_fp[21], w_fp[2], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 819 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[818] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -17024,8 +19206,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 820 VVV1_0( w_fp[0], w_fp[103], w_fp[42], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 820 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[819] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17044,8 +19229,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 821 FFV1_0( w_fp[21], w_fp[17], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 821 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[820] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[61] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[85] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17092,8 +19280,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 823 FFV1_0( w_fp[90], w_fp[15], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 823 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[822] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[70] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[112] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17106,8 +19297,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 824 FFV1_0( w_fp[90], w_fp[2], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 824 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[823] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[70] += amp_sv[0]; jamp_sv[88] -= amp_sv[0]; @@ -17122,8 +19316,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 825 VVV1_0( w_fp[101], w_fp[103], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 825 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[824] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17142,8 +19339,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 826 FFV1_0( w_fp[22], w_fp[2], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 826 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[825] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[21] -= amp_sv[0]; @@ -17158,8 +19358,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 827 VVV1_0( w_fp[0], w_fp[103], w_fp[16], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 827 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[826] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17178,8 +19381,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 828 FFV1_0( w_fp[22], w_fp[15], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 828 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[827] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[67] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[109] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17226,8 +19432,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 830 FFV1_0( w_fp[90], w_fp[18], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 830 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[829] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[94] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[118] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17240,8 +19449,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 831 FFV1_0( w_fp[90], w_fp[2], w_fp[19], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 831 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[830] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[64] += amp_sv[0]; jamp_sv[70] -= amp_sv[0]; @@ -17256,8 +19468,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 832 VVV1_0( w_fp[96], w_fp[103], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 832 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[831] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17276,8 +19491,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 833 FFV1_0( w_fp[56], w_fp[2], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 833 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[832] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += amp_sv[0]; jamp_sv[23] -= amp_sv[0]; @@ -17292,8 +19510,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 834 VVV1_0( w_fp[0], w_fp[103], w_fp[19], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 834 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[833] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17312,8 +19533,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 835 FFV1_0( w_fp[56], w_fp[18], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 835 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[834] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[91] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[115] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -17416,8 +19640,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 839 VVV1_0( w_fp[90], w_fp[10], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 839 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[838] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; jamp_sv[7] += amp_sv[0]; @@ -17444,8 +19671,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 840 VVV1_0( w_fp[90], w_fp[11], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 840 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[839] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; jamp_sv[6] += amp_sv[0]; @@ -17530,8 +19760,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 842 VVV1_0( w_fp[56], w_fp[63], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 842 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[841] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -17558,8 +19791,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 843 VVV1_0( w_fp[56], w_fp[64], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 843 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[842] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -17644,8 +19880,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 845 VVV1_0( w_fp[0], w_fp[63], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 845 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[844] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -17672,8 +19911,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 846 VVV1_0( w_fp[0], w_fp[64], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 846 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[845] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -17998,8 +20240,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 852 VVV1_0( w_fp[8], w_fp[29], w_fp[90], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 852 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[851] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -18026,8 +20271,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 853 VVV1_0( w_fp[61], w_fp[29], w_fp[56], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 853 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[852] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -18054,8 +20302,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 854 VVV1_0( w_fp[61], w_fp[8], w_fp[96], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 854 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[853] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= amp_sv[0]; jamp_sv[17] += amp_sv[0]; @@ -18082,8 +20333,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 855 VVV1_0( w_fp[90], w_fp[45], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 855 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[854] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[74] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18102,8 +20356,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 856 FFV1_0( w_fp[3], w_fp[44], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 856 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[855] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] += amp_sv[0]; jamp_sv[91] -= amp_sv[0]; @@ -18118,8 +20375,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 857 FFV1_0( w_fp[65], w_fp[102], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 857 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[856] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[76] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[77] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18132,8 +20392,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 858 FFV1_0( w_fp[3], w_fp[102], w_fp[64], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 858 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[857] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += amp_sv[0]; jamp_sv[74] -= amp_sv[0]; @@ -18148,8 +20411,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 859 FFV1_0( w_fp[65], w_fp[44], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 859 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[858] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[91] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18162,8 +20428,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 860 VVV1_0( w_fp[0], w_fp[64], w_fp[45], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 860 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[859] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[74] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18216,8 +20485,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 862 FFV1_0( w_fp[41], w_fp[39], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 862 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[861] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += amp_sv[0]; jamp_sv[74] -= amp_sv[0]; @@ -18232,8 +20504,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 863 FFV1_0( w_fp[41], w_fp[102], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 863 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[862] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[74] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18246,8 +20521,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 864 FFV1_0( w_fp[62], w_fp[39], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 864 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[863] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[80] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[86] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18260,8 +20538,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 865 VVV1_0( w_fp[90], w_fp[51], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 865 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[864] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[98] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18280,8 +20561,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 866 FFV1_0( w_fp[3], w_fp[50], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 866 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[865] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[114] += amp_sv[0]; jamp_sv[115] -= amp_sv[0]; @@ -18296,8 +20580,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 867 FFV1_0( w_fp[65], w_fp[113], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 867 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[866] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[100] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[101] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18310,8 +20597,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 868 FFV1_0( w_fp[3], w_fp[113], w_fp[63], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 868 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[867] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += amp_sv[0]; jamp_sv[98] -= amp_sv[0]; @@ -18326,8 +20616,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 869 FFV1_0( w_fp[65], w_fp[50], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 869 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[868] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[114] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[115] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18340,8 +20633,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 870 VVV1_0( w_fp[0], w_fp[63], w_fp[51], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 870 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[869] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[98] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18394,8 +20690,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 872 FFV1_0( w_fp[38], w_fp[47], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 872 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[871] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += amp_sv[0]; jamp_sv[98] -= amp_sv[0]; @@ -18410,8 +20709,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 873 FFV1_0( w_fp[38], w_fp[113], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 873 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[872] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[98] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18424,8 +20726,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 874 FFV1_0( w_fp[104], w_fp[47], w_fp[61], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 874 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[873] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[104] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[110] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18438,8 +20743,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 875 VVV1_0( w_fp[90], w_fp[23], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 875 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[874] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18458,8 +20766,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 876 FFV1_0( w_fp[48], w_fp[2], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 876 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[875] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -18474,8 +20785,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 877 FFV1_0( w_fp[104], w_fp[93], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 877 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[876] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[58] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18488,8 +20802,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 878 FFV1_0( w_fp[104], w_fp[2], w_fp[64], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 878 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[877] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] += amp_sv[0]; jamp_sv[58] -= amp_sv[0]; @@ -18504,8 +20821,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 879 FFV1_0( w_fp[48], w_fp[93], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 879 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[878] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[31] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[55] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18518,8 +20838,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 880 VVV1_0( w_fp[0], w_fp[64], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 880 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[879] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18572,8 +20895,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 882 VVV1_0( w_fp[90], w_fp[20], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 882 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[881] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18592,8 +20918,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 883 FFV1_0( w_fp[40], w_fp[2], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 883 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[882] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -18608,8 +20937,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 884 FFV1_0( w_fp[62], w_fp[93], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 884 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[883] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[56] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18622,8 +20954,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 885 FFV1_0( w_fp[62], w_fp[2], w_fp[63], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 885 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[884] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] += amp_sv[0]; jamp_sv[56] -= amp_sv[0]; @@ -18638,8 +20973,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 886 FFV1_0( w_fp[40], w_fp[93], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 886 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[885] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[54] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -18652,8 +20990,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 887 VVV1_0( w_fp[0], w_fp[63], w_fp[20], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 887 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[886] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18706,8 +21047,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 889 FFV1_0( w_fp[3], w_fp[18], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 889 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[888] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[91] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18726,8 +21070,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 890 FFV1_0( w_fp[12], w_fp[2], w_fp[90], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 890 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[889] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18746,8 +21093,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 891 FFV1_0( w_fp[3], w_fp[93], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 891 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[890] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[31] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18766,8 +21116,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 892 FFV1_0( w_fp[65], w_fp[2], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 892 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[891] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; @@ -18786,8 +21139,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 893 FFV1_0( w_fp[12], w_fp[93], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 893 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[892] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[30] += amp_sv[0]; jamp_sv[31] -= amp_sv[0]; @@ -18802,8 +21158,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 894 FFV1_0( w_fp[65], w_fp[18], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 894 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[893] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] += amp_sv[0]; jamp_sv[91] -= amp_sv[0]; @@ -18818,8 +21177,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 895 VVV1_0( w_fp[65], w_fp[13], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 895 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[894] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; jamp_sv[13] += amp_sv[0]; @@ -18846,8 +21208,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 896 VVV1_0( w_fp[65], w_fp[11], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 896 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[895] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; jamp_sv[12] += amp_sv[0]; @@ -18932,8 +21297,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 898 VVV1_0( w_fp[56], w_fp[69], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 898 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[897] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -18960,8 +21328,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 899 VVV1_0( w_fp[56], w_fp[70], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 899 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[898] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -19046,8 +21417,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 901 VVV1_0( w_fp[0], w_fp[69], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 901 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[900] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -19074,8 +21448,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 902 VVV1_0( w_fp[0], w_fp[70], w_fp[13], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 902 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[901] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -19398,8 +21775,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 908 VVV1_0( w_fp[8], w_fp[27], w_fp[65], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 908 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[907] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[3] -= amp_sv[0]; @@ -19426,8 +21806,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 909 VVV1_0( w_fp[66], w_fp[27], w_fp[56], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 909 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[908] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[3] -= amp_sv[0]; @@ -19454,8 +21837,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 910 VVV1_0( w_fp[66], w_fp[8], w_fp[101], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 910 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[909] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= amp_sv[0]; jamp_sv[11] += amp_sv[0]; @@ -19482,8 +21868,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 911 VVV1_0( w_fp[65], w_fp[37], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 911 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[910] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[50] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19502,8 +21891,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 912 FFV1_0( w_fp[3], w_fp[36], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 912 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[911] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] += amp_sv[0]; jamp_sv[67] -= amp_sv[0]; @@ -19518,8 +21910,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 913 FFV1_0( w_fp[71], w_fp[114], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 913 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[912] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[52] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19532,8 +21927,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 914 FFV1_0( w_fp[3], w_fp[114], w_fp[70], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 914 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[913] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += amp_sv[0]; jamp_sv[50] -= amp_sv[0]; @@ -19548,8 +21946,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 915 FFV1_0( w_fp[71], w_fp[36], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 915 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[914] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[67] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19562,8 +21963,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 916 VVV1_0( w_fp[0], w_fp[70], w_fp[37], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 916 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[915] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[50] += cxtype( 0, 1 ) * amp_sv[0]; @@ -19616,8 +22020,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 918 FFV1_0( w_fp[41], w_fp[33], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 918 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[917] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += amp_sv[0]; jamp_sv[50] -= amp_sv[0]; @@ -19632,8 +22039,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 919 FFV1_0( w_fp[41], w_fp[114], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 919 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[918] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[50] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19646,8 +22056,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 920 FFV1_0( w_fp[62], w_fp[33], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 920 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[919] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[56] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[62] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19660,8 +22073,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 921 VVV1_0( w_fp[65], w_fp[51], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 921 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[920] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[100] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19680,8 +22096,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 922 FFV1_0( w_fp[3], w_fp[49], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 922 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[921] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[108] += amp_sv[0]; jamp_sv[109] -= amp_sv[0]; @@ -19696,8 +22115,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 923 FFV1_0( w_fp[71], w_fp[113], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 923 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[922] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[98] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[99] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19710,8 +22132,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 924 FFV1_0( w_fp[3], w_fp[113], w_fp[69], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 924 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[923] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] += amp_sv[0]; jamp_sv[98] -= amp_sv[0]; @@ -19726,8 +22151,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 925 FFV1_0( w_fp[71], w_fp[49], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 925 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[924] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[108] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[109] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19740,8 +22168,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 926 VVV1_0( w_fp[0], w_fp[69], w_fp[51], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 926 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[925] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[98] += cxtype( 0, 1 ) * amp_sv[0]; @@ -19794,8 +22225,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 928 FFV1_0( w_fp[46], w_fp[47], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 928 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[927] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] += amp_sv[0]; jamp_sv[100] -= amp_sv[0]; @@ -19810,8 +22244,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 929 FFV1_0( w_fp[46], w_fp[113], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 929 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[928] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[100] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19824,8 +22261,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 930 FFV1_0( w_fp[99], w_fp[47], w_fp[66], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 930 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[929] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[106] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[116] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19838,8 +22278,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 931 VVV1_0( w_fp[65], w_fp[54], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 931 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[930] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19858,8 +22301,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 932 FFV1_0( w_fp[53], w_fp[2], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 932 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[931] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -19874,8 +22320,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 933 FFV1_0( w_fp[99], w_fp[94], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 933 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[932] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[82] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19888,8 +22337,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 934 FFV1_0( w_fp[99], w_fp[2], w_fp[70], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 934 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[933] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] += amp_sv[0]; jamp_sv[82] -= amp_sv[0]; @@ -19904,8 +22356,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 935 FFV1_0( w_fp[53], w_fp[94], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 935 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[934] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[37] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[79] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19918,8 +22373,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 936 VVV1_0( w_fp[0], w_fp[70], w_fp[54], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 936 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[935] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; @@ -19972,8 +22430,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 938 VVV1_0( w_fp[65], w_fp[20], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 938 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[937] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -19992,8 +22453,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 939 FFV1_0( w_fp[28], w_fp[2], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 939 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[938] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[12] -= amp_sv[0]; @@ -20008,8 +22472,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 940 FFV1_0( w_fp[62], w_fp[94], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 940 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[939] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[38] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[80] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -20022,8 +22489,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 941 FFV1_0( w_fp[62], w_fp[2], w_fp[69], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 941 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[940] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[38] += amp_sv[0]; jamp_sv[56] -= amp_sv[0]; @@ -20038,8 +22508,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 942 FFV1_0( w_fp[28], w_fp[94], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 942 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[941] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[78] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -20052,8 +22525,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 943 VVV1_0( w_fp[0], w_fp[69], w_fp[20], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 943 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[942] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; @@ -20106,8 +22582,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 945 FFV1_0( w_fp[3], w_fp[15], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 945 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[944] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[67] += cxtype( 0, 1 ) * amp_sv[0]; @@ -20126,8 +22605,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 946 FFV1_0( w_fp[14], w_fp[2], w_fp[65], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 946 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[945] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; @@ -20146,8 +22628,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 947 FFV1_0( w_fp[3], w_fp[94], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 947 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[946] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[37] += cxtype( 0, 1 ) * amp_sv[0]; @@ -20166,8 +22651,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 948 FFV1_0( w_fp[71], w_fp[2], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 948 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[947] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; @@ -20186,8 +22674,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 949 FFV1_0( w_fp[14], w_fp[94], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 949 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[948] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[36] += amp_sv[0]; jamp_sv[37] -= amp_sv[0]; @@ -20202,8 +22693,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 950 FFV1_0( w_fp[71], w_fp[15], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 950 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[949] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] += amp_sv[0]; jamp_sv[67] -= amp_sv[0]; @@ -20218,8 +22712,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 951 VVV1_0( w_fp[71], w_fp[13], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 951 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[950] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; jamp_sv[19] += amp_sv[0]; @@ -20246,8 +22743,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 952 VVV1_0( w_fp[71], w_fp[10], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 952 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[951] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; jamp_sv[18] += amp_sv[0]; @@ -20332,8 +22832,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 954 VVV1_0( w_fp[56], w_fp[74], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 954 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[953] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -20360,8 +22863,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 955 VVV1_0( w_fp[56], w_fp[75], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 955 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[954] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -20446,8 +22952,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 957 VVV1_0( w_fp[0], w_fp[74], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 957 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[956] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -20474,8 +22983,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 958 VVV1_0( w_fp[0], w_fp[75], w_fp[13], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 958 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[957] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -20796,8 +23308,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 964 VVV1_0( w_fp[8], w_fp[24], w_fp[71], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 964 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[963] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -20824,8 +23339,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 965 VVV1_0( w_fp[72], w_fp[24], w_fp[56], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 965 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[964] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -20852,8 +23370,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 966 VVV1_0( w_fp[72], w_fp[8], w_fp[98], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 966 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[965] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= amp_sv[0]; jamp_sv[9] += amp_sv[0]; @@ -20880,8 +23401,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 967 VVV1_0( w_fp[71], w_fp[37], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 967 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[966] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[52] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -20900,8 +23424,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 968 FFV1_0( w_fp[3], w_fp[35], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 968 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[967] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] += amp_sv[0]; jamp_sv[61] -= amp_sv[0]; @@ -20916,8 +23443,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 969 FFV1_0( w_fp[76], w_fp[114], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 969 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[968] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[50] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[51] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -20930,8 +23460,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 970 FFV1_0( w_fp[3], w_fp[114], w_fp[75], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 970 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[969] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] += amp_sv[0]; jamp_sv[50] -= amp_sv[0]; @@ -20946,8 +23479,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 971 FFV1_0( w_fp[76], w_fp[35], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 971 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[970] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[61] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -20960,8 +23496,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 972 VVV1_0( w_fp[0], w_fp[75], w_fp[37], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 972 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[971] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[50] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21014,8 +23553,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 974 FFV1_0( w_fp[38], w_fp[33], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 974 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[973] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] += amp_sv[0]; jamp_sv[52] -= amp_sv[0]; @@ -21030,8 +23572,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 975 FFV1_0( w_fp[38], w_fp[114], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 975 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[974] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[52] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21044,8 +23589,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 976 FFV1_0( w_fp[104], w_fp[33], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 976 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[975] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[58] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[68] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21058,8 +23606,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 977 VVV1_0( w_fp[71], w_fp[45], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 977 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[976] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[76] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21078,8 +23629,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 978 FFV1_0( w_fp[3], w_fp[43], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 978 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[977] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[84] += amp_sv[0]; jamp_sv[85] -= amp_sv[0]; @@ -21094,8 +23648,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 979 FFV1_0( w_fp[76], w_fp[102], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 979 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[978] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[74] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[75] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21108,8 +23665,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 980 FFV1_0( w_fp[3], w_fp[102], w_fp[74], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 980 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[979] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] += amp_sv[0]; jamp_sv[74] -= amp_sv[0]; @@ -21124,8 +23684,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 981 FFV1_0( w_fp[76], w_fp[43], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 981 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[980] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[84] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[85] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21138,8 +23701,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 982 VVV1_0( w_fp[0], w_fp[74], w_fp[45], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 982 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[981] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[74] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21192,8 +23758,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 984 FFV1_0( w_fp[46], w_fp[39], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 984 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[983] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] += amp_sv[0]; jamp_sv[76] -= amp_sv[0]; @@ -21208,8 +23777,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 985 FFV1_0( w_fp[46], w_fp[102], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 985 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[984] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[76] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21222,8 +23794,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 986 FFV1_0( w_fp[99], w_fp[39], w_fp[72], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 986 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[985] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[82] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[92] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21236,8 +23811,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 987 VVV1_0( w_fp[71], w_fp[54], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 987 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[986] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21256,8 +23834,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 988 FFV1_0( w_fp[7], w_fp[2], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 988 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[987] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += amp_sv[0]; jamp_sv[19] -= amp_sv[0]; @@ -21272,8 +23853,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 989 FFV1_0( w_fp[99], w_fp[97], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 989 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[988] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[46] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[106] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21286,8 +23870,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 990 FFV1_0( w_fp[99], w_fp[2], w_fp[75], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 990 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[989] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[46] += amp_sv[0]; jamp_sv[82] -= amp_sv[0]; @@ -21302,8 +23889,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 991 FFV1_0( w_fp[7], w_fp[97], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 991 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[990] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[43] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[103] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21316,8 +23906,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 992 VVV1_0( w_fp[0], w_fp[75], w_fp[54], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 992 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[991] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21370,8 +23963,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 994 VVV1_0( w_fp[71], w_fp[23], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 994 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[993] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21390,8 +23986,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 995 FFV1_0( w_fp[25], w_fp[2], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 995 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[994] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[18] -= amp_sv[0]; @@ -21406,8 +24005,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 996 FFV1_0( w_fp[104], w_fp[97], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 996 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[995] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[44] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[104] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21420,8 +24022,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 997 FFV1_0( w_fp[104], w_fp[2], w_fp[74], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 997 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[996] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[44] += amp_sv[0]; jamp_sv[58] -= amp_sv[0]; @@ -21436,8 +24041,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 998 FFV1_0( w_fp[25], w_fp[97], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 998 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[997] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[102] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -21450,8 +24058,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 999 VVV1_0( w_fp[0], w_fp[74], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 999 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[998] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21504,8 +24115,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1001 FFV1_0( w_fp[3], w_fp[17], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1001 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1000] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[61] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21524,8 +24138,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1002 FFV1_0( w_fp[26], w_fp[2], w_fp[71], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1002 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1001] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21544,8 +24161,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1003 FFV1_0( w_fp[3], w_fp[97], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1003 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1002] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[43] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21564,8 +24184,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1004 FFV1_0( w_fp[76], w_fp[2], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1004 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1003] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; @@ -21584,8 +24207,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1005 FFV1_0( w_fp[26], w_fp[97], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1005 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1004] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[42] += amp_sv[0]; jamp_sv[43] -= amp_sv[0]; @@ -21600,8 +24226,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1006 FFV1_0( w_fp[76], w_fp[17], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1006 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1005] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] += amp_sv[0]; jamp_sv[61] -= amp_sv[0]; @@ -21616,8 +24245,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1007 VVV1_0( w_fp[56], w_fp[59], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1007 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1006] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -21644,8 +24276,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1008 VVV1_0( w_fp[56], w_fp[1], w_fp[42], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1008 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1007] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -21730,8 +24365,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1010 VVV1_0( w_fp[98], w_fp[108], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1010 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1009] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -21758,8 +24396,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1011 VVV1_0( w_fp[98], w_fp[1], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1011 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1010] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -21844,8 +24485,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1013 VVV1_0( w_fp[0], w_fp[108], w_fp[42], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1013 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1012] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -21872,8 +24516,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1014 VVV1_0( w_fp[0], w_fp[59], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1014 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1013] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -22136,8 +24783,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1019 VVV1_0( w_fp[56], w_fp[68], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1019 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1018] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[4] -= amp_sv[0]; @@ -22164,8 +24814,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1020 VVV1_0( w_fp[56], w_fp[1], w_fp[16], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1020 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1019] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -22250,8 +24903,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1022 VVV1_0( w_fp[101], w_fp[108], w_fp[5], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1022 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1021] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[21] -= amp_sv[0]; @@ -22278,8 +24934,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1023 VVV1_0( w_fp[101], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1023 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1022] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -22364,8 +25023,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1025 VVV1_0( w_fp[0], w_fp[108], w_fp[16], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1025 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1024] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -22392,8 +25054,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1026 VVV1_0( w_fp[0], w_fp[68], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1026 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1025] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[4] -= amp_sv[0]; @@ -22654,8 +25319,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1031 VVV1_0( w_fp[56], w_fp[67], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1031 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1030] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -22682,8 +25350,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1032 VVV1_0( w_fp[56], w_fp[1], w_fp[19], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1032 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1031] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -22768,8 +25439,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1034 VVV1_0( w_fp[96], w_fp[108], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1034 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1033] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += amp_sv[0]; jamp_sv[23] -= amp_sv[0]; @@ -22796,8 +25470,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1035 VVV1_0( w_fp[96], w_fp[1], w_fp[13], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1035 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1034] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[22] -= amp_sv[0]; @@ -22882,8 +25559,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1037 VVV1_0( w_fp[0], w_fp[108], w_fp[19], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1037 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1036] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -22910,8 +25590,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1038 VVV1_0( w_fp[0], w_fp[67], w_fp[13], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1038 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1037] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -23448,8 +26131,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1046 FFV1_0( w_fp[58], w_fp[114], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1046 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1045] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[52] -= amp_sv[0]; @@ -23461,8 +26147,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1047 FFV1_0( w_fp[48], w_fp[114], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1047 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1046] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[49] -= amp_sv[0]; @@ -23474,8 +26163,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1048 FFV1_0( w_fp[104], w_fp[100], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1048 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1047] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[58] -= amp_sv[0]; @@ -23487,8 +26179,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1049 FFV1_0( w_fp[104], w_fp[36], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1049 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1048] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[68] -= amp_sv[0]; @@ -23500,8 +26195,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1050 FFV1_0( w_fp[48], w_fp[100], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1050 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1049] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[55] -= amp_sv[0]; @@ -23513,8 +26211,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1051 FFV1_0( w_fp[58], w_fp[36], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1051 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1050] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] -= amp_sv[0]; @@ -23526,8 +26227,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1052 FFV1_0( w_fp[60], w_fp[114], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1052 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1051] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[50] -= amp_sv[0]; @@ -23539,8 +26243,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1053 FFV1_0( w_fp[40], w_fp[114], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1053 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1052] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] -= amp_sv[0]; @@ -23552,8 +26259,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1054 FFV1_0( w_fp[62], w_fp[100], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1054 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1053] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[56] -= amp_sv[0]; @@ -23565,8 +26275,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1055 FFV1_0( w_fp[62], w_fp[35], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1055 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1054] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[62] -= amp_sv[0]; @@ -23578,8 +26291,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1056 FFV1_0( w_fp[40], w_fp[100], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1056 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1055] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[54] -= amp_sv[0]; @@ -23591,8 +26307,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1057 FFV1_0( w_fp[60], w_fp[35], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1057 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1056] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] -= amp_sv[0]; @@ -23604,8 +26323,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1058 FFV1_0( w_fp[3], w_fp[114], w_fp[67], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1058 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1057] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += amp_sv[0]; jamp_sv[49] -= amp_sv[0]; @@ -23620,8 +26342,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1059 FFV1_0( w_fp[12], w_fp[114], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1059 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1058] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[49] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -23634,8 +26359,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1060 FFV1_0( w_fp[3], w_fp[100], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1060 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1059] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[54] += amp_sv[0]; jamp_sv[55] -= amp_sv[0]; @@ -23650,8 +26378,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1061 VVV1_0( w_fp[96], w_fp[1], w_fp[37], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1061 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1060] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[51] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[53] += cxtype( 0, 1 ) * amp_sv[0]; @@ -23670,8 +26401,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1062 FFV1_0( w_fp[12], w_fp[100], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1062 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1061] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[54] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[55] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -23684,8 +26418,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1063 VVV1_0( w_fp[0], w_fp[67], w_fp[37], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1063 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1062] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[48] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[49] += cxtype( 0, 1 ) * amp_sv[0]; @@ -23738,8 +26475,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1065 FFV1_0( w_fp[78], w_fp[102], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1065 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1064] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[76] -= amp_sv[0]; @@ -23751,8 +26491,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1066 FFV1_0( w_fp[53], w_fp[102], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1066 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1065] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[73] -= amp_sv[0]; @@ -23764,8 +26507,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1067 FFV1_0( w_fp[99], w_fp[89], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1067 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1066] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[82] -= amp_sv[0]; @@ -23777,8 +26523,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1068 FFV1_0( w_fp[99], w_fp[44], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1068 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1067] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[92] -= amp_sv[0]; @@ -23790,8 +26539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1069 FFV1_0( w_fp[53], w_fp[89], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1069 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1068] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[79] -= amp_sv[0]; @@ -23803,8 +26555,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1070 FFV1_0( w_fp[78], w_fp[44], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1070 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1069] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] -= amp_sv[0]; @@ -23816,8 +26571,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1071 FFV1_0( w_fp[60], w_fp[102], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1071 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1070] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[74] -= amp_sv[0]; @@ -23829,8 +26587,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1072 FFV1_0( w_fp[28], w_fp[102], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1072 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1071] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] -= amp_sv[0]; @@ -23842,8 +26603,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1073 FFV1_0( w_fp[62], w_fp[89], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1073 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1072] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[80] -= amp_sv[0]; @@ -23855,8 +26619,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1074 FFV1_0( w_fp[62], w_fp[43], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1074 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1073] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[86] -= amp_sv[0]; @@ -23868,8 +26635,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1075 FFV1_0( w_fp[28], w_fp[89], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1075 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1074] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[78] -= amp_sv[0]; @@ -23881,8 +26651,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1076 FFV1_0( w_fp[60], w_fp[43], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1076 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1075] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[84] -= amp_sv[0]; @@ -23894,8 +26667,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1077 FFV1_0( w_fp[3], w_fp[102], w_fp[68], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1077 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1076] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += amp_sv[0]; jamp_sv[73] -= amp_sv[0]; @@ -23910,8 +26686,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1078 FFV1_0( w_fp[14], w_fp[102], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1078 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1077] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[73] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -23924,8 +26703,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1079 FFV1_0( w_fp[3], w_fp[89], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1079 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1078] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[78] += amp_sv[0]; jamp_sv[79] -= amp_sv[0]; @@ -23940,8 +26722,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1080 VVV1_0( w_fp[101], w_fp[1], w_fp[45], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1080 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1079] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[75] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[77] += cxtype( 0, 1 ) * amp_sv[0]; @@ -23960,8 +26745,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1081 FFV1_0( w_fp[14], w_fp[89], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1081 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1080] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[78] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[79] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -23974,8 +26762,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1082 VVV1_0( w_fp[0], w_fp[68], w_fp[45], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1082 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1081] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[72] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[73] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24028,8 +26819,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1084 FFV1_0( w_fp[78], w_fp[113], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1084 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1083] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[100] -= amp_sv[0]; @@ -24041,8 +26835,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1085 FFV1_0( w_fp[7], w_fp[113], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1085 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1084] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[97] -= amp_sv[0]; @@ -24054,8 +26851,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1086 FFV1_0( w_fp[99], w_fp[91], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1086 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1085] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[106] -= amp_sv[0]; @@ -24067,8 +26867,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1087 FFV1_0( w_fp[99], w_fp[50], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1087 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1086] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[116] -= amp_sv[0]; @@ -24080,8 +26883,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1088 FFV1_0( w_fp[7], w_fp[91], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1088 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1087] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[103] -= amp_sv[0]; @@ -24093,8 +26899,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1089 FFV1_0( w_fp[78], w_fp[50], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1089 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1088] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[114] -= amp_sv[0]; @@ -24106,8 +26915,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1090 FFV1_0( w_fp[58], w_fp[113], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1090 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1089] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[98] -= amp_sv[0]; @@ -24119,8 +26931,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1091 FFV1_0( w_fp[25], w_fp[113], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1091 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1090] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] -= amp_sv[0]; @@ -24132,8 +26947,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1092 FFV1_0( w_fp[104], w_fp[91], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1092 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1091] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[104] -= amp_sv[0]; @@ -24145,8 +26963,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1093 FFV1_0( w_fp[104], w_fp[49], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1093 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1092] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[110] -= amp_sv[0]; @@ -24158,8 +26979,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1094 FFV1_0( w_fp[25], w_fp[91], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1094 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1093] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[102] -= amp_sv[0]; @@ -24171,8 +26995,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1095 FFV1_0( w_fp[58], w_fp[49], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1095 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1094] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[108] -= amp_sv[0]; @@ -24184,8 +27011,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1096 FFV1_0( w_fp[3], w_fp[113], w_fp[59], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1096 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1095] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += amp_sv[0]; jamp_sv[97] -= amp_sv[0]; @@ -24200,8 +27030,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1097 FFV1_0( w_fp[26], w_fp[113], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1097 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1096] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[97] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24214,8 +27047,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1098 FFV1_0( w_fp[3], w_fp[91], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1098 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1097] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[102] += amp_sv[0]; jamp_sv[103] -= amp_sv[0]; @@ -24230,8 +27066,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1099 VVV1_0( w_fp[98], w_fp[1], w_fp[51], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1099 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1098] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[99] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[101] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24250,8 +27089,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1100 FFV1_0( w_fp[26], w_fp[91], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1100 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1099] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[102] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[103] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24264,8 +27106,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1101 VVV1_0( w_fp[0], w_fp[59], w_fp[51], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1101 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1100] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[96] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[97] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24318,8 +27163,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1103 FFV1_0( w_fp[99], w_fp[2], w_fp[67], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1103 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1102] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[40] += amp_sv[0]; jamp_sv[46] -= amp_sv[0]; @@ -24334,8 +27182,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1104 FFV1_0( w_fp[99], w_fp[18], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1104 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1103] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[92] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[116] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24348,8 +27199,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1105 FFV1_0( w_fp[78], w_fp[2], w_fp[96], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1105 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1104] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[22] -= amp_sv[0]; @@ -24364,8 +27218,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1106 VVV1_0( w_fp[96], w_fp[1], w_fp[54], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1106 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1105] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24384,8 +27241,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1107 FFV1_0( w_fp[78], w_fp[18], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1107 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1106] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[90] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[114] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24398,8 +27258,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1108 VVV1_0( w_fp[0], w_fp[67], w_fp[54], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1108 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1107] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24452,8 +27315,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1110 FFV1_0( w_fp[104], w_fp[2], w_fp[68], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1110 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1109] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[34] += amp_sv[0]; jamp_sv[44] -= amp_sv[0]; @@ -24468,8 +27334,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1111 FFV1_0( w_fp[104], w_fp[15], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1111 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1110] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[68] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[110] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24482,8 +27351,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1112 FFV1_0( w_fp[58], w_fp[2], w_fp[101], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1112 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1111] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -24498,8 +27370,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1113 VVV1_0( w_fp[101], w_fp[1], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1113 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1112] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24518,8 +27393,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1114 FFV1_0( w_fp[58], w_fp[15], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1114 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1113] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[66] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[108] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24532,8 +27410,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1115 VVV1_0( w_fp[0], w_fp[68], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1115 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1114] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24586,8 +27467,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1117 FFV1_0( w_fp[62], w_fp[2], w_fp[59], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1117 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1116] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[32] += amp_sv[0]; jamp_sv[38] -= amp_sv[0]; @@ -24602,8 +27486,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1118 FFV1_0( w_fp[62], w_fp[17], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1118 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1117] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[62] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[86] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24616,8 +27503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1119 FFV1_0( w_fp[60], w_fp[2], w_fp[98], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1119 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1118] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -24632,8 +27522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1120 VVV1_0( w_fp[98], w_fp[1], w_fp[20], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1120 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1119] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; @@ -24652,8 +27545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1121 FFV1_0( w_fp[60], w_fp[17], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1121 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1120] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[60] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[84] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -24666,8 +27562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1122 VVV1_0( w_fp[0], w_fp[59], w_fp[20], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1122 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1121] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; @@ -30383,7 +33282,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -30757,9 +33658,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -30767,7 +33665,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -30792,11 +33689,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -30809,17 +33707,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -30934,38 +33822,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -31138,11 +33995,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.h b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.h index 2eb1e066ff..a89060a269 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.h +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig.f b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig.f index 523ef1948b..b68e24f4b8 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig.f +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig1.f b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig1.f index 3152176aa0..e2d2f5526b 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig1.f +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/matrix1.f b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/matrix1.f index 07ccd4d1a4..2023c1edcf 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/matrix1.f +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -419,7 +419,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -462,7 +462,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(3030) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -505,9365 +506,724 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 1),I= 7, 12) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 1),I= 13, 18) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 1),I= 19, 24) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 1),I= 25, 30) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 1),I= 31, 36) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 1),I= 37, 42) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 1),I= 43, 48) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 1),I= 49, 54) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 1),I= 55, 60) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 1),I= 61, 66) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 1),I= 67, 72) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 1),I= 73, 78) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 1),I= 79, 84) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 1),I= 85, 90) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 1),I= 91, 96) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 1),I= 97,102) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 1),I=103,108) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 1),I=109,114) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 1),I=115,120) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ + DATA DENOM/324/ + DATA (CF(I),I= 1,120) /4096,-1024,-1024,128,128,1280,-1024,128 + $ ,128,-16,-16,-160,128,-16,1280,-160,1136,992,-16,-160,-160,992 + $ ,992,-448,-1024,128,128,-16,-16,-160,128,-16,-16,2,2,20,-16,2, + $ -160,20,-142,-124,2,20,20,-124,-124,56,128,-16,-16,2,2,20,1280, + $ -160,-160,20,20,200,1136,-142,992,-124,1010,1028,-142,38,-124, + $ -106,-268,-88,-16,2,-160,20,-142,-124,-160,20,992,-124,38,-106 + $ ,992,-124,-448,56,-268,-88,1010,-268,-268,884,884,-232,2,20,20, + $ -124,-124,56,20,200,-124,1028,-106,-88,-124,-106,56,-88,884, + $ -232,1028,-88,-88,-232,-232,272/ C 1 T(1,2,5,6,7,3,4) - DATA (CF(I, 2),I= 1, 6) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 2),I= 7, 12) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 2),I= 13, 18) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 2),I= 19, 24) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 2),I= 25, 30) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 2),I= 31, 36) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 2),I= 37, 42) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 2),I= 43, 48) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 2),I= 49, 54) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 2),I= 55, 60) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 2),I= 61, 66) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 2),I= 67, 72) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 2),I= 73, 78) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 2),I= 79, 84) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 2),I= 85, 90) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 2),I= 91, 96) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 2),I= 97,102) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 2),I=103,108) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 2),I=109,114) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 2),I=115,120) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ + DATA (CF(I),I=121,239) /4096,128,1280,-1024,128,128,-1024,-16, + $ -160,128,-16,-16,-160,-160,992,992,-448,128,-16,1280,-160,1136 + $ ,992,128,-1024,-16,-160,128,-16,-16,128,2,20,-16,2,2,20,20,-124 + $ ,-124,56,-16,2,-160,20,-142,-124,-16,128,2,20,-16,2,-160,1280 + $ ,20,200,-160,20,-142,38,-124,-106,-268,-88,1136,-142,992,-124 + $ ,1010,1028,2,20,20,-124,-124,56,20,200,-124,1028,-106,-88,-124, + $ -106,56,-88,884,-232,1028,-88,-88,-232,-232,272,-16,2,-160,20, + $ -142,-124,-160,20,992,-124,38,-106,992,-124,-448,56,-268,-88 + $ ,1010,-268,-268,884,884,-232/ C 1 T(1,2,5,7,6,3,4) - DATA (CF(I, 3),I= 1, 6) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 3),I= 7, 12) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 3),I= 13, 18) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 3),I= 19, 24) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 3),I= 25, 30) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 3),I= 31, 36) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 3),I= 37, 42) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 3),I= 43, 48) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 3),I= 49, 54) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 3),I= 55, 60) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 3),I= 61, 66) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 3),I= 67, 72) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 3),I= 73, 78) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 3),I= 79, 84) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 3),I= 85, 90) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 3),I= 91, 96) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 3),I= 97,102) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 3),I=103,108) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 3),I=109,114) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 3),I=115,120) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ + DATA (CF(I),I=240,357) /4096,-1024,1280,128,128,-16,1280,-160 + $ ,1136,992,-1024,128,128,-16,-16,-160,-160,-16,992,-448,-160,992 + $ ,128,-16,-1024,128,-160,-16,-16,2,-160,20,-142,-124,128,-16,-16 + $ ,2,2,20,20,2,-124,56,20,-124,-16,2,-160,20,-142,-124,-160,20 + $ ,992,-124,38,-106,992,-124,-448,56,-268,-88,1010,-268,-268,884 + $ ,884,-232,128,-16,-16,2,2,20,1280,-160,-160,20,20,200,1136,-142 + $ ,992,-124,1010,1028,-142,38,-124,-106,-268,-88,20,2,-124,56,20, + $ -124,200,20,-106,-88,-124,1028,1028,-88,-88,-232,-232,272,-124, + $ -106,56,-88,884,-232/ C 1 T(1,2,6,5,7,3,4) - DATA (CF(I, 4),I= 1, 6) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 4),I= 7, 12) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 4),I= 13, 18) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 4),I= 19, 24) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 4),I= 25, 30) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 4),I= 31, 36) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 4),I= 37, 42) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 4),I= 43, 48) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 4),I= 49, 54) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 4),I= 55, 60) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 4),I= 61, 66) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 4),I= 67, 72) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 4),I= 73, 78) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 4),I= 79, 84) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 4),I= 85, 90) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 4),I= 91, 96) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 4),I= 97,102) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 4),I=103,108) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 4),I=109,114) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 4),I=115,120) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ + DATA (CF(I),I=358,474) /4096,128,-1024,-16,-160,-160,992,992, + $ -448,128,-1024,-16,-160,128,-16,-16,128,1136,992,1280,-160,-16, + $ -160,128,-1024,-16,128,2,20,20,-124,-124,56,-16,128,2,20,-16,2 + $ ,2,-16,-142,-124,-160,20,2,20,20,-124,-124,56,20,200,-124,1028, + $ -106,-88,-124,-106,56,-88,884,-232,1028,-88,-88,-232,-232,272, + $ -16,128,2,20,-16,2,-160,1280,20,200,-160,20,-142,38,-124,-106, + $ -268,-88,1136,-142,992,-124,1010,1028,2,-16,-142,-124,-160,20 + $ ,20,-160,38,-106,992,-124,1010,-268,-268,884,884,-232,992,-124, + $ -448,56,-268,-88/ C 1 T(1,2,6,7,5,3,4) - DATA (CF(I, 5),I= 1, 6) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 5),I= 7, 12) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 5),I= 13, 18) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 5),I= 19, 24) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 5),I= 25, 30) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 5),I= 31, 36) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 5),I= 37, 42) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 5),I= 43, 48) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 5),I= 49, 54) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 5),I= 55, 60) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 5),I= 61, 66) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 5),I= 67, 72) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 5),I= 73, 78) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 5),I= 79, 84) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 5),I= 85, 90) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 5),I= 91, 96) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 5),I= 97,102) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 5),I=103,108) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 5),I=109,114) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 5),I=115,120) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ + DATA (CF(I),I=475,590) /4096,-1024,-16,128,1136,992,1280,-160, + $ -160,-16,992,-448,-160,992,-1024,128,128,-16,-16,-160,-16,128, + $ -160,-16,-1024,128,2,-16,-142,-124,-160,20,20,2,-124,56,20,-124 + $ ,128,-16,-16,2,2,20,2,-16,-142,-124,-160,20,20,-160,38,-106,992 + $ ,-124,1010,-268,-268,884,884,-232,992,-124,-448,56,-268,-88,20 + $ ,2,-124,56,20,-124,200,20,-106,-88,-124,1028,1028,-88,-88,-232, + $ -232,272,-124,-106,56,-88,884,-232,128,-16,-16,2,2,20,1280,-160 + $ ,-160,20,20,200,1136,-142,992,-124,1010,1028,-142,38,-124,-106, + $ -268,-88/ C 1 T(1,2,7,5,6,3,4) - DATA (CF(I, 6),I= 1, 6) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 6),I= 7, 12) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 6),I= 13, 18) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 6),I= 19, 24) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 6),I= 25, 30) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 6),I= 31, 36) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 6),I= 37, 42) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 6),I= 43, 48) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 6),I= 49, 54) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 6),I= 55, 60) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 6),I= 61, 66) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 6),I= 67, 72) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 6),I= 73, 78) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 6),I= 79, 84) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 6),I= 85, 90) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 6),I= 91, 96) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 6),I= 97,102) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 6),I=103,108) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 6),I=109,114) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 6),I=115,120) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ + DATA (CF(I),I=591,705) /4096,-160,-16,992,-448,-160,992,-16,128 + $ ,1136,992,1280,-160,128,-1024,-16,-160,128,-16,-160,-16,-16,128 + $ ,128,-1024,20,2,-124,56,20,-124,2,-16,-142,-124,-160,20,-16,128 + $ ,2,20,-16,2,20,2,-124,56,20,-124,200,20,-106,-88,-124,1028,1028 + $ ,-88,-88,-232,-232,272,-124,-106,56,-88,884,-232,2,-16,-142, + $ -124,-160,20,20,-160,38,-106,992,-124,1010,-268,-268,884,884, + $ -232,992,-124,-448,56,-268,-88,-16,128,2,20,-16,2,-160,1280,20 + $ ,200,-160,20,-142,38,-124,-106,-268,-88,1136,-142,992,-124,1010 + $ ,1028/ C 1 T(1,2,7,6,5,3,4) - DATA (CF(I, 7),I= 1, 6) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 7),I= 7, 12) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 7),I= 13, 18) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 7),I= 19, 24) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 7),I= 25, 30) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 7),I= 31, 36) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 7),I= 37, 42) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 7),I= 43, 48) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 7),I= 49, 54) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 7),I= 55, 60) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 7),I= 61, 66) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 7),I= 67, 72) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 7),I= 73, 78) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 7),I= 79, 84) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 7),I= 85, 90) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 7),I= 91, 96) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 7),I= 97,102) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 7),I=103,108) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 7),I=109,114) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 7),I=115,120) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ + DATA (CF(I),I=706,819) /4096,-1024,-1024,128,128,1280,1280,-160 + $ ,128,-16,992,1136,-160,992,-16,-160,-448,992,128,-16,-16,2,2,20 + $ ,1280,-160,-160,20,20,200,1136,-142,992,-124,1010,1028,-142,38, + $ -124,-106,-268,-88,-1024,128,128,-16,-16,-160,128,-16,-16,2,2 + $ ,20,-16,2,-160,20,-142,-124,2,20,20,-124,-124,56,-160,20,-16,2, + $ -124,-142,992,-124,-448,56,-268,-88,-160,20,992,-124,38,-106, + $ -268,1010,884,-232,-268,884,20,-124,2,20,56,-124,-124,-106,56, + $ -88,884,-232,20,200,-124,1028,-106,-88,-88,1028,-232,272,-88, + $ -232/ C 1 T(1,5,2,6,7,3,4) - DATA (CF(I, 8),I= 1, 6) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 8),I= 7, 12) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 8),I= 13, 18) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 8),I= 19, 24) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 8),I= 25, 30) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 8),I= 31, 36) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 8),I= 37, 42) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 8),I= 43, 48) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 8),I= 49, 54) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 8),I= 55, 60) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 8),I= 61, 66) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 8),I= 67, 72) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 8),I= 73, 78) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 8),I= 79, 84) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 8),I= 85, 90) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 8),I= 91, 96) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 8),I= 97,102) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 8),I=103,108) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 8),I=109,114) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 8),I=115,120) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ + DATA (CF(I),I=820,932) /4096,128,1280,-1024,128,-160,992,-16, + $ -160,-448,992,1280,-160,128,-16,992,1136,-16,128,2,20,-16,2, + $ -160,1280,20,200,-160,20,-142,38,-124,-106,-268,-88,1136,-142 + $ ,992,-124,1010,1028,128,-1024,-16,-160,128,-16,-16,128,2,20,-16 + $ ,2,2,20,20,-124,-124,56,-16,2,-160,20,-142,-124,20,-124,2,20,56 + $ ,-124,-124,-106,56,-88,884,-232,20,200,-124,1028,-106,-88,-88 + $ ,1028,-232,272,-88,-232,-160,20,-16,2,-124,-142,992,-124,-448 + $ ,56,-268,-88,-160,20,992,-124,38,-106,-268,1010,884,-232,-268 + $ ,884/ C 1 T(1,5,2,7,6,3,4) - DATA (CF(I, 9),I= 1, 6) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 9),I= 7, 12) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 9),I= 13, 18) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 9),I= 19, 24) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 9),I= 25, 30) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 9),I= 31, 36) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 9),I= 37, 42) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 9),I= 43, 48) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 9),I= 49, 54) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 9),I= 55, 60) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 9),I= 61, 66) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 9),I= 67, 72) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 9),I= 73, 78) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 9),I= 79, 84) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 9),I= 85, 90) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 9),I= 91, 96) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 9),I= 97,102) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 9),I=103,108) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 9),I=109,114) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 9),I=115,120) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ + DATA (CF(I),I=933,1044) /4096,-1024,1280,128,128,-16,-1024,128, + $ -160,-16,992,-448,-160,-16,992,-160,-16,2,-160,20,-142,-124, + $ -160,20,992,-124,38,-106,992,-124,-448,56,-268,-88,1010,-268, + $ -268,884,884,-232,128,-16,-1024,128,-160,-16,-16,2,-160,20,-142 + $ ,-124,128,-16,-16,2,2,20,20,2,-124,56,20,-124,-16,2,128,-16,20 + $ ,2,1136,-142,992,-124,1010,1028,1280,-160,-160,20,20,200,38, + $ -142,-268,-88,-124,-106,-124,56,20,2,-124,20,1028,-88,-88,-232, + $ -232,272,200,20,-106,-88,-124,1028,-106,-124,884,-232,56,-88/ C 1 T(1,5,6,2,7,3,4) - DATA (CF(I, 10),I= 1, 6) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 10),I= 7, 12) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 10),I= 13, 18) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 10),I= 19, 24) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 10),I= 25, 30) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 10),I= 31, 36) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 10),I= 37, 42) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 10),I= 43, 48) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 10),I= 49, 54) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 10),I= 55, 60) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 10),I= 61, 66) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 10),I= 67, 72) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 10),I= 73, 78) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 10),I= 79, 84) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 10),I= 85, 90) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 10),I= 91, 96) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 10),I= 97,102) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 10),I=103,108) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 10),I=109,114) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 10),I=115,120) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ + DATA (CF(I),I=1045,1155) /4096,128,-1024,-16,-160,128,-1024,-16 + $ ,128,1136,992,-16,128,-160,1280,2,20,20,-124,-124,56,20,200, + $ -124,1028,-106,-88,-124,-106,56,-88,884,-232,1028,-88,-88,-232, + $ -232,272,-16,-160,128,-1024,-16,128,2,20,20,-124,-124,56,-16 + $ ,128,2,20,-16,2,2,-16,-142,-124,-160,20,2,20,-16,128,2,-16,-142 + $ ,38,-124,-106,-268,-88,-160,1280,20,200,-160,20,-142,1136,1010 + $ ,1028,992,-124,-142,-124,2,-16,20,-160,1010,-268,-268,884,884, + $ -232,20,-160,38,-106,992,-124,-124,992,-268,-88,-448,56/ C 1 T(1,5,6,7,2,3,4) - DATA (CF(I, 11),I= 1, 6) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 11),I= 7, 12) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 11),I= 13, 18) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 11),I= 19, 24) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 11),I= 25, 30) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 11),I= 31, 36) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 11),I= 37, 42) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 11),I= 43, 48) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 11),I= 49, 54) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 11),I= 55, 60) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 11),I= 61, 66) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 11),I= 67, 72) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 11),I= 73, 78) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 11),I= 79, 84) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 11),I= 85, 90) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 11),I= 91, 96) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 11),I= 97,102) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 11),I=103,108) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 11),I=109,114) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 11),I=115,120) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ + DATA (CF(I),I=1156,1265) /4096,-1024,992,-448,-160,-16,992,-160 + $ ,128,-16,-1024,128,-160,-16,2,-16,-142,-124,-160,20,20,-160,38, + $ -106,992,-124,1010,-268,-268,884,884,-232,992,-124,-448,56,-268 + $ ,-88,-16,128,-160,-16,-1024,128,2,-16,-142,-124,-160,20,20,2, + $ -124,56,20,-124,128,-16,-16,2,2,20,-124,56,20,2,-124,20,1028, + $ -88,-88,-232,-232,272,200,20,-106,-88,-124,1028,-106,-124,884, + $ -232,56,-88,-16,2,128,-16,20,2,1136,-142,992,-124,1010,1028 + $ ,1280,-160,-160,20,20,200,38,-142,-268,-88,-124,-106/ C 1 T(1,5,7,2,6,3,4) - DATA (CF(I, 12),I= 1, 6) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 12),I= 7, 12) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 12),I= 13, 18) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 12),I= 19, 24) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 12),I= 25, 30) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 12),I= 31, 36) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 12),I= 37, 42) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 12),I= 43, 48) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 12),I= 49, 54) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 12),I= 55, 60) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 12),I= 61, 66) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 12),I= 67, 72) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 12),I= 73, 78) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 12),I= 79, 84) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 12),I= 85, 90) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 12),I= 91, 96) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 12),I= 97,102) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 12),I=103,108) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 12),I=109,114) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 12),I=115,120) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ + DATA (CF(I),I=1266,1374) /4096,1136,992,-16,128,-160,1280,-16, + $ -160,128,-1024,-16,128,20,2,-124,56,20,-124,200,20,-106,-88, + $ -124,1028,1028,-88,-88,-232,-232,272,-124,-106,56,-88,884,-232, + $ -160,-16,-16,128,128,-1024,20,2,-124,56,20,-124,2,-16,-142,-124 + $ ,-160,20,-16,128,2,20,-16,2,-142,-124,2,-16,20,-160,1010,-268, + $ -268,884,884,-232,20,-160,38,-106,992,-124,-124,992,-268,-88, + $ -448,56,2,20,-16,128,2,-16,-142,38,-124,-106,-268,-88,-160,1280 + $ ,20,200,-160,20,-142,1136,1010,1028,992,-124/ C 1 T(1,5,7,6,2,3,4) - DATA (CF(I, 13),I= 1, 6) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 13),I= 7, 12) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 13),I= 13, 18) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 13),I= 19, 24) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 13),I= 25, 30) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 13),I= 31, 36) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 13),I= 37, 42) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 13),I= 43, 48) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 13),I= 49, 54) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 13),I= 55, 60) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 13),I= 61, 66) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 13),I= 67, 72) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 13),I= 73, 78) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 13),I= 79, 84) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 13),I= 85, 90) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 13),I= 91, 96) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 13),I= 97,102) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 13),I=103,108) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 13),I=109,114) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 13),I=115,120) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ + DATA (CF(I),I=1375,1482) /4096,-1024,-1024,128,128,1280,992,-160 + $ ,-448,992,-16,-160,-16,2,128,-16,20,2,1136,-142,992,-124,1010 + $ ,1028,1280,-160,-160,20,20,200,38,-142,-268,-88,-124,-106,-160 + $ ,20,-16,2,-124,-142,992,-124,-448,56,-268,-88,-160,20,992,-124 + $ ,38,-106,-268,1010,884,-232,-268,884,-1024,128,128,-16,-16,-160 + $ ,128,-16,-16,2,2,20,-16,2,-160,20,-142,-124,2,20,20,-124,-124 + $ ,56,-124,20,56,-124,2,20,-106,-124,884,-232,56,-88,-88,1028, + $ -232,272,-88,-232,20,200,-124,1028,-106,-88/ C 1 T(1,6,2,5,7,3,4) - DATA (CF(I, 14),I= 1, 6) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 14),I= 7, 12) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 14),I= 13, 18) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 14),I= 19, 24) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 14),I= 25, 30) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 14),I= 31, 36) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 14),I= 37, 42) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 14),I= 43, 48) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 14),I= 49, 54) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 14),I= 55, 60) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 14),I= 61, 66) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 14),I= 67, 72) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 14),I= 73, 78) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 14),I= 79, 84) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 14),I= 85, 90) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 14),I= 91, 96) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 14),I= 97,102) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 14),I=103,108) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 14),I=109,114) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 14),I=115,120) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ + DATA (CF(I),I=1483,1589) /4096,128,1280,-1024,128,-160,1280,992 + $ ,1136,128,-16,2,20,-16,128,2,-16,-142,38,-124,-106,-268,-88, + $ -160,1280,20,200,-160,20,-142,1136,1010,1028,992,-124,20,-124,2 + $ ,20,56,-124,-124,-106,56,-88,884,-232,20,200,-124,1028,-106,-88 + $ ,-88,1028,-232,272,-88,-232,128,-1024,-16,-160,128,-16,-16,128 + $ ,2,20,-16,2,2,20,20,-124,-124,56,-16,2,-160,20,-142,-124,20, + $ -160,-124,-142,-16,2,-124,992,-268,-88,-448,56,-268,1010,884, + $ -232,-268,884,-160,20,992,-124,38,-106/ C 1 T(1,6,2,7,5,3,4) - DATA (CF(I, 15),I= 1, 6) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 15),I= 7, 12) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 15),I= 13, 18) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 15),I= 19, 24) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 15),I= 25, 30) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 15),I= 31, 36) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 15),I= 37, 42) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 15),I= 43, 48) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 15),I= 49, 54) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 15),I= 55, 60) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 15),I= 61, 66) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 15),I= 67, 72) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 15),I= 73, 78) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 15),I= 79, 84) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 15),I= 85, 90) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 15),I= 91, 96) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 15),I= 97,102) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 15),I=103,108) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 15),I=109,114) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 15),I=115,120) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ + DATA (CF(I),I=1590,1695) /4096,-1024,1280,128,-448,992,992,-160, + $ -160,-16,-160,20,-16,2,-124,-142,992,-124,-448,56,-268,-88,-160 + $ ,20,992,-124,38,-106,-268,1010,884,-232,-268,884,-16,2,128,-16 + $ ,20,2,1136,-142,992,-124,1010,1028,1280,-160,-160,20,20,200,38, + $ -142,-268,-88,-124,-106,128,-16,-1024,128,-160,-16,-16,2,-160 + $ ,20,-142,-124,128,-16,-16,2,2,20,20,2,-124,56,20,-124,56,-124, + $ -124,20,20,2,-88,1028,-232,272,-88,-232,-106,-124,884,-232,56, + $ -88,200,20,-106,-88,-124,1028/ C 1 T(1,6,5,2,7,3,4) - DATA (CF(I, 16),I= 1, 6) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 16),I= 7, 12) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 16),I= 13, 18) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 16),I= 19, 24) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 16),I= 25, 30) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 16),I= 31, 36) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 16),I= 37, 42) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 16),I= 43, 48) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 16),I= 49, 54) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 16),I= 55, 60) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 16),I= 61, 66) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 16),I= 67, 72) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 16),I= 73, 78) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 16),I= 79, 84) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 16),I= 85, 90) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 16),I= 91, 96) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 16),I= 97,102) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 16),I=103,108) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 16),I=109,114) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 16),I=115,120) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ + DATA (CF(I),I=1696,1800) /4096,128,-1024,992,1136,-160,1280,-16 + $ ,128,20,-124,2,20,56,-124,-124,-106,56,-88,884,-232,20,200,-124 + $ ,1028,-106,-88,-88,1028,-232,272,-88,-232,2,20,-16,128,2,-16, + $ -142,38,-124,-106,-268,-88,-160,1280,20,200,-160,20,-142,1136 + $ ,1010,1028,992,-124,-16,-160,128,-1024,-16,128,2,20,20,-124, + $ -124,56,-16,128,2,20,-16,2,2,-16,-142,-124,-160,20,-124,-142,20 + $ ,-160,2,-16,-268,1010,884,-232,-268,884,-124,992,-268,-88,-448 + $ ,56,20,-160,38,-106,992,-124/ C 1 T(1,6,5,7,2,3,4) - DATA (CF(I, 17),I= 1, 6) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 17),I= 7, 12) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 17),I= 13, 18) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 17),I= 19, 24) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 17),I= 25, 30) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 17),I= 31, 36) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 17),I= 37, 42) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 17),I= 43, 48) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 17),I= 49, 54) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 17),I= 55, 60) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 17),I= 61, 66) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 17),I= 67, 72) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 17),I= 73, 78) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 17),I= 79, 84) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 17),I= 85, 90) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 17),I= 91, 96) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 17),I= 97,102) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 17),I=103,108) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 17),I=109,114) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 17),I=115,120) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ + DATA (CF(I),I=1801,1904) /4096,-1024,-16,128,-160,-16,-1024,128, + $ -142,-124,2,-16,20,-160,1010,-268,-268,884,884,-232,20,-160,38, + $ -106,992,-124,-124,992,-268,-88,-448,56,-124,56,20,2,-124,20 + $ ,1028,-88,-88,-232,-232,272,200,20,-106,-88,-124,1028,-106,-124 + $ ,884,-232,56,-88,-16,128,-160,-16,-1024,128,2,-16,-142,-124, + $ -160,20,20,2,-124,56,20,-124,128,-16,-16,2,2,20,2,-16,20,2,128, + $ -16,-142,1136,1010,1028,992,-124,38,-142,-268,-88,-124,-106 + $ ,1280,-160,-160,20,20,200/ C 1 T(1,6,7,2,5,3,4) - DATA (CF(I, 18),I= 1, 6) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 18),I= 7, 12) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 18),I= 13, 18) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 18),I= 19, 24) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 18),I= 25, 30) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 18),I= 31, 36) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 18),I= 37, 42) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 18),I= 43, 48) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 18),I= 49, 54) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 18),I= 55, 60) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 18),I= 61, 66) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 18),I= 67, 72) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 18),I= 73, 78) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 18),I= 79, 84) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 18),I= 85, 90) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 18),I= 91, 96) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 18),I= 97,102) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 18),I=103,108) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 18),I=109,114) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 18),I=115,120) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ + DATA (CF(I),I=1905,2007) /4096,-160,-16,-16,128,128,-1024,-124 + $ ,56,20,2,-124,20,1028,-88,-88,-232,-232,272,200,20,-106,-88, + $ -124,1028,-106,-124,884,-232,56,-88,-142,-124,2,-16,20,-160 + $ ,1010,-268,-268,884,884,-232,20,-160,38,-106,992,-124,-124,992, + $ -268,-88,-448,56,-160,-16,-16,128,128,-1024,20,2,-124,56,20, + $ -124,2,-16,-142,-124,-160,20,-16,128,2,20,-16,2,20,2,2,-16,-16 + $ ,128,38,-142,-268,-88,-124,-106,-142,1136,1010,1028,992,-124, + $ -160,1280,20,200,-160,20/ C 1 T(1,6,7,5,2,3,4) - DATA (CF(I, 19),I= 1, 6) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 19),I= 7, 12) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 19),I= 13, 18) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 19),I= 19, 24) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 19),I= 25, 30) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 19),I= 31, 36) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 19),I= 37, 42) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 19),I= 43, 48) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 19),I= 49, 54) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 19),I= 55, 60) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 19),I= 61, 66) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 19),I= 67, 72) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 19),I= 73, 78) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 19),I= 79, 84) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 19),I= 85, 90) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 19),I= 91, 96) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 19),I= 97,102) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 19),I=103,108) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 19),I=109,114) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 19),I=115,120) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ + DATA (CF(I),I=2008,2109) /4096,-1024,-1024,128,128,1280,2,-16,20 + $ ,2,128,-16,-142,1136,1010,1028,992,-124,38,-142,-268,-88,-124, + $ -106,1280,-160,-160,20,20,200,20,-160,-124,-142,-16,2,-124,992, + $ -268,-88,-448,56,-268,1010,884,-232,-268,884,-160,20,992,-124 + $ ,38,-106,-124,20,56,-124,2,20,-106,-124,884,-232,56,-88,-88 + $ ,1028,-232,272,-88,-232,20,200,-124,1028,-106,-88,-1024,128,128 + $ ,-16,-16,-160,128,-16,-16,2,2,20,-16,2,-160,20,-142,-124,2,20 + $ ,20,-124,-124,56/ C 1 T(1,7,2,5,6,3,4) - DATA (CF(I, 20),I= 1, 6) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 20),I= 7, 12) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 20),I= 13, 18) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 20),I= 19, 24) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 20),I= 25, 30) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 20),I= 31, 36) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 20),I= 37, 42) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 20),I= 43, 48) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 20),I= 49, 54) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 20),I= 55, 60) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 20),I= 61, 66) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 20),I= 67, 72) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 20),I= 73, 78) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 20),I= 79, 84) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 20),I= 85, 90) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 20),I= 91, 96) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 20),I= 97,102) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 20),I=103,108) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 20),I=109,114) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 20),I=115,120) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ + DATA (CF(I),I=2110,2210) /4096,128,1280,-1024,128,20,2,2,-16,-16 + $ ,128,38,-142,-268,-88,-124,-106,-142,1136,1010,1028,992,-124, + $ -160,1280,20,200,-160,20,-124,20,56,-124,2,20,-106,-124,884, + $ -232,56,-88,-88,1028,-232,272,-88,-232,20,200,-124,1028,-106, + $ -88,20,-160,-124,-142,-16,2,-124,992,-268,-88,-448,56,-268,1010 + $ ,884,-232,-268,884,-160,20,992,-124,38,-106,128,-1024,-16,-160 + $ ,128,-16,-16,128,2,20,-16,2,2,20,20,-124,-124,56,-16,2,-160,20, + $ -142,-124/ C 1 T(1,7,2,6,5,3,4) - DATA (CF(I, 21),I= 1, 6) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 21),I= 7, 12) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 21),I= 13, 18) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 21),I= 19, 24) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 21),I= 25, 30) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 21),I= 31, 36) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 21),I= 37, 42) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 21),I= 43, 48) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 21),I= 49, 54) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 21),I= 55, 60) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 21),I= 61, 66) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 21),I= 67, 72) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 21),I= 73, 78) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 21),I= 79, 84) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 21),I= 85, 90) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 21),I= 91, 96) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 21),I= 97,102) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 21),I=103,108) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 21),I=109,114) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 21),I=115,120) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ + DATA (CF(I),I=2211,2310) /4096,-1024,1280,128,20,-160,-124,-142, + $ -16,2,-124,992,-268,-88,-448,56,-268,1010,884,-232,-268,884, + $ -160,20,992,-124,38,-106,2,-16,20,2,128,-16,-142,1136,1010,1028 + $ ,992,-124,38,-142,-268,-88,-124,-106,1280,-160,-160,20,20,200 + $ ,56,-124,-124,20,20,2,-88,1028,-232,272,-88,-232,-106,-124,884, + $ -232,56,-88,200,20,-106,-88,-124,1028,128,-16,-1024,128,-160, + $ -16,-16,2,-160,20,-142,-124,128,-16,-16,2,2,20,20,2,-124,56,20, + $ -124/ C 1 T(1,7,5,2,6,3,4) - DATA (CF(I, 22),I= 1, 6) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 22),I= 7, 12) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 22),I= 13, 18) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 22),I= 19, 24) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 22),I= 25, 30) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 22),I= 31, 36) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 22),I= 37, 42) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 22),I= 43, 48) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 22),I= 49, 54) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 22),I= 55, 60) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 22),I= 61, 66) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 22),I= 67, 72) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 22),I= 73, 78) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 22),I= 79, 84) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 22),I= 85, 90) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 22),I= 91, 96) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 22),I= 97,102) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 22),I=103,108) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 22),I=109,114) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 22),I=115,120) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ + DATA (CF(I),I=2311,2409) /4096,128,-1024,-124,20,56,-124,2,20, + $ -106,-124,884,-232,56,-88,-88,1028,-232,272,-88,-232,20,200, + $ -124,1028,-106,-88,20,2,2,-16,-16,128,38,-142,-268,-88,-124, + $ -106,-142,1136,1010,1028,992,-124,-160,1280,20,200,-160,20,-124 + $ ,-142,20,-160,2,-16,-268,1010,884,-232,-268,884,-124,992,-268, + $ -88,-448,56,20,-160,38,-106,992,-124,-16,-160,128,-1024,-16,128 + $ ,2,20,20,-124,-124,56,-16,128,2,20,-16,2,2,-16,-142,-124,-160 + $ ,20/ C 1 T(1,7,5,6,2,3,4) - DATA (CF(I, 23),I= 1, 6) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 23),I= 7, 12) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 23),I= 13, 18) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 23),I= 19, 24) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 23),I= 25, 30) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 23),I= 31, 36) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 23),I= 37, 42) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 23),I= 43, 48) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 23),I= 49, 54) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 23),I= 55, 60) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 23),I= 61, 66) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 23),I= 67, 72) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 23),I= 73, 78) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 23),I= 79, 84) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 23),I= 85, 90) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 23),I= 91, 96) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 23),I= 97,102) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 23),I=103,108) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 23),I=109,114) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 23),I=115,120) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ + DATA (CF(I),I=2410,2507) /4096,-1024,-124,-142,20,-160,2,-16, + $ -268,1010,884,-232,-268,884,-124,992,-268,-88,-448,56,20,-160 + $ ,38,-106,992,-124,56,-124,-124,20,20,2,-88,1028,-232,272,-88, + $ -232,-106,-124,884,-232,56,-88,200,20,-106,-88,-124,1028,2,-16 + $ ,20,2,128,-16,-142,1136,1010,1028,992,-124,38,-142,-268,-88, + $ -124,-106,1280,-160,-160,20,20,200,-16,128,-160,-16,-1024,128,2 + $ ,-16,-142,-124,-160,20,20,2,-124,56,20,-124,128,-16,-16,2,2,20/ C 1 T(1,7,6,2,5,3,4) - DATA (CF(I, 24),I= 1, 6) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 24),I= 7, 12) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 24),I= 13, 18) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 24),I= 19, 24) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 24),I= 25, 30) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 24),I= 31, 36) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 24),I= 37, 42) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 24),I= 43, 48) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 24),I= 49, 54) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 24),I= 55, 60) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 24),I= 61, 66) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 24),I= 67, 72) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 24),I= 73, 78) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 24),I= 79, 84) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 24),I= 85, 90) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 24),I= 91, 96) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 24),I= 97,102) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 24),I=103,108) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 24),I=109,114) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 24),I=115,120) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ + DATA (CF(I),I=2508,2604) /4096,56,-124,-124,20,20,2,-88,1028, + $ -232,272,-88,-232,-106,-124,884,-232,56,-88,200,20,-106,-88, + $ -124,1028,-124,-142,20,-160,2,-16,-268,1010,884,-232,-268,884, + $ -124,992,-268,-88,-448,56,20,-160,38,-106,992,-124,20,2,2,-16, + $ -16,128,38,-142,-268,-88,-124,-106,-142,1136,1010,1028,992,-124 + $ ,-160,1280,20,200,-160,20,-160,-16,-16,128,128,-1024,20,2,-124 + $ ,56,20,-124,2,-16,-142,-124,-160,20,-16,128,2,20,-16,2/ C 1 T(1,7,6,5,2,3,4) - DATA (CF(I, 25),I= 1, 6) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 25),I= 7, 12) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 25),I= 13, 18) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 25),I= 19, 24) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 25),I= 25, 30) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 25),I= 31, 36) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 25),I= 37, 42) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 25),I= 43, 48) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 25),I= 49, 54) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 25),I= 55, 60) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 25),I= 61, 66) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 25),I= 67, 72) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 25),I= 73, 78) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 25),I= 79, 84) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 25),I= 85, 90) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 25),I= 91, 96) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 25),I= 97,102) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 25),I=103,108) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 25),I=109,114) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 25),I=115,120) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ + DATA (CF(I),I=2605,2700) /4096,-1024,-1024,128,128,1280,-1024 + $ ,128,128,-16,-16,-160,128,-16,1280,-160,1136,992,-16,-160,-160 + $ ,992,992,-448,1280,-160,-160,20,20,200,128,-16,-16,2,2,20,992, + $ -124,1136,-142,1028,1010,-124,-106,-142,38,-88,-268,-160,20,992 + $ ,-124,38,-106,-16,2,-160,20,-142,-124,-448,56,992,-124,-88,-268 + $ ,-268,884,1010,-268,-232,884,20,200,-124,1028,-106,-88,2,20,20, + $ -124,-124,56,56,-88,-124,-106,-232,884,-88,-232,1028,-88,272, + $ -232/ C 1 T(2,1,5,6,7,3,4) - DATA (CF(I, 26),I= 1, 6) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 26),I= 7, 12) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 26),I= 13, 18) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 26),I= 19, 24) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 26),I= 25, 30) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 26),I= 31, 36) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 26),I= 37, 42) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 26),I= 43, 48) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 26),I= 49, 54) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 26),I= 55, 60) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 26),I= 61, 66) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 26),I= 67, 72) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 26),I= 73, 78) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 26),I= 79, 84) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 26),I= 85, 90) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 26),I= 91, 96) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 26),I= 97,102) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 26),I=103,108) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 26),I=109,114) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 26),I=115,120) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ + DATA (CF(I),I=2701,2795) /4096,128,1280,-1024,128,128,-1024,-16, + $ -160,128,-16,-16,-160,-160,992,992,-448,128,-16,1280,-160,1136 + $ ,992,-160,1280,20,200,-160,20,-16,128,2,20,-16,2,-124,-106,-142 + $ ,38,-88,-268,992,-124,1136,-142,1028,1010,20,200,-124,1028,-106 + $ ,-88,2,20,20,-124,-124,56,56,-88,-124,-106,-232,884,-88,-232 + $ ,1028,-88,272,-232,-160,20,992,-124,38,-106,-16,2,-160,20,-142, + $ -124,-448,56,992,-124,-88,-268,-268,884,1010,-268,-232,884/ C 1 T(2,1,5,7,6,3,4) - DATA (CF(I, 27),I= 1, 6) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 27),I= 7, 12) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 27),I= 13, 18) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 27),I= 19, 24) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 27),I= 25, 30) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 27),I= 31, 36) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 27),I= 37, 42) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 27),I= 43, 48) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 27),I= 49, 54) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 27),I= 55, 60) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 27),I= 61, 66) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 27),I= 67, 72) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 27),I= 73, 78) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 27),I= 79, 84) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 27),I= 85, 90) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 27),I= 91, 96) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 27),I= 97,102) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 27),I=103,108) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 27),I=109,114) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 27),I=115,120) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ + DATA (CF(I),I=2796,2889) /4096,-1024,1280,128,128,-16,1280,-160 + $ ,1136,992,-1024,128,128,-16,-16,-160,-160,-16,992,-448,-160,992 + $ ,-160,20,992,-124,38,-106,-16,2,-160,20,-142,-124,-448,56,992, + $ -124,-88,-268,-268,884,1010,-268,-232,884,1280,-160,-160,20,20 + $ ,200,128,-16,-16,2,2,20,992,-124,1136,-142,1028,1010,-124,-106, + $ -142,38,-88,-268,200,20,-106,-88,-124,1028,20,2,-124,56,20,-124 + $ ,-88,-232,1028,-88,272,-232,56,-88,-124,-106,-232,884/ C 1 T(2,1,6,5,7,3,4) - DATA (CF(I, 28),I= 1, 6) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 28),I= 7, 12) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 28),I= 13, 18) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 28),I= 19, 24) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 28),I= 25, 30) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 28),I= 31, 36) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 28),I= 37, 42) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 28),I= 43, 48) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 28),I= 49, 54) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 28),I= 55, 60) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 28),I= 61, 66) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 28),I= 67, 72) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 28),I= 73, 78) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 28),I= 79, 84) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 28),I= 85, 90) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 28),I= 91, 96) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 28),I= 97,102) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 28),I=103,108) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 28),I=109,114) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 28),I=115,120) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ + DATA (CF(I),I=2890,2982) /4096,128,-1024,-16,-160,-160,992,992, + $ -448,128,-1024,-16,-160,128,-16,-16,128,1136,992,1280,-160,20 + $ ,200,-124,1028,-106,-88,2,20,20,-124,-124,56,56,-88,-124,-106, + $ -232,884,-88,-232,1028,-88,272,-232,-160,1280,20,200,-160,20, + $ -16,128,2,20,-16,2,-124,-106,-142,38,-88,-268,992,-124,1136, + $ -142,1028,1010,20,-160,38,-106,992,-124,2,-16,-142,-124,-160,20 + $ ,-268,884,1010,-268,-232,884,-448,56,992,-124,-88,-268/ C 1 T(2,1,6,7,5,3,4) - DATA (CF(I, 29),I= 1, 6) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 29),I= 7, 12) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 29),I= 13, 18) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 29),I= 19, 24) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 29),I= 25, 30) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 29),I= 31, 36) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 29),I= 37, 42) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 29),I= 43, 48) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 29),I= 49, 54) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 29),I= 55, 60) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 29),I= 61, 66) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 29),I= 67, 72) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 29),I= 73, 78) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 29),I= 79, 84) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 29),I= 85, 90) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 29),I= 91, 96) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 29),I= 97,102) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 29),I=103,108) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 29),I=109,114) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 29),I=115,120) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ + DATA (CF(I),I=2983,3074) /4096,-1024,-16,128,1136,992,1280,-160, + $ -160,-16,992,-448,-160,992,-1024,128,128,-16,-16,-160,20,-160 + $ ,38,-106,992,-124,2,-16,-142,-124,-160,20,-268,884,1010,-268, + $ -232,884,-448,56,992,-124,-88,-268,200,20,-106,-88,-124,1028,20 + $ ,2,-124,56,20,-124,-88,-232,1028,-88,272,-232,56,-88,-124,-106, + $ -232,884,1280,-160,-160,20,20,200,128,-16,-16,2,2,20,992,-124 + $ ,1136,-142,1028,1010,-124,-106,-142,38,-88,-268/ C 1 T(2,1,7,5,6,3,4) - DATA (CF(I, 30),I= 1, 6) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 30),I= 7, 12) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 30),I= 13, 18) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 30),I= 19, 24) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 30),I= 25, 30) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 30),I= 31, 36) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 30),I= 37, 42) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 30),I= 43, 48) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 30),I= 49, 54) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 30),I= 55, 60) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 30),I= 61, 66) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 30),I= 67, 72) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 30),I= 73, 78) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 30),I= 79, 84) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 30),I= 85, 90) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 30),I= 91, 96) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 30),I= 97,102) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 30),I=103,108) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 30),I=109,114) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 30),I=115,120) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ + DATA (CF(I),I=3075,3165) /4096,-160,-16,992,-448,-160,992,-16 + $ ,128,1136,992,1280,-160,128,-1024,-16,-160,128,-16,200,20,-106, + $ -88,-124,1028,20,2,-124,56,20,-124,-88,-232,1028,-88,272,-232 + $ ,56,-88,-124,-106,-232,884,20,-160,38,-106,992,-124,2,-16,-142, + $ -124,-160,20,-268,884,1010,-268,-232,884,-448,56,992,-124,-88, + $ -268,-160,1280,20,200,-160,20,-16,128,2,20,-16,2,-124,-106,-142 + $ ,38,-88,-268,992,-124,1136,-142,1028,1010/ C 1 T(2,1,7,6,5,3,4) - DATA (CF(I, 31),I= 1, 6) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 31),I= 7, 12) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 31),I= 13, 18) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 31),I= 19, 24) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 31),I= 25, 30) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 31),I= 31, 36) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 31),I= 37, 42) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 31),I= 43, 48) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 31),I= 49, 54) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 31),I= 55, 60) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 31),I= 61, 66) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 31),I= 67, 72) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 31),I= 73, 78) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 31),I= 79, 84) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 31),I= 85, 90) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 31),I= 91, 96) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 31),I= 97,102) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 31),I=103,108) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 31),I=109,114) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 31),I=115,120) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ + DATA (CF(I),I=3166,3255) /4096,-1024,-1024,128,128,1280,1280, + $ -160,128,-16,992,1136,-160,992,-16,-160,-448,992,128,-16,-16,2 + $ ,2,20,-1024,128,128,-16,-16,-160,-160,20,-16,2,-124,-142,20, + $ -124,2,20,56,-124,992,-124,-448,56,-268,-88,-160,20,-16,2,-124, + $ -142,992,-124,-160,20,-106,38,884,-232,-268,1010,884,-268,-124, + $ -106,56,-88,884,-232,20,-124,2,20,56,-124,-124,1028,20,200,-88, + $ -106,-232,272,-88,1028,-232,-88/ C 1 T(2,5,1,6,7,3,4) - DATA (CF(I, 32),I= 1, 6) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 32),I= 7, 12) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 32),I= 13, 18) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 32),I= 19, 24) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 32),I= 25, 30) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 32),I= 31, 36) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 32),I= 37, 42) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 32),I= 43, 48) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 32),I= 49, 54) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 32),I= 55, 60) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 32),I= 61, 66) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 32),I= 67, 72) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 32),I= 73, 78) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 32),I= 79, 84) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 32),I= 85, 90) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 32),I= 91, 96) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 32),I= 97,102) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 32),I=103,108) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 32),I=109,114) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 32),I=115,120) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ + DATA (CF(I),I=3256,3344) /4096,128,1280,-1024,128,-160,992,-16, + $ -160,-448,992,1280,-160,128,-16,992,1136,-16,128,2,20,-16,2,128 + $ ,-1024,-16,-160,128,-16,20,-124,2,20,56,-124,-160,20,-16,2,-124 + $ ,-142,-124,-106,56,-88,884,-232,20,-124,2,20,56,-124,-124,1028 + $ ,20,200,-88,-106,-232,272,-88,1028,-232,-88,992,-124,-448,56, + $ -268,-88,-160,20,-16,2,-124,-142,992,-124,-160,20,-106,38,884, + $ -232,-268,1010,884,-268/ C 1 T(2,5,1,7,6,3,4) - DATA (CF(I, 33),I= 1, 6) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 33),I= 7, 12) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 33),I= 13, 18) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 33),I= 19, 24) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 33),I= 25, 30) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 33),I= 31, 36) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 33),I= 37, 42) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 33),I= 43, 48) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 33),I= 49, 54) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 33),I= 55, 60) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 33),I= 61, 66) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 33),I= 67, 72) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 33),I= 73, 78) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 33),I= 79, 84) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 33),I= 85, 90) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 33),I= 91, 96) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 33),I= 97,102) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 33),I=103,108) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 33),I=109,114) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 33),I=115,120) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ + DATA (CF(I),I=3345,3432) /4096,-1024,1280,128,128,-16,-1024,128, + $ -160,-16,992,-448,-160,-16,992,-160,-16,2,-160,20,-142,-124,128 + $ ,-16,-1024,128,-160,-16,-16,2,128,-16,20,2,-124,56,20,2,-124,20 + $ ,1136,-142,992,-124,1010,1028,-16,2,128,-16,20,2,-160,20,1280, + $ -160,200,20,-268,-88,38,-142,-106,-124,1028,-88,-88,-232,-232 + $ ,272,-124,56,20,2,-124,20,-106,-88,200,20,1028,-124,884,-232, + $ -106,-124,-88,56/ C 1 T(2,5,6,1,7,3,4) - DATA (CF(I, 34),I= 1, 6) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 34),I= 7, 12) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 34),I= 13, 18) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 34),I= 19, 24) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 34),I= 25, 30) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 34),I= 31, 36) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 34),I= 37, 42) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 34),I= 43, 48) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 34),I= 49, 54) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 34),I= 55, 60) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 34),I= 61, 66) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 34),I= 67, 72) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 34),I= 73, 78) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 34),I= 79, 84) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 34),I= 85, 90) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 34),I= 91, 96) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 34),I= 97,102) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 34),I=103,108) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 34),I=109,114) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 34),I=115,120) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ + DATA (CF(I),I=3433,3519) /4096,128,-1024,-16,-160,128,-1024,-16 + $ ,128,1136,992,-16,128,-160,1280,2,20,20,-124,-124,56,-16,-160 + $ ,128,-1024,-16,128,2,20,-16,128,2,-16,-142,-124,2,-16,20,-160, + $ -142,38,-124,-106,-268,-88,2,20,-16,128,2,-16,20,200,-160,1280 + $ ,20,-160,1010,1028,-142,1136,-124,992,1010,-268,-268,884,884, + $ -232,-142,-124,2,-16,20,-160,38,-106,20,-160,-124,992,-268,-88, + $ -124,992,56,-448/ C 1 T(2,5,6,7,1,3,4) - DATA (CF(I, 35),I= 1, 6) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 35),I= 7, 12) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 35),I= 13, 18) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 35),I= 19, 24) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 35),I= 25, 30) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 35),I= 31, 36) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 35),I= 37, 42) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 35),I= 43, 48) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 35),I= 49, 54) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 35),I= 55, 60) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 35),I= 61, 66) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 35),I= 67, 72) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 35),I= 73, 78) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 35),I= 79, 84) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 35),I= 85, 90) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 35),I= 91, 96) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 35),I= 97,102) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 35),I=103,108) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 35),I=109,114) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 35),I=115,120) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ + DATA (CF(I),I=3520,3605) /4096,-1024,992,-448,-160,-16,992,-160 + $ ,128,-16,-1024,128,-160,-16,2,-16,-142,-124,-160,20,-16,128, + $ -160,-16,-1024,128,-124,56,20,2,-124,20,-16,2,128,-16,20,2,1028 + $ ,-88,-88,-232,-232,272,-124,56,20,2,-124,20,-106,-88,200,20 + $ ,1028,-124,884,-232,-106,-124,-88,56,1136,-142,992,-124,1010 + $ ,1028,-16,2,128,-16,20,2,-160,20,1280,-160,200,20,-268,-88,38, + $ -142,-106,-124/ C 1 T(2,5,7,1,6,3,4) - DATA (CF(I, 36),I= 1, 6) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 36),I= 7, 12) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 36),I= 13, 18) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 36),I= 19, 24) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 36),I= 25, 30) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 36),I= 31, 36) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 36),I= 37, 42) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 36),I= 43, 48) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 36),I= 49, 54) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 36),I= 55, 60) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 36),I= 61, 66) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 36),I= 67, 72) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 36),I= 73, 78) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 36),I= 79, 84) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 36),I= 85, 90) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 36),I= 91, 96) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 36),I= 97,102) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 36),I=103,108) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 36),I=109,114) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 36),I=115,120) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ + DATA (CF(I),I=3606,3690) /4096,1136,992,-16,128,-160,1280,-16, + $ -160,128,-1024,-16,128,20,2,-124,56,20,-124,-160,-16,-16,128 + $ ,128,-1024,-142,-124,2,-16,20,-160,2,20,-16,128,2,-16,1010,-268 + $ ,-268,884,884,-232,-142,-124,2,-16,20,-160,38,-106,20,-160,-124 + $ ,992,-268,-88,-124,992,56,-448,-142,38,-124,-106,-268,-88,2,20, + $ -16,128,2,-16,20,200,-160,1280,20,-160,1010,1028,-142,1136,-124 + $ ,992/ C 1 T(2,5,7,6,1,3,4) - DATA (CF(I, 37),I= 1, 6) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 37),I= 7, 12) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 37),I= 13, 18) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 37),I= 19, 24) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 37),I= 25, 30) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 37),I= 31, 36) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 37),I= 37, 42) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 37),I= 43, 48) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 37),I= 49, 54) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 37),I= 55, 60) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 37),I= 61, 66) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 37),I= 67, 72) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 37),I= 73, 78) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 37),I= 79, 84) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 37),I= 85, 90) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 37),I= 91, 96) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 37),I= 97,102) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 37),I=103,108) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 37),I=109,114) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 37),I=115,120) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ + DATA (CF(I),I=3691,3774) /4096,-1024,-1024,128,128,1280,992,-160 + $ ,-448,992,-16,-160,992,-124,-448,56,-268,-88,-160,20,-16,2,-124 + $ ,-142,992,-124,-160,20,-106,38,884,-232,-268,1010,884,-268,128, + $ -16,-16,2,2,20,-1024,128,128,-16,-16,-160,-160,20,-16,2,-124, + $ -142,20,-124,2,20,56,-124,-106,-124,884,-232,56,-88,-124,20,56, + $ -124,2,20,-232,272,-88,1028,-232,-88,-124,1028,20,200,-88,-106/ C 1 T(2,6,1,5,7,3,4) - DATA (CF(I, 38),I= 1, 6) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 38),I= 7, 12) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 38),I= 13, 18) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 38),I= 19, 24) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 38),I= 25, 30) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 38),I= 31, 36) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 38),I= 37, 42) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 38),I= 43, 48) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 38),I= 49, 54) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 38),I= 55, 60) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 38),I= 61, 66) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 38),I= 67, 72) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 38),I= 73, 78) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 38),I= 79, 84) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 38),I= 85, 90) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 38),I= 91, 96) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 38),I= 97,102) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 38),I=103,108) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 38),I=109,114) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 38),I=115,120) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ + DATA (CF(I),I=3775,3857) /4096,128,1280,-1024,128,-160,1280,992 + $ ,1136,128,-16,-124,-106,56,-88,884,-232,20,-124,2,20,56,-124, + $ -124,1028,20,200,-88,-106,-232,272,-88,1028,-232,-88,-16,128,2 + $ ,20,-16,2,128,-1024,-16,-160,128,-16,20,-124,2,20,56,-124,-160 + $ ,20,-16,2,-124,-142,-124,992,-268,-88,-448,56,20,-160,-124,-142 + $ ,-16,2,884,-232,-268,1010,884,-268,992,-124,-160,20,-106,38/ C 1 T(2,6,1,7,5,3,4) - DATA (CF(I, 39),I= 1, 6) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 39),I= 7, 12) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 39),I= 13, 18) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 39),I= 19, 24) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 39),I= 25, 30) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 39),I= 31, 36) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 39),I= 37, 42) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 39),I= 43, 48) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 39),I= 49, 54) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 39),I= 55, 60) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 39),I= 61, 66) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 39),I= 67, 72) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 39),I= 73, 78) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 39),I= 79, 84) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 39),I= 85, 90) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 39),I= 91, 96) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 39),I= 97,102) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 39),I=103,108) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 39),I=109,114) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 39),I=115,120) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ + DATA (CF(I),I=3858,3939) /4096,-1024,1280,128,-448,992,992,-160, + $ -160,-16,1136,-142,992,-124,1010,1028,-16,2,128,-16,20,2,-160 + $ ,20,1280,-160,200,20,-268,-88,38,-142,-106,-124,-16,2,-160,20, + $ -142,-124,128,-16,-1024,128,-160,-16,-16,2,128,-16,20,2,-124,56 + $ ,20,2,-124,20,-88,1028,-232,272,-88,-232,56,-124,-124,20,20,2 + $ ,884,-232,-106,-124,-88,56,-106,-88,200,20,1028,-124/ C 1 T(2,6,5,1,7,3,4) - DATA (CF(I, 40),I= 1, 6) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 40),I= 7, 12) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 40),I= 13, 18) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 40),I= 19, 24) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 40),I= 25, 30) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 40),I= 31, 36) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 40),I= 37, 42) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 40),I= 43, 48) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 40),I= 49, 54) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 40),I= 55, 60) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 40),I= 61, 66) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 40),I= 67, 72) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 40),I= 73, 78) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 40),I= 79, 84) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 40),I= 85, 90) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 40),I= 91, 96) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 40),I= 97,102) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 40),I=103,108) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 40),I=109,114) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 40),I=115,120) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ + DATA (CF(I),I=3940,4020) /4096,128,-1024,992,1136,-160,1280,-16 + $ ,128,-142,38,-124,-106,-268,-88,2,20,-16,128,2,-16,20,200,-160 + $ ,1280,20,-160,1010,1028,-142,1136,-124,992,2,20,20,-124,-124,56 + $ ,-16,-160,128,-1024,-16,128,2,20,-16,128,2,-16,-142,-124,2,-16 + $ ,20,-160,-268,1010,884,-232,-268,884,-124,-142,20,-160,2,-16, + $ -268,-88,-124,992,56,-448,38,-106,20,-160,-124,992/ C 1 T(2,6,5,7,1,3,4) - DATA (CF(I, 41),I= 1, 6) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 41),I= 7, 12) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 41),I= 13, 18) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 41),I= 19, 24) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 41),I= 25, 30) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 41),I= 31, 36) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 41),I= 37, 42) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 41),I= 43, 48) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 41),I= 49, 54) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 41),I= 55, 60) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 41),I= 61, 66) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 41),I= 67, 72) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 41),I= 73, 78) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 41),I= 79, 84) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 41),I= 85, 90) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 41),I= 91, 96) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 41),I= 97,102) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 41),I=103,108) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 41),I=109,114) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 41),I=115,120) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ + DATA (CF(I),I=4021,4100) /4096,-1024,-16,128,-160,-16,-1024,128 + $ ,1028,-88,-88,-232,-232,272,-124,56,20,2,-124,20,-106,-88,200 + $ ,20,1028,-124,884,-232,-106,-124,-88,56,2,-16,-142,-124,-160,20 + $ ,-16,128,-160,-16,-1024,128,-124,56,20,2,-124,20,-16,2,128,-16 + $ ,20,2,-142,1136,1010,1028,992,-124,2,-16,20,2,128,-16,-268,-88 + $ ,38,-142,-106,-124,-160,20,1280,-160,200,20/ C 1 T(2,6,7,1,5,3,4) - DATA (CF(I, 42),I= 1, 6) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 42),I= 7, 12) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 42),I= 13, 18) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 42),I= 19, 24) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 42),I= 25, 30) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 42),I= 31, 36) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 42),I= 37, 42) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 42),I= 43, 48) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 42),I= 49, 54) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 42),I= 55, 60) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 42),I= 61, 66) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 42),I= 67, 72) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 42),I= 73, 78) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 42),I= 79, 84) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 42),I= 85, 90) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 42),I= 91, 96) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 42),I= 97,102) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 42),I=103,108) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 42),I=109,114) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 42),I=115,120) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ + DATA (CF(I),I=4101,4179) /4096,-160,-16,-16,128,128,-1024,1010, + $ -268,-268,884,884,-232,-142,-124,2,-16,20,-160,38,-106,20,-160, + $ -124,992,-268,-88,-124,992,56,-448,20,2,-124,56,20,-124,-160, + $ -16,-16,128,128,-1024,-142,-124,2,-16,20,-160,2,20,-16,128,2, + $ -16,38,-142,-268,-88,-124,-106,20,2,2,-16,-16,128,1010,1028, + $ -142,1136,-124,992,20,200,-160,1280,20,-160/ C 1 T(2,6,7,5,1,3,4) - DATA (CF(I, 43),I= 1, 6) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 43),I= 7, 12) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 43),I= 13, 18) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 43),I= 19, 24) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 43),I= 25, 30) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 43),I= 31, 36) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 43),I= 37, 42) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 43),I= 43, 48) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 43),I= 49, 54) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 43),I= 55, 60) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 43),I= 61, 66) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 43),I= 67, 72) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 43),I= 73, 78) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 43),I= 79, 84) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 43),I= 85, 90) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 43),I= 91, 96) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 43),I= 97,102) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 43),I=103,108) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 43),I=109,114) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 43),I=115,120) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ + DATA (CF(I),I=4180,4257) /4096,-1024,-1024,128,128,1280,-124,992 + $ ,-268,-88,-448,56,20,-160,-124,-142,-16,2,884,-232,-268,1010 + $ ,884,-268,992,-124,-160,20,-106,38,-106,-124,884,-232,56,-88, + $ -124,20,56,-124,2,20,-232,272,-88,1028,-232,-88,-124,1028,20 + $ ,200,-88,-106,128,-16,-16,2,2,20,-1024,128,128,-16,-16,-160, + $ -160,20,-16,2,-124,-142,20,-124,2,20,56,-124/ C 1 T(2,7,1,5,6,3,4) - DATA (CF(I, 44),I= 1, 6) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 44),I= 7, 12) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 44),I= 13, 18) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 44),I= 19, 24) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 44),I= 25, 30) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 44),I= 31, 36) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 44),I= 37, 42) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 44),I= 43, 48) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 44),I= 49, 54) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 44),I= 55, 60) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 44),I= 61, 66) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 44),I= 67, 72) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 44),I= 73, 78) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 44),I= 79, 84) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 44),I= 85, 90) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 44),I= 91, 96) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 44),I= 97,102) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 44),I=103,108) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 44),I=109,114) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 44),I=115,120) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ + DATA (CF(I),I=4258,4334) /4096,128,1280,-1024,128,-106,-124,884, + $ -232,56,-88,-124,20,56,-124,2,20,-232,272,-88,1028,-232,-88, + $ -124,1028,20,200,-88,-106,-124,992,-268,-88,-448,56,20,-160, + $ -124,-142,-16,2,884,-232,-268,1010,884,-268,992,-124,-160,20, + $ -106,38,-16,128,2,20,-16,2,128,-1024,-16,-160,128,-16,20,-124,2 + $ ,20,56,-124,-160,20,-16,2,-124,-142/ C 1 T(2,7,1,6,5,3,4) - DATA (CF(I, 45),I= 1, 6) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 45),I= 7, 12) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 45),I= 13, 18) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 45),I= 19, 24) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 45),I= 25, 30) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 45),I= 31, 36) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 45),I= 37, 42) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 45),I= 43, 48) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 45),I= 49, 54) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 45),I= 55, 60) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 45),I= 61, 66) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 45),I= 67, 72) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 45),I= 73, 78) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 45),I= 79, 84) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 45),I= 85, 90) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 45),I= 91, 96) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 45),I= 97,102) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 45),I=103,108) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 45),I=109,114) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 45),I=115,120) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ + DATA (CF(I),I=4335,4410) /4096,-1024,1280,128,-142,1136,1010 + $ ,1028,992,-124,2,-16,20,2,128,-16,-268,-88,38,-142,-106,-124, + $ -160,20,1280,-160,200,20,-88,1028,-232,272,-88,-232,56,-124, + $ -124,20,20,2,884,-232,-106,-124,-88,56,-106,-88,200,20,1028, + $ -124,-16,2,-160,20,-142,-124,128,-16,-1024,128,-160,-16,-16,2 + $ ,128,-16,20,2,-124,56,20,2,-124,20/ C 1 T(2,7,5,1,6,3,4) - DATA (CF(I, 46),I= 1, 6) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 46),I= 7, 12) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 46),I= 13, 18) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 46),I= 19, 24) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 46),I= 25, 30) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 46),I= 31, 36) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 46),I= 37, 42) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 46),I= 43, 48) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 46),I= 49, 54) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 46),I= 55, 60) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 46),I= 61, 66) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 46),I= 67, 72) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 46),I= 73, 78) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 46),I= 79, 84) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 46),I= 85, 90) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 46),I= 91, 96) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 46),I= 97,102) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 46),I=103,108) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 46),I=109,114) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 46),I=115,120) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ + DATA (CF(I),I=4411,4485) /4096,128,-1024,38,-142,-268,-88,-124, + $ -106,20,2,2,-16,-16,128,1010,1028,-142,1136,-124,992,20,200, + $ -160,1280,20,-160,-268,1010,884,-232,-268,884,-124,-142,20,-160 + $ ,2,-16,-268,-88,-124,992,56,-448,38,-106,20,-160,-124,992,2,20 + $ ,20,-124,-124,56,-16,-160,128,-1024,-16,128,2,20,-16,128,2,-16, + $ -142,-124,2,-16,20,-160/ C 1 T(2,7,5,6,1,3,4) - DATA (CF(I, 47),I= 1, 6) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 47),I= 7, 12) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 47),I= 13, 18) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 47),I= 19, 24) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 47),I= 25, 30) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 47),I= 31, 36) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 47),I= 37, 42) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 47),I= 43, 48) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 47),I= 49, 54) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 47),I= 55, 60) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 47),I= 61, 66) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 47),I= 67, 72) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 47),I= 73, 78) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 47),I= 79, 84) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 47),I= 85, 90) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 47),I= 91, 96) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 47),I= 97,102) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 47),I=103,108) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 47),I=109,114) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 47),I=115,120) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ + DATA (CF(I),I=4486,4559) /4096,-1024,-88,1028,-232,272,-88,-232 + $ ,56,-124,-124,20,20,2,884,-232,-106,-124,-88,56,-106,-88,200,20 + $ ,1028,-124,-142,1136,1010,1028,992,-124,2,-16,20,2,128,-16,-268 + $ ,-88,38,-142,-106,-124,-160,20,1280,-160,200,20,2,-16,-142,-124 + $ ,-160,20,-16,128,-160,-16,-1024,128,-124,56,20,2,-124,20,-16,2 + $ ,128,-16,20,2/ C 1 T(2,7,6,1,5,3,4) - DATA (CF(I, 48),I= 1, 6) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 48),I= 7, 12) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 48),I= 13, 18) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 48),I= 19, 24) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 48),I= 25, 30) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 48),I= 31, 36) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 48),I= 37, 42) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 48),I= 43, 48) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 48),I= 49, 54) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 48),I= 55, 60) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 48),I= 61, 66) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 48),I= 67, 72) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 48),I= 73, 78) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 48),I= 79, 84) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 48),I= 85, 90) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 48),I= 91, 96) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 48),I= 97,102) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 48),I=103,108) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 48),I=109,114) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 48),I=115,120) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ + DATA (CF(I),I=4560,4632) /4096,-268,1010,884,-232,-268,884,-124, + $ -142,20,-160,2,-16,-268,-88,-124,992,56,-448,38,-106,20,-160, + $ -124,992,38,-142,-268,-88,-124,-106,20,2,2,-16,-16,128,1010 + $ ,1028,-142,1136,-124,992,20,200,-160,1280,20,-160,20,2,-124,56 + $ ,20,-124,-160,-16,-16,128,128,-1024,-142,-124,2,-16,20,-160,2 + $ ,20,-16,128,2,-16/ C 1 T(2,7,6,5,1,3,4) - DATA (CF(I, 49),I= 1, 6) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 49),I= 7, 12) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 49),I= 13, 18) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 49),I= 19, 24) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 49),I= 25, 30) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 49),I= 31, 36) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 49),I= 37, 42) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 49),I= 43, 48) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 49),I= 49, 54) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 49),I= 55, 60) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 49),I= 61, 66) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 49),I= 67, 72) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 49),I= 73, 78) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 49),I= 79, 84) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 49),I= 85, 90) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 49),I= 91, 96) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 49),I= 97,102) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 49),I=103,108) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 49),I=109,114) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 49),I=115,120) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ + DATA (CF(I),I=4633,4704) /4096,-1024,-1024,128,128,1280,-1024 + $ ,128,128,-16,-16,-160,128,-16,1280,-160,1136,992,-16,-160,-160 + $ ,992,992,-448,992,-124,-160,20,-106,38,-448,56,992,-124,-88, + $ -268,-16,2,-160,20,-142,-124,884,-268,-232,884,1010,-268,-124 + $ ,1028,20,200,-88,-106,56,-88,-124,-106,-232,884,2,20,20,-124, + $ -124,56,-232,-88,272,-232,1028,-88/ C 1 T(5,1,2,6,7,3,4) - DATA (CF(I, 50),I= 1, 6) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 50),I= 7, 12) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 50),I= 13, 18) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 50),I= 19, 24) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 50),I= 25, 30) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 50),I= 31, 36) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 50),I= 37, 42) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 50),I= 43, 48) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 50),I= 49, 54) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 50),I= 55, 60) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 50),I= 61, 66) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 50),I= 67, 72) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 50),I= 73, 78) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 50),I= 79, 84) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 50),I= 85, 90) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 50),I= 91, 96) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 50),I= 97,102) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 50),I=103,108) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 50),I=109,114) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 50),I=115,120) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ + DATA (CF(I),I=4705,4775) /4096,128,1280,-1024,128,128,-1024,-16, + $ -160,128,-16,-16,-160,-160,992,992,-448,128,-16,1280,-160,1136 + $ ,992,-124,1028,20,200,-88,-106,56,-88,-124,-106,-232,884,2,20 + $ ,20,-124,-124,56,-232,-88,272,-232,1028,-88,992,-124,-160,20, + $ -106,38,-448,56,992,-124,-88,-268,-16,2,-160,20,-142,-124,884, + $ -268,-232,884,1010,-268/ C 1 T(5,1,2,7,6,3,4) - DATA (CF(I, 51),I= 1, 6) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 51),I= 7, 12) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 51),I= 13, 18) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 51),I= 19, 24) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 51),I= 25, 30) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 51),I= 31, 36) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 51),I= 37, 42) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 51),I= 43, 48) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 51),I= 49, 54) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 51),I= 55, 60) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 51),I= 61, 66) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 51),I= 67, 72) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 51),I= 73, 78) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 51),I= 79, 84) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 51),I= 85, 90) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 51),I= 91, 96) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 51),I= 97,102) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 51),I=103,108) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 51),I=109,114) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 51),I=115,120) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ + DATA (CF(I),I=4776,4845) /4096,-1024,1280,128,128,-16,1280,-160 + $ ,1136,992,-1024,128,128,-16,-16,-160,-160,-16,992,-448,-160,992 + $ ,-160,20,1280,-160,200,20,992,-124,1136,-142,1028,1010,128,-16, + $ -16,2,2,20,-106,-124,-88,-268,-142,38,-106,-88,200,20,1028,-124 + $ ,-88,-232,1028,-88,272,-232,20,2,-124,56,20,-124,-88,56,-232 + $ ,884,-124,-106/ C 1 T(5,1,6,2,7,3,4) - DATA (CF(I, 52),I= 1, 6) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 52),I= 7, 12) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 52),I= 13, 18) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 52),I= 19, 24) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 52),I= 25, 30) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 52),I= 31, 36) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 52),I= 37, 42) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 52),I= 43, 48) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 52),I= 49, 54) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 52),I= 55, 60) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 52),I= 61, 66) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 52),I= 67, 72) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 52),I= 73, 78) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 52),I= 79, 84) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 52),I= 85, 90) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 52),I= 91, 96) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 52),I= 97,102) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 52),I=103,108) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 52),I=109,114) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 52),I=115,120) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ + DATA (CF(I),I=4846,4914) /4096,128,-1024,-16,-160,-160,992,992, + $ -448,128,-1024,-16,-160,128,-16,-16,128,1136,992,1280,-160,20 + $ ,200,-160,1280,20,-160,-124,-106,-142,38,-88,-268,-16,128,2,20, + $ -16,2,-124,992,1028,1010,1136,-142,38,-106,20,-160,-124,992, + $ -268,884,1010,-268,-232,884,2,-16,-142,-124,-160,20,56,-448,-88 + $ ,-268,992,-124/ C 1 T(5,1,6,7,2,3,4) - DATA (CF(I, 53),I= 1, 6) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 53),I= 7, 12) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 53),I= 13, 18) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 53),I= 19, 24) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 53),I= 25, 30) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 53),I= 31, 36) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 53),I= 37, 42) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 53),I= 43, 48) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 53),I= 49, 54) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 53),I= 55, 60) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 53),I= 61, 66) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 53),I= 67, 72) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 53),I= 73, 78) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 53),I= 79, 84) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 53),I= 85, 90) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 53),I= 91, 96) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 53),I= 97,102) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 53),I=103,108) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 53),I=109,114) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 53),I=115,120) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ + DATA (CF(I),I=4915,4982) /4096,-1024,-16,128,1136,992,1280,-160, + $ -160,-16,992,-448,-160,992,-1024,128,128,-16,-16,-160,-106,-88 + $ ,200,20,1028,-124,-88,-232,1028,-88,272,-232,20,2,-124,56,20, + $ -124,-88,56,-232,884,-124,-106,-160,20,1280,-160,200,20,992, + $ -124,1136,-142,1028,1010,128,-16,-16,2,2,20,-106,-124,-88,-268, + $ -142,38/ C 1 T(5,1,7,2,6,3,4) - DATA (CF(I, 54),I= 1, 6) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 54),I= 7, 12) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 54),I= 13, 18) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 54),I= 19, 24) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 54),I= 25, 30) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 54),I= 31, 36) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 54),I= 37, 42) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 54),I= 43, 48) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 54),I= 49, 54) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 54),I= 55, 60) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 54),I= 61, 66) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 54),I= 67, 72) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 54),I= 73, 78) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 54),I= 79, 84) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 54),I= 85, 90) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 54),I= 91, 96) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 54),I= 97,102) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 54),I=103,108) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 54),I=109,114) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 54),I=115,120) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ + DATA (CF(I),I=4983,5049) /4096,-160,-16,992,-448,-160,992,-16 + $ ,128,1136,992,1280,-160,128,-1024,-16,-160,128,-16,38,-106,20, + $ -160,-124,992,-268,884,1010,-268,-232,884,2,-16,-142,-124,-160 + $ ,20,56,-448,-88,-268,992,-124,20,200,-160,1280,20,-160,-124, + $ -106,-142,38,-88,-268,-16,128,2,20,-16,2,-124,992,1028,1010 + $ ,1136,-142/ C 1 T(5,1,7,6,2,3,4) - DATA (CF(I, 55),I= 1, 6) /1.975308641975309D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 55),I= 7, 12) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 55),I= 13, 18) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 55),I= 19, 24) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 55),I= 25, 30) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 55),I= 31, 36) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 55),I= 37, 42) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 55),I= 43, 48) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 55),I= 49, 54) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 55),I= 55, 60) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 55),I= 61, 66) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 55),I= 67, 72) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 55),I= 73, 78) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 55),I= 79, 84) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 55),I= 85, 90) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 55),I= 91, 96) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I, 55),I= 97,102) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 55),I=103,108) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 55),I=109,114) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 55),I=115,120) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ + DATA (CF(I),I=5050,5115) /4096,-1024,-1024,128,128,1280,1280, + $ -160,128,-16,992,1136,-160,992,-16,-160,-448,992,-448,56,992, + $ -124,-88,-268,992,-124,-160,20,-106,38,-160,20,-16,2,-124,-142, + $ -232,884,884,-268,-268,1010,56,-88,-124,-106,-232,884,-124,1028 + $ ,20,200,-88,-106,20,-124,2,20,56,-124,272,-232,-232,-88,-88 + $ ,1028/ C 1 T(5,2,1,6,7,3,4) - DATA (CF(I, 56),I= 1, 6) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-2.469135802469136D-01,3.086419753086420D-02/ - DATA (CF(I, 56),I= 7, 12) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 56),I= 13, 18) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 56),I= 19, 24) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 56),I= 25, 30) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 56),I= 31, 36) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 56),I= 37, 42) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 56),I= 43, 48) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 56),I= 49, 54) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 56),I= 55, 60) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 56),I= 61, 66) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 56),I= 67, 72) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 56),I= 73, 78) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 56),I= 79, 84) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 56),I= 85, 90) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 56),I= 91, 96) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 56),I= 97,102) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 56),I=103,108) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 56),I=109,114) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 56),I=115,120) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ + DATA (CF(I),I=5116,5180) /4096,128,1280,-1024,128,-160,992,-16, + $ -160,-448,992,1280,-160,128,-16,992,1136,56,-88,-124,-106,-232 + $ ,884,-124,1028,20,200,-88,-106,20,-124,2,20,56,-124,272,-232, + $ -232,-88,-88,1028,-448,56,992,-124,-88,-268,992,-124,-160,20, + $ -106,38,-160,20,-16,2,-124,-142,-232,884,884,-268,-268,1010/ C 1 T(5,2,1,7,6,3,4) - DATA (CF(I, 57),I= 1, 6) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -1.635802469135803D-01/ - DATA (CF(I, 57),I= 7, 12) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 57),I= 13, 18) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 57),I= 19, 24) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 57),I= 25, 30) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 57),I= 31, 36) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 57),I= 37, 42) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 57),I= 43, 48) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 57),I= 49, 54) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 57),I= 55, 60) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 57),I= 61, 66) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 57),I= 67, 72) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 57),I= 73, 78) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 57),I= 79, 84) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 57),I= 85, 90) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 57),I= 91, 96) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I, 57),I= 97,102) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 57),I=103,108) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 57),I=109,114) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 57),I=115,120) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ + DATA (CF(I),I=5181,5244) /4096,-1024,1280,128,128,-16,-1024,128, + $ -160,-16,992,-448,-160,-16,992,-160,992,-124,1136,-142,1028 + $ ,1010,-160,20,1280,-160,200,20,-16,2,128,-16,20,2,-88,-268,-106 + $ ,-124,38,-142,-88,-232,1028,-88,272,-232,-106,-88,200,20,1028, + $ -124,-124,56,20,2,-124,20,-232,884,-88,56,-106,-124/ C 1 T(5,2,6,1,7,3,4) - DATA (CF(I, 58),I= 1, 6) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00,-1.635802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 58),I= 7, 12) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 58),I= 13, 18) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 58),I= 19, 24) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 58),I= 25, 30) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 58),I= 31, 36) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 58),I= 37, 42) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 58),I= 43, 48) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 58),I= 49, 54) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 58),I= 55, 60) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 58),I= 61, 66) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 58),I= 67, 72) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 58),I= 73, 78) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 58),I= 79, 84) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 58),I= 85, 90) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 58),I= 91, 96) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I, 58),I= 97,102) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 58),I=103,108) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 58),I=109,114) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 58),I=115,120) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ + DATA (CF(I),I=5245,5307) /4096,128,-1024,-16,-160,128,-1024,-16 + $ ,128,1136,992,-16,128,-160,1280,-124,-106,-142,38,-88,-268,20 + $ ,200,-160,1280,20,-160,2,20,-16,128,2,-16,1028,1010,-124,992, + $ -142,1136,-268,884,1010,-268,-232,884,38,-106,20,-160,-124,992, + $ -142,-124,2,-16,20,-160,-88,-268,56,-448,-124,992/ C 1 T(5,2,6,7,1,3,4) - DATA (CF(I, 59),I= 1, 6) /3.086419753086420D-02, - $ -2.469135802469136D-01,5.864197530864197D-02, - $ -1.635802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 59),I= 7, 12) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 59),I= 13, 18) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 59),I= 19, 24) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 59),I= 25, 30) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 59),I= 31, 36) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 59),I= 37, 42) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 59),I= 43, 48) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 59),I= 49, 54) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 59),I= 55, 60) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 59),I= 61, 66) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 59),I= 67, 72) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 59),I= 73, 78) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 59),I= 79, 84) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 59),I= 85, 90) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 59),I= 91, 96) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 59),I= 97,102) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 59),I=103,108) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 59),I=109,114) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 59),I=115,120) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ + DATA (CF(I),I=5308,5369) /4096,-1024,992,-448,-160,-16,992,-160 + $ ,128,-16,-1024,128,-160,-16,-88,-232,1028,-88,272,-232,-106,-88 + $ ,200,20,1028,-124,-124,56,20,2,-124,20,-232,884,-88,56,-106, + $ -124,992,-124,1136,-142,1028,1010,-160,20,1280,-160,200,20,-16 + $ ,2,128,-16,20,2,-88,-268,-106,-124,38,-142/ C 1 T(5,2,7,1,6,3,4) - DATA (CF(I, 60),I= 1, 6) /3.086419753086420D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 60),I= 7, 12) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 60),I= 13, 18) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 60),I= 19, 24) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 60),I= 25, 30) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 60),I= 31, 36) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 60),I= 37, 42) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 60),I= 43, 48) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 60),I= 49, 54) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 60),I= 55, 60) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 60),I= 61, 66) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 60),I= 67, 72) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 60),I= 73, 78) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 60),I= 79, 84) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 60),I= 85, 90) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 60),I= 91, 96) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 60),I= 97,102) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 60),I=103,108) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 60),I=109,114) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 60),I=115,120) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ + DATA (CF(I),I=5370,5430) /4096,1136,992,-16,128,-160,1280,-16, + $ -160,128,-1024,-16,128,-268,884,1010,-268,-232,884,38,-106,20, + $ -160,-124,992,-142,-124,2,-16,20,-160,-88,-268,56,-448,-124,992 + $ ,-124,-106,-142,38,-88,-268,20,200,-160,1280,20,-160,2,20,-16 + $ ,128,2,-16,1028,1010,-124,992,-142,1136/ C 1 T(5,2,7,6,1,3,4) - DATA (CF(I, 61),I= 1, 6) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 61),I= 7, 12) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 61),I= 13, 18) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 61),I= 19, 24) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 61),I= 25, 30) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 61),I= 31, 36) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 61),I= 37, 42) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 61),I= 43, 48) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 61),I= 49, 54) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 61),I= 55, 60) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 61),I= 61, 66) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 61),I= 67, 72) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 61),I= 73, 78) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 61),I= 79, 84) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 61),I= 85, 90) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 61),I= 91, 96) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 61),I= 97,102) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 61),I=103,108) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 61),I=109,114) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 61),I=115,120) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ + DATA (CF(I),I=5431,5490) /4096,-1024,-1024,128,128,1280,992,-160 + $ ,-448,992,-16,-160,-16,2,128,-16,20,2,-160,20,-16,2,-124,-142, + $ -1024,128,128,-16,-16,-160,-124,20,56,-124,2,20,884,-232,-106, + $ -124,-88,56,-232,272,-88,1028,-232,-88,-124,20,56,-124,2,20 + $ ,1028,-124,-88,-106,20,200/ C 1 T(5,6,1,2,7,3,4) - DATA (CF(I, 62),I= 1, 6) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 62),I= 7, 12) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 62),I= 13, 18) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 62),I= 19, 24) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 62),I= 25, 30) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 62),I= 31, 36) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 62),I= 37, 42) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 62),I= 43, 48) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 62),I= 49, 54) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 62),I= 55, 60) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 62),I= 61, 66) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 62),I= 67, 72) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 62),I= 73, 78) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 62),I= 79, 84) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 62),I= 85, 90) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 62),I= 91, 96) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 62),I= 97,102) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 62),I=103,108) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 62),I=109,114) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 62),I=115,120) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ + DATA (CF(I),I=5491,5549) /4096,128,1280,-1024,128,-160,1280,992 + $ ,1136,128,-16,2,20,-16,128,2,-16,20,-124,2,20,56,-124,128,-1024 + $ ,-16,-160,128,-16,20,-160,-124,-142,-16,2,-268,-88,-124,992,56, + $ -448,884,-232,-268,1010,884,-268,20,-160,-124,-142,-16,2,-124 + $ ,992,-106,38,-160,20/ C 1 T(5,6,1,7,2,3,4) - DATA (CF(I, 63),I= 1, 6) /1.530864197530864D+00, - $ -1.913580246913580D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 63),I= 7, 12) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 63),I= 13, 18) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 63),I= 19, 24) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 63),I= 25, 30) /1.753086419753086D+00, - $ -2.191358024691358D-01,1.530864197530864D+00, - $ -1.913580246913580D-01,1.558641975308642D+00,1.586419753086420D - $ +00/ - DATA (CF(I, 63),I= 31, 36) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 63),I= 37, 42) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 63),I= 43, 48) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 63),I= 49, 54) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 63),I= 55, 60) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 63),I= 61, 66) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 63),I= 67, 72) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 63),I= 73, 78) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 63),I= 79, 84) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 63),I= 85, 90) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 63),I= 91, 96) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 63),I= 97,102) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 63),I=103,108) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 63),I=109,114) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 63),I=115,120) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ + DATA (CF(I),I=5550,5607) /4096,-1024,1280,128,-448,992,992,-160, + $ -160,-16,-160,20,-16,2,-124,-142,-16,2,128,-16,20,2,128,-16, + $ -1024,128,-160,-16,56,-124,-124,20,20,2,-232,272,-88,1028,-232, + $ -88,884,-232,-106,-124,-88,56,56,-124,-124,20,20,2,-88,-106 + $ ,1028,-124,200,20/ C 1 T(5,6,2,1,7,3,4) - DATA (CF(I, 64),I= 1, 6) /-1.913580246913580D-01, - $ -1.635802469135803D-01,8.641975308641975D-02, - $ -1.358024691358025D-01,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 64),I= 7, 12) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 64),I= 13, 18) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 64),I= 19, 24) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 64),I= 25, 30) /-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01, - $ -1.635802469135803D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 64),I= 31, 36) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 64),I= 37, 42) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 64),I= 43, 48) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 64),I= 49, 54) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 64),I= 55, 60) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 64),I= 61, 66) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 64),I= 67, 72) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 64),I= 73, 78) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 64),I= 79, 84) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 64),I= 85, 90) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 64),I= 91, 96) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 64),I= 97,102) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 64),I=103,108) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 64),I=109,114) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 64),I=115,120) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ + DATA (CF(I),I=5608,5664) /4096,128,-1024,992,1136,-160,1280,-16 + $ ,128,20,-124,2,20,56,-124,2,20,-16,128,2,-16,-16,-160,128,-1024 + $ ,-16,128,-124,-142,20,-160,2,-16,884,-232,-268,1010,884,-268, + $ -268,-88,-124,992,56,-448,-124,-142,20,-160,2,-16,-106,38,-124 + $ ,992,20,-160/ C 1 T(5,6,2,7,1,3,4) - DATA (CF(I, 65),I= 1, 6) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 65),I= 7, 12) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 65),I= 13, 18) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 65),I= 19, 24) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 65),I= 25, 30) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 65),I= 31, 36) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 65),I= 37, 42) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 65),I= 43, 48) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 65),I= 49, 54) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 65),I= 55, 60) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 65),I= 61, 66) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 65),I= 67, 72) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 65),I= 73, 78) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 65),I= 79, 84) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 65),I= 85, 90) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 65),I= 91, 96) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 65),I= 97,102) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 65),I=103,108) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 65),I=109,114) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 65),I=115,120) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ + DATA (CF(I),I=5665,5720) /4096,-1024,-16,128,-160,-16,-1024,128, + $ -142,-124,2,-16,20,-160,-124,56,20,2,-124,20,-16,128,-160,-16, + $ -1024,128,2,-16,20,2,128,-16,1010,1028,-142,1136,-124,992,-268, + $ -88,38,-142,-106,-124,2,-16,20,2,128,-16,20,-160,200,20,1280, + $ -160/ C 1 T(5,6,7,1,2,3,4) - DATA (CF(I, 66),I= 1, 6) /1.586419753086420D+00, - $ -1.358024691358025D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01 - $ ,4.197530864197531D-01/ - DATA (CF(I, 66),I= 7, 12) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 66),I= 13, 18) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 66),I= 19, 24) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 66),I= 25, 30) /1.558641975308642D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -3.580246913580247D-01/ - DATA (CF(I, 66),I= 31, 36) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 66),I= 37, 42) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 66),I= 43, 48) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 66),I= 49, 54) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 66),I= 55, 60) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 66),I= 61, 66) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 66),I= 67, 72) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 66),I= 73, 78) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 66),I= 79, 84) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 66),I= 85, 90) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 66),I= 91, 96) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 66),I= 97,102) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 66),I=103,108) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 66),I=109,114) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 66),I=115,120) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ + DATA (CF(I),I=5721,5775) /4096,-160,-16,-16,128,128,-1024,-124 + $ ,56,20,2,-124,20,-142,-124,2,-16,20,-160,-160,-16,-16,128,128, + $ -1024,20,2,2,-16,-16,128,-268,-88,38,-142,-106,-124,1010,1028, + $ -142,1136,-124,992,20,2,2,-16,-16,128,200,20,20,-160,-160,1280/ C 1 T(5,6,7,2,1,3,4) - DATA (CF(I, 67),I= 1, 6) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 67),I= 7, 12) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 67),I= 13, 18) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 67),I= 19, 24) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 67),I= 25, 30) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 67),I= 31, 36) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 67),I= 37, 42) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 67),I= 43, 48) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 67),I= 49, 54) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 67),I= 55, 60) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 67),I= 61, 66) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 67),I= 67, 72) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 67),I= 73, 78) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 67),I= 79, 84) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 67),I= 85, 90) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 67),I= 91, 96) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 67),I= 97,102) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 67),I=103,108) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 67),I=109,114) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 67),I=115,120) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ + DATA (CF(I),I=5776,5829) /4096,-1024,-1024,128,128,1280,884,-232 + $ ,-106,-124,-88,56,-232,272,-88,1028,-232,-88,-124,20,56,-124,2 + $ ,20,1028,-124,-88,-106,20,200,-16,2,128,-16,20,2,-160,20,-16,2, + $ -124,-142,-1024,128,128,-16,-16,-160,-124,20,56,-124,2,20/ C 1 T(5,7,1,2,6,3,4) - DATA (CF(I, 68),I= 1, 6) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 68),I= 7, 12) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 68),I= 13, 18) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 68),I= 19, 24) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 68),I= 25, 30) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 68),I= 31, 36) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 68),I= 37, 42) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 68),I= 43, 48) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 68),I= 49, 54) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 68),I= 55, 60) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 68),I= 61, 66) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 68),I= 67, 72) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 68),I= 73, 78) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 68),I= 79, 84) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 68),I= 85, 90) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 68),I= 91, 96) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 68),I= 97,102) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 68),I=103,108) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 68),I=109,114) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 68),I=115,120) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ + DATA (CF(I),I=5830,5882) /4096,128,1280,-1024,128,-268,-88,-124 + $ ,992,56,-448,884,-232,-268,1010,884,-268,20,-160,-124,-142,-16 + $ ,2,-124,992,-106,38,-160,20,2,20,-16,128,2,-16,20,-124,2,20,56, + $ -124,128,-1024,-16,-160,128,-16,20,-160,-124,-142,-16,2/ C 1 T(5,7,1,6,2,3,4) - DATA (CF(I, 69),I= 1, 6) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-4.135802469135803D-01, - $ -1.358024691358025D-01,-6.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 69),I= 7, 12) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 69),I= 13, 18) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 69),I= 19, 24) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 69),I= 25, 30) /-2.191358024691358D-01 - $ ,1.753086419753086D+00,1.558641975308642D+00,1.586419753086420D - $ +00,1.530864197530864D+00,-1.913580246913580D-01/ - DATA (CF(I, 69),I= 31, 36) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 69),I= 37, 42) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 69),I= 43, 48) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 69),I= 49, 54) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 69),I= 55, 60) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 69),I= 61, 66) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 69),I= 67, 72) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 69),I= 73, 78) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 69),I= 79, 84) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 69),I= 85, 90) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 69),I= 91, 96) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 69),I= 97,102) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 69),I=103,108) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 69),I=109,114) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 69),I=115,120) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ + DATA (CF(I),I=5883,5934) /4096,-1024,1280,128,-232,272,-88,1028, + $ -232,-88,884,-232,-106,-124,-88,56,56,-124,-124,20,20,2,-88, + $ -106,1028,-124,200,20,-160,20,-16,2,-124,-142,-16,2,128,-16,20 + $ ,2,128,-16,-1024,128,-160,-16,56,-124,-124,20,20,2/ C 1 T(5,7,2,1,6,3,4) - DATA (CF(I, 70),I= 1, 6) /-1.635802469135803D-01, - $ -1.913580246913580D-01,1.364197530864198D+00, - $ -3.580246913580247D-01,8.641975308641975D-02, - $ -1.358024691358025D-01/ - DATA (CF(I, 70),I= 7, 12) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 70),I= 13, 18) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 70),I= 19, 24) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 70),I= 25, 30) /5.864197530864197D-02, - $ -2.191358024691358D-01,-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 70),I= 31, 36) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 70),I= 37, 42) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 70),I= 43, 48) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 70),I= 49, 54) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 70),I= 55, 60) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 70),I= 61, 66) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 70),I= 67, 72) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 70),I= 73, 78) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 70),I= 79, 84) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 70),I= 85, 90) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 70),I= 91, 96) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 70),I= 97,102) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 70),I=103,108) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 70),I=109,114) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 70),I=115,120) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ + DATA (CF(I),I=5935,5985) /4096,128,-1024,884,-232,-268,1010,884, + $ -268,-268,-88,-124,992,56,-448,-124,-142,20,-160,2,-16,-106,38, + $ -124,992,20,-160,20,-124,2,20,56,-124,2,20,-16,128,2,-16,-16, + $ -160,128,-1024,-16,128,-124,-142,20,-160,2,-16/ C 1 T(5,7,2,6,1,3,4) - DATA (CF(I, 71),I= 1, 6) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 71),I= 7, 12) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 71),I= 13, 18) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 71),I= 19, 24) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 71),I= 25, 30) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 71),I= 31, 36) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 71),I= 37, 42) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 71),I= 43, 48) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 71),I= 49, 54) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 71),I= 55, 60) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 71),I= 61, 66) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 71),I= 67, 72) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 71),I= 73, 78) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 71),I= 79, 84) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 71),I= 85, 90) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 71),I= 91, 96) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 71),I= 97,102) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 71),I=103,108) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 71),I=109,114) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 71),I=115,120) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ + DATA (CF(I),I=5986,6035) /4096,-1024,1010,1028,-142,1136,-124 + $ ,992,-268,-88,38,-142,-106,-124,2,-16,20,2,128,-16,20,-160,200 + $ ,20,1280,-160,-142,-124,2,-16,20,-160,-124,56,20,2,-124,20,-16 + $ ,128,-160,-16,-1024,128,2,-16,20,2,128,-16/ C 1 T(5,7,6,1,2,3,4) - DATA (CF(I, 72),I= 1, 6) /-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 72),I= 7, 12) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 72),I= 13, 18) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 72),I= 19, 24) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 72),I= 25, 30) /-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 72),I= 31, 36) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 72),I= 37, 42) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 72),I= 43, 48) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 72),I= 49, 54) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 72),I= 55, 60) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 72),I= 61, 66) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 72),I= 67, 72) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 72),I= 73, 78) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 72),I= 79, 84) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 72),I= 85, 90) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 72),I= 91, 96) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 72),I= 97,102) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 72),I=103,108) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 72),I=109,114) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 72),I=115,120) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ + DATA (CF(I),I=6036,6084) /4096,-268,-88,38,-142,-106,-124,1010 + $ ,1028,-142,1136,-124,992,20,2,2,-16,-16,128,200,20,20,-160,-160 + $ ,1280,-124,56,20,2,-124,20,-142,-124,2,-16,20,-160,-160,-16,-16 + $ ,128,128,-1024,20,2,2,-16,-16,128/ C 1 T(5,7,6,2,1,3,4) - DATA (CF(I, 73),I= 1, 6) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 73),I= 7, 12) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 73),I= 13, 18) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 73),I= 19, 24) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 73),I= 25, 30) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 73),I= 31, 36) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 73),I= 37, 42) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 73),I= 43, 48) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 73),I= 49, 54) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 73),I= 55, 60) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 73),I= 61, 66) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 73),I= 67, 72) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 73),I= 73, 78) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 73),I= 79, 84) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 73),I= 85, 90) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 73),I= 91, 96) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 73),I= 97,102) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 73),I=103,108) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 73),I=109,114) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 73),I=115,120) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ + DATA (CF(I),I=6085,6132) /4096,-1024,-1024,128,128,1280,-1024 + $ ,128,128,-16,-16,-160,128,-16,1280,-160,1136,992,-16,-160,-160 + $ ,992,992,-448,1028,-124,-88,-106,20,200,-88,56,-232,884,-124, + $ -106,-232,-88,272,-232,1028,-88,2,20,20,-124,-124,56/ C 1 T(6,1,2,5,7,3,4) - DATA (CF(I, 74),I= 1, 6) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 74),I= 7, 12) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 74),I= 13, 18) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 74),I= 19, 24) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 74),I= 25, 30) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 74),I= 31, 36) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 74),I= 37, 42) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 74),I= 43, 48) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 74),I= 49, 54) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 74),I= 55, 60) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 74),I= 61, 66) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 74),I= 67, 72) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 74),I= 73, 78) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 74),I= 79, 84) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 74),I= 85, 90) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 74),I= 91, 96) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 74),I= 97,102) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 74),I=103,108) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 74),I=109,114) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 74),I=115,120) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ + DATA (CF(I),I=6133,6179) /4096,128,1280,-1024,128,128,-1024,-16, + $ -160,128,-16,-16,-160,-160,992,992,-448,128,-16,1280,-160,1136 + $ ,992,-124,992,-106,38,-160,20,56,-448,-88,-268,992,-124,884, + $ -268,-232,884,1010,-268,-16,2,-160,20,-142,-124/ C 1 T(6,1,2,7,5,3,4) - DATA (CF(I, 75),I= 1, 6) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 75),I= 7, 12) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 75),I= 13, 18) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 75),I= 19, 24) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 75),I= 25, 30) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 75),I= 31, 36) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 75),I= 37, 42) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 75),I= 43, 48) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 75),I= 49, 54) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 75),I= 55, 60) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 75),I= 61, 66) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 75),I= 67, 72) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 75),I= 73, 78) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 75),I= 79, 84) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 75),I= 85, 90) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 75),I= 91, 96) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 75),I= 97,102) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 75),I=103,108) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 75),I=109,114) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 75),I=115,120) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ + DATA (CF(I),I=6180,6225) /4096,-1024,1280,128,128,-16,1280,-160 + $ ,1136,992,-1024,128,128,-16,-16,-160,-160,-16,992,-448,-160,992 + $ ,-88,-106,1028,-124,200,20,-232,-88,272,-232,1028,-88,-88,56, + $ -232,884,-124,-106,20,2,-124,56,20,-124/ C 1 T(6,1,5,2,7,3,4) - DATA (CF(I, 76),I= 1, 6) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 76),I= 7, 12) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 76),I= 13, 18) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 76),I= 19, 24) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 76),I= 25, 30) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 76),I= 31, 36) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 76),I= 37, 42) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 76),I= 43, 48) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 76),I= 49, 54) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 76),I= 55, 60) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 76),I= 61, 66) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 76),I= 67, 72) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 76),I= 73, 78) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 76),I= 79, 84) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 76),I= 85, 90) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 76),I= 91, 96) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 76),I= 97,102) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 76),I=103,108) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 76),I=109,114) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 76),I=115,120) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ + DATA (CF(I),I=6226,6270) /4096,128,-1024,-16,-160,-160,992,992, + $ -448,128,-1024,-16,-160,128,-16,-16,128,1136,992,1280,-160,-106 + $ ,38,-124,992,20,-160,884,-268,-232,884,1010,-268,56,-448,-88, + $ -268,992,-124,2,-16,-142,-124,-160,20/ C 1 T(6,1,5,7,2,3,4) - DATA (CF(I, 77),I= 1, 6) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 77),I= 7, 12) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 77),I= 13, 18) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 77),I= 19, 24) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 77),I= 25, 30) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 77),I= 31, 36) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 77),I= 37, 42) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 77),I= 43, 48) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 77),I= 49, 54) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 77),I= 55, 60) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 77),I= 61, 66) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 77),I= 67, 72) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 77),I= 73, 78) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 77),I= 79, 84) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 77),I= 85, 90) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 77),I= 91, 96) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 77),I= 97,102) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 77),I=103,108) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 77),I=109,114) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 77),I=115,120) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ + DATA (CF(I),I=6271,6314) /4096,-1024,-16,128,1136,992,1280,-160, + $ -160,-16,992,-448,-160,992,-1024,128,128,-16,-16,-160,20,-160 + $ ,200,20,1280,-160,-124,992,1028,1010,1136,-142,-106,-124,-88, + $ -268,-142,38,128,-16,-16,2,2,20/ C 1 T(6,1,7,2,5,3,4) - DATA (CF(I, 78),I= 1, 6) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 78),I= 7, 12) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 78),I= 13, 18) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 78),I= 19, 24) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 78),I= 25, 30) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 78),I= 31, 36) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 78),I= 37, 42) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 78),I= 43, 48) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 78),I= 49, 54) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 78),I= 55, 60) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 78),I= 61, 66) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 78),I= 67, 72) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 78),I= 73, 78) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 78),I= 79, 84) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 78),I= 85, 90) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 78),I= 91, 96) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 78),I= 97,102) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 78),I=103,108) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 78),I=109,114) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 78),I=115,120) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ + DATA (CF(I),I=6315,6357) /4096,-160,-16,992,-448,-160,992,-16 + $ ,128,1136,992,1280,-160,128,-1024,-16,-160,128,-16,200,20,20, + $ -160,-160,1280,-106,-124,-88,-268,-142,38,-124,992,1028,1010 + $ ,1136,-142,-16,128,2,20,-16,2/ C 1 T(6,1,7,5,2,3,4) - DATA (CF(I, 79),I= 1, 6) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 79),I= 7, 12) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 79),I= 13, 18) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 79),I= 19, 24) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 79),I= 25, 30) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 79),I= 31, 36) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 79),I= 37, 42) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 79),I= 43, 48) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 79),I= 49, 54) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 79),I= 55, 60) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 79),I= 61, 66) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 79),I= 67, 72) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I, 79),I= 73, 78) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 79),I= 79, 84) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 79),I= 85, 90) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 79),I= 91, 96) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 79),I= 97,102) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 79),I=103,108) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 79),I=109,114) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 79),I=115,120) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ + DATA (CF(I),I=6358,6399) /4096,-1024,-1024,128,128,1280,1280, + $ -160,128,-16,992,1136,-160,992,-16,-160,-448,992,-88,56,-232 + $ ,884,-124,-106,1028,-124,-88,-106,20,200,272,-232,-232,-88,-88 + $ ,1028,20,-124,2,20,56,-124/ C 1 T(6,2,1,5,7,3,4) - DATA (CF(I, 80),I= 1, 6) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 80),I= 7, 12) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 80),I= 13, 18) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 80),I= 19, 24) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 80),I= 25, 30) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 80),I= 31, 36) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 80),I= 37, 42) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 80),I= 43, 48) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 80),I= 49, 54) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 80),I= 55, 60) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 80),I= 61, 66) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 80),I= 67, 72) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 80),I= 73, 78) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 80),I= 79, 84) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 80),I= 85, 90) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 80),I= 91, 96) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 80),I= 97,102) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 80),I=103,108) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 80),I=109,114) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I, 80),I=115,120) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ + DATA (CF(I),I=6400,6440) /4096,128,1280,-1024,128,-160,992,-16, + $ -160,-448,992,1280,-160,128,-16,992,1136,56,-448,-88,-268,992, + $ -124,-124,992,-106,38,-160,20,-232,884,884,-268,-268,1010,-160 + $ ,20,-16,2,-124,-142/ C 1 T(6,2,1,7,5,3,4) - DATA (CF(I, 81),I= 1, 6) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 81),I= 7, 12) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 81),I= 13, 18) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 81),I= 19, 24) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 81),I= 25, 30) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 81),I= 31, 36) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 81),I= 37, 42) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 81),I= 43, 48) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 81),I= 49, 54) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 81),I= 55, 60) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 81),I= 61, 66) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 81),I= 67, 72) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I, 81),I= 73, 78) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 81),I= 79, 84) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 81),I= 85, 90) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 81),I= 91, 96) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 81),I= 97,102) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 81),I=103,108) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 81),I=109,114) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 81),I=115,120) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ + DATA (CF(I),I=6441,6480) /4096,-1024,1280,128,128,-16,-1024,128, + $ -160,-16,992,-448,-160,-16,992,-160,-232,-88,272,-232,1028,-88, + $ -88,-106,1028,-124,200,20,-232,884,-88,56,-106,-124,-124,56,20 + $ ,2,-124,20/ C 1 T(6,2,5,1,7,3,4) - DATA (CF(I, 82),I= 1, 6) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 82),I= 7, 12) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 82),I= 13, 18) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 82),I= 19, 24) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 82),I= 25, 30) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 82),I= 31, 36) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 82),I= 37, 42) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 82),I= 43, 48) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 82),I= 49, 54) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 82),I= 55, 60) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 82),I= 61, 66) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 82),I= 67, 72) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I, 82),I= 73, 78) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 82),I= 79, 84) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 82),I= 85, 90) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 82),I= 91, 96) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 82),I= 97,102) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 82),I=103,108) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 82),I=109,114) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 82),I=115,120) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ + DATA (CF(I),I=6481,6519) /4096,128,-1024,-16,-160,128,-1024,-16 + $ ,128,1136,992,-16,128,-160,1280,884,-268,-232,884,1010,-268, + $ -106,38,-124,992,20,-160,-88,-268,56,-448,-124,992,-142,-124,2, + $ -16,20,-160/ C 1 T(6,2,5,7,1,3,4) - DATA (CF(I, 83),I= 1, 6) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 83),I= 7, 12) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 83),I= 13, 18) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 83),I= 19, 24) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 83),I= 25, 30) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 83),I= 31, 36) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 83),I= 37, 42) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 83),I= 43, 48) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 83),I= 49, 54) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 83),I= 55, 60) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 83),I= 61, 66) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 83),I= 67, 72) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 83),I= 73, 78) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 83),I= 79, 84) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 83),I= 85, 90) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 83),I= 91, 96) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 83),I= 97,102) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 83),I=103,108) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 83),I=109,114) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I, 83),I=115,120) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ + DATA (CF(I),I=6520,6557) /4096,-1024,992,-448,-160,-16,992,-160 + $ ,128,-16,-1024,128,-160,-16,-124,992,1028,1010,1136,-142,20, + $ -160,200,20,1280,-160,-88,-268,-106,-124,38,-142,-16,2,128,-16 + $ ,20,2/ C 1 T(6,2,7,1,5,3,4) - DATA (CF(I, 84),I= 1, 6) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 84),I= 7, 12) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 84),I= 13, 18) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 84),I= 19, 24) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 84),I= 25, 30) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 84),I= 31, 36) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 84),I= 37, 42) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 84),I= 43, 48) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 84),I= 49, 54) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 84),I= 55, 60) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 84),I= 61, 66) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 84),I= 67, 72) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 84),I= 73, 78) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 84),I= 79, 84) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 84),I= 85, 90) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 84),I= 91, 96) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 84),I= 97,102) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 84),I=103,108) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 84),I=109,114) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I, 84),I=115,120) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ + DATA (CF(I),I=6558,6594) /4096,1136,992,-16,128,-160,1280,-16, + $ -160,128,-1024,-16,128,-106,-124,-88,-268,-142,38,200,20,20, + $ -160,-160,1280,1028,1010,-124,992,-142,1136,2,20,-16,128,2,-16/ C 1 T(6,2,7,5,1,3,4) - DATA (CF(I, 85),I= 1, 6) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 85),I= 7, 12) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 85),I= 13, 18) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 85),I= 19, 24) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I, 85),I= 25, 30) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 85),I= 31, 36) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 85),I= 37, 42) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 85),I= 43, 48) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I, 85),I= 49, 54) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 85),I= 55, 60) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 85),I= 61, 66) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 85),I= 67, 72) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 85),I= 73, 78) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 85),I= 79, 84) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 85),I= 85, 90) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 85),I= 91, 96) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 85),I= 97,102) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 85),I=103,108) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 85),I=109,114) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 85),I=115,120) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ + DATA (CF(I),I=6595,6630) /4096,-1024,-1024,128,128,1280,992,-160 + $ ,-448,992,-16,-160,-232,884,-88,56,-106,-124,272,-232,-232,-88, + $ -88,1028,1028,-124,-88,-106,20,200,-124,20,56,-124,2,20/ C 1 T(6,5,1,2,7,3,4) - DATA (CF(I, 86),I= 1, 6) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 86),I= 7, 12) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 86),I= 13, 18) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 86),I= 19, 24) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I, 86),I= 25, 30) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 86),I= 31, 36) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 86),I= 37, 42) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 86),I= 43, 48) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 86),I= 49, 54) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 86),I= 55, 60) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 86),I= 61, 66) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 86),I= 67, 72) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 86),I= 73, 78) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 86),I= 79, 84) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 86),I= 85, 90) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 86),I= 91, 96) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 86),I= 97,102) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 86),I=103,108) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I, 86),I=109,114) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 86),I=115,120) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ + DATA (CF(I),I=6631,6665) /4096,128,1280,-1024,128,-160,1280,992 + $ ,1136,128,-16,-88,-268,56,-448,-124,992,-232,884,884,-268,-268 + $ ,1010,-124,992,-106,38,-160,20,20,-160,-124,-142,-16,2/ C 1 T(6,5,1,7,2,3,4) - DATA (CF(I, 87),I= 1, 6) /-6.913580246913580D-01 - $ ,8.641975308641975D-02,1.530864197530864D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 87),I= 7, 12) /1.530864197530864D+00, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-1.635802469135803D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 87),I= 13, 18) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 87),I= 19, 24) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I, 87),I= 25, 30) /1.530864197530864D+00, - $ -1.913580246913580D-01,1.753086419753086D+00, - $ -2.191358024691358D-01,1.586419753086420D+00,1.558641975308642D - $ +00/ - DATA (CF(I, 87),I= 31, 36) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 87),I= 37, 42) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 87),I= 43, 48) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I, 87),I= 49, 54) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I, 87),I= 55, 60) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 87),I= 61, 66) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 87),I= 67, 72) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 87),I= 73, 78) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I, 87),I= 79, 84) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 87),I= 85, 90) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 87),I= 91, 96) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 87),I= 97,102) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 87),I=103,108) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 87),I=109,114) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 87),I=115,120) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ + DATA (CF(I),I=6666,6699) /4096,-1024,1280,128,-448,992,992,-160, + $ -160,-16,272,-232,-232,-88,-88,1028,-232,884,-88,56,-106,-124, + $ -88,-106,1028,-124,200,20,56,-124,-124,20,20,2/ C 1 T(6,5,2,1,7,3,4) - DATA (CF(I, 88),I= 1, 6) /8.641975308641975D-02, - $ -1.358024691358025D-01,-1.913580246913580D-01, - $ -1.635802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 88),I= 7, 12) /-1.913580246913580D-01 - $ ,1.586419753086420D+00,3.086419753086420D-02,3.086419753086420D - $ -01,-1.358024691358025D-01,-1.635802469135803D-01/ - DATA (CF(I, 88),I= 13, 18) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 88),I= 19, 24) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I, 88),I= 25, 30) /-1.913580246913580D-01, - $ -1.635802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02,-1.358024691358025D-01, - $ -4.135802469135803D-01/ - DATA (CF(I, 88),I= 31, 36) /3.086419753086420D-02 - $ ,3.086419753086420D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 88),I= 37, 42) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 88),I= 43, 48) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I, 88),I= 49, 54) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I, 88),I= 55, 60) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 88),I= 61, 66) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 88),I= 67, 72) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 88),I= 73, 78) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 88),I= 79, 84) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 88),I= 85, 90) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 88),I= 91, 96) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 88),I= 97,102) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I, 88),I=103,108) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 88),I=109,114) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 88),I=115,120) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ + DATA (CF(I),I=6700,6732) /4096,128,-1024,992,1136,-160,1280,-16 + $ ,128,-232,884,884,-268,-268,1010,-88,-268,56,-448,-124,992,-106 + $ ,38,-124,992,20,-160,-124,-142,20,-160,2,-16/ C 1 T(6,5,2,7,1,3,4) - DATA (CF(I, 89),I= 1, 6) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 89),I= 7, 12) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 89),I= 13, 18) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 89),I= 19, 24) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 89),I= 25, 30) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 89),I= 31, 36) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 89),I= 37, 42) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 89),I= 43, 48) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 89),I= 49, 54) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 89),I= 55, 60) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 89),I= 61, 66) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 89),I= 67, 72) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 89),I= 73, 78) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 89),I= 79, 84) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 89),I= 85, 90) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 89),I= 91, 96) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 89),I= 97,102) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I, 89),I=103,108) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I, 89),I=109,114) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 89),I=115,120) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ + DATA (CF(I),I=6733,6764) /4096,-1024,-16,128,-160,-16,-1024,128 + $ ,1028,1010,-124,992,-142,1136,-88,-268,-106,-124,38,-142,20, + $ -160,200,20,1280,-160,2,-16,20,2,128,-16/ C 1 T(6,5,7,1,2,3,4) - DATA (CF(I, 90),I= 1, 6) /-1.358024691358025D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01/ - DATA (CF(I, 90),I= 7, 12) /-1.635802469135803D-01, - $ -1.358024691358025D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.586419753086420D+00,-1.913580246913580D-01/ - DATA (CF(I, 90),I= 13, 18) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 90),I= 19, 24) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 90),I= 25, 30) /-4.135802469135803D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00/ - DATA (CF(I, 90),I= 31, 36) /5.864197530864197D-02, - $ -1.635802469135803D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 90),I= 37, 42) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 90),I= 43, 48) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 90),I= 49, 54) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I, 90),I= 55, 60) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 90),I= 61, 66) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 90),I= 67, 72) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 90),I= 73, 78) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I, 90),I= 79, 84) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 90),I= 85, 90) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 90),I= 91, 96) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 90),I= 97,102) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I, 90),I=103,108) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I, 90),I=109,114) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 90),I=115,120) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ + DATA (CF(I),I=6765,6795) /4096,-160,-16,-16,128,128,-1024,-88, + $ -268,-106,-124,38,-142,1028,1010,-124,992,-142,1136,200,20,20, + $ -160,-160,1280,20,2,2,-16,-16,128/ C 1 T(6,5,7,2,1,3,4) - DATA (CF(I, 91),I= 1, 6) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 91),I= 7, 12) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 91),I= 13, 18) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 91),I= 19, 24) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 91),I= 25, 30) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 91),I= 31, 36) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 91),I= 37, 42) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 91),I= 43, 48) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 91),I= 49, 54) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 91),I= 55, 60) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 91),I= 61, 66) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 91),I= 67, 72) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 91),I= 73, 78) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 91),I= 79, 84) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 91),I= 85, 90) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 91),I= 91, 96) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 91),I= 97,102) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 91),I=103,108) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 91),I=109,114) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 91),I=115,120) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ + DATA (CF(I),I=6796,6825) /4096,-1024,-1024,128,128,1280,2,-16,20 + $ ,2,128,-16,20,-160,-124,-142,-16,2,-124,20,56,-124,2,20,-1024 + $ ,128,128,-16,-16,-160/ C 1 T(6,7,1,2,5,3,4) - DATA (CF(I, 92),I= 1, 6) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 92),I= 7, 12) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 92),I= 13, 18) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 92),I= 19, 24) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 92),I= 25, 30) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 92),I= 31, 36) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 92),I= 37, 42) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 92),I= 43, 48) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 92),I= 49, 54) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 92),I= 55, 60) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 92),I= 61, 66) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 92),I= 67, 72) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 92),I= 73, 78) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 92),I= 79, 84) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 92),I= 85, 90) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 92),I= 91, 96) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 92),I= 97,102) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 92),I=103,108) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 92),I=109,114) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 92),I=115,120) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ + DATA (CF(I),I=6826,6854) /4096,128,1280,-1024,128,20,2,2,-16,-16 + $ ,128,-124,20,56,-124,2,20,20,-160,-124,-142,-16,2,128,-1024,-16 + $ ,-160,128,-16/ C 1 T(6,7,1,5,2,3,4) - DATA (CF(I, 93),I= 1, 6) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 93),I= 7, 12) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 93),I= 13, 18) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 93),I= 19, 24) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 93),I= 25, 30) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 93),I= 31, 36) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 93),I= 37, 42) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 93),I= 43, 48) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 93),I= 49, 54) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 93),I= 55, 60) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 93),I= 61, 66) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 93),I= 67, 72) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 93),I= 73, 78) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 93),I= 79, 84) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 93),I= 85, 90) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 93),I= 91, 96) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 93),I= 97,102) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 93),I=103,108) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 93),I=109,114) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 93),I=115,120) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ + DATA (CF(I),I=6855,6882) /4096,-1024,1280,128,20,-160,-124,-142, + $ -16,2,2,-16,20,2,128,-16,56,-124,-124,20,20,2,128,-16,-1024,128 + $ ,-160,-16/ C 1 T(6,7,2,1,5,3,4) - DATA (CF(I, 94),I= 1, 6) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 94),I= 7, 12) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 94),I= 13, 18) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 94),I= 19, 24) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 94),I= 25, 30) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 94),I= 31, 36) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 94),I= 37, 42) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 94),I= 43, 48) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 94),I= 49, 54) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 94),I= 55, 60) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 94),I= 61, 66) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 94),I= 67, 72) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 94),I= 73, 78) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 94),I= 79, 84) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 94),I= 85, 90) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 94),I= 91, 96) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 94),I= 97,102) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 94),I=103,108) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 94),I=109,114) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 94),I=115,120) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ + DATA (CF(I),I=6883,6909) /4096,128,-1024,-124,20,56,-124,2,20,20 + $ ,2,2,-16,-16,128,-124,-142,20,-160,2,-16,-16,-160,128,-1024,-16 + $ ,128/ C 1 T(6,7,2,5,1,3,4) - DATA (CF(I, 95),I= 1, 6) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 95),I= 7, 12) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 95),I= 13, 18) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 95),I= 19, 24) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 95),I= 25, 30) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 95),I= 31, 36) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 95),I= 37, 42) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 95),I= 43, 48) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 95),I= 49, 54) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 95),I= 55, 60) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 95),I= 61, 66) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 95),I= 67, 72) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 95),I= 73, 78) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 95),I= 79, 84) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 95),I= 85, 90) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I, 95),I= 91, 96) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I, 95),I= 97,102) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 95),I=103,108) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 95),I=109,114) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 95),I=115,120) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ + DATA (CF(I),I=6910,6935) /4096,-1024,-124,-142,20,-160,2,-16,56, + $ -124,-124,20,20,2,2,-16,20,2,128,-16,-16,128,-160,-16,-1024,128/ C 1 T(6,7,5,1,2,3,4) - DATA (CF(I, 96),I= 1, 6) /-3.580246913580247D-01 - $ ,4.197530864197531D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00,-3.580246913580247D-01, - $ -1.358024691358025D-01/ - DATA (CF(I, 96),I= 7, 12) /1.364197530864198D+00, - $ -3.580246913580247D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 96),I= 13, 18) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 96),I= 19, 24) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 96),I= 25, 30) /1.364197530864198D+00, - $ -3.580246913580247D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00,1.364197530864198D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 96),I= 31, 36) /-4.135802469135803D-01, - $ -1.358024691358025D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00,8.641975308641975D-02, - $ -6.913580246913580D-01/ - DATA (CF(I, 96),I= 37, 42) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 96),I= 43, 48) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 96),I= 49, 54) /-4.135802469135803D-01, - $ -1.358024691358025D-01,5.864197530864197D-02, - $ -2.191358024691358D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 96),I= 55, 60) /1.558641975308642D+00 - $ ,1.586419753086420D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I, 96),I= 61, 66) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 96),I= 67, 72) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 96),I= 73, 78) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 96),I= 79, 84) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 96),I= 85, 90) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I, 96),I= 91, 96) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I, 96),I= 97,102) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 96),I=103,108) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I, 96),I=109,114) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 96),I=115,120) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ + DATA (CF(I),I=6936,6960) /4096,56,-124,-124,20,20,2,-124,-142,20 + $ ,-160,2,-16,20,2,2,-16,-16,128,-160,-16,-16,128,128,-1024/ C 1 T(6,7,5,2,1,3,4) - DATA (CF(I, 97),I= 1, 6) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 97),I= 7, 12) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 97),I= 13, 18) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 97),I= 19, 24) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 97),I= 25, 30) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 97),I= 31, 36) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 97),I= 37, 42) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 97),I= 43, 48) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 97),I= 49, 54) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 97),I= 55, 60) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 97),I= 61, 66) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 97),I= 67, 72) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 97),I= 73, 78) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 97),I= 79, 84) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 97),I= 85, 90) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 97),I= 91, 96) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 97),I= 97,102) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I, 97),I=103,108) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 97),I=109,114) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 97),I=115,120) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ + DATA (CF(I),I=6961,6984) /4096,-1024,-1024,128,128,1280,-1024 + $ ,128,128,-16,-16,-160,128,-16,1280,-160,1136,992,-16,-160,-160 + $ ,992,992,-448/ C 1 T(7,1,2,5,6,3,4) - DATA (CF(I, 98),I= 1, 6) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I, 98),I= 7, 12) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 98),I= 13, 18) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 98),I= 19, 24) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 98),I= 25, 30) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I, 98),I= 31, 36) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 98),I= 37, 42) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 98),I= 43, 48) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I, 98),I= 49, 54) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I, 98),I= 55, 60) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 98),I= 61, 66) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 98),I= 67, 72) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I, 98),I= 73, 78) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 98),I= 79, 84) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 98),I= 85, 90) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 98),I= 91, 96) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 98),I= 97,102) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I, 98),I=103,108) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 98),I=109,114) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I, 98),I=115,120) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ + DATA (CF(I),I=6985,7007) /4096,128,1280,-1024,128,128,-1024,-16, + $ -160,128,-16,-16,-160,-160,992,992,-448,128,-16,1280,-160,1136 + $ ,992/ C 1 T(7,1,2,6,5,3,4) - DATA (CF(I, 99),I= 1, 6) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I, 99),I= 7, 12) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I, 99),I= 13, 18) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I, 99),I= 19, 24) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I, 99),I= 25, 30) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I, 99),I= 31, 36) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I, 99),I= 37, 42) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I, 99),I= 43, 48) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I, 99),I= 49, 54) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I, 99),I= 55, 60) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I, 99),I= 61, 66) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I, 99),I= 67, 72) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I, 99),I= 73, 78) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I, 99),I= 79, 84) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I, 99),I= 85, 90) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I, 99),I= 91, 96) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I, 99),I= 97,102) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I, 99),I=103,108) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I, 99),I=109,114) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I, 99),I=115,120) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ + DATA (CF(I),I=7008,7029) /4096,-1024,1280,128,128,-16,1280,-160 + $ ,1136,992,-1024,128,128,-16,-16,-160,-160,-16,992,-448,-160,992/ C 1 T(7,1,5,2,6,3,4) - DATA (CF(I,100),I= 1, 6) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,100),I= 7, 12) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,100),I= 13, 18) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,100),I= 19, 24) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,100),I= 25, 30) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,100),I= 31, 36) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,100),I= 37, 42) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,100),I= 43, 48) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I,100),I= 49, 54) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,100),I= 55, 60) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,100),I= 61, 66) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,100),I= 67, 72) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I,100),I= 73, 78) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,100),I= 79, 84) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,100),I= 85, 90) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,100),I= 91, 96) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,100),I= 97,102) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,100),I=103,108) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I,100),I=109,114) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,100),I=115,120) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ + DATA (CF(I),I=7030,7050) /4096,128,-1024,-16,-160,-160,992,992, + $ -448,128,-1024,-16,-160,128,-16,-16,128,1136,992,1280,-160/ C 1 T(7,1,5,6,2,3,4) - DATA (CF(I,101),I= 1, 6) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,101),I= 7, 12) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,101),I= 13, 18) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,101),I= 19, 24) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I,101),I= 25, 30) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,101),I= 31, 36) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,101),I= 37, 42) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,101),I= 43, 48) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,101),I= 49, 54) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,101),I= 55, 60) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,101),I= 61, 66) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,101),I= 67, 72) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I,101),I= 73, 78) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,101),I= 79, 84) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,101),I= 85, 90) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,101),I= 91, 96) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,101),I= 97,102) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I,101),I=103,108) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,101),I=109,114) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,101),I=115,120) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ + DATA (CF(I),I=7051,7070) /4096,-1024,-16,128,1136,992,1280,-160, + $ -160,-16,992,-448,-160,992,-1024,128,128,-16,-16,-160/ C 1 T(7,1,6,2,5,3,4) - DATA (CF(I,102),I= 1, 6) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,102),I= 7, 12) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,102),I= 13, 18) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,102),I= 19, 24) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,102),I= 25, 30) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,102),I= 31, 36) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,102),I= 37, 42) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,102),I= 43, 48) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I,102),I= 49, 54) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,102),I= 55, 60) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,102),I= 61, 66) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,102),I= 67, 72) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,102),I= 73, 78) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,102),I= 79, 84) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,102),I= 85, 90) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,102),I= 91, 96) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I,102),I= 97,102) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I,102),I=103,108) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,102),I=109,114) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,102),I=115,120) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ + DATA (CF(I),I=7071,7089) /4096,-160,-16,992,-448,-160,992,-16 + $ ,128,1136,992,1280,-160,128,-1024,-16,-160,128,-16/ C 1 T(7,1,6,5,2,3,4) - DATA (CF(I,103),I= 1, 6) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,103),I= 7, 12) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,103),I= 13, 18) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,103),I= 19, 24) /1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,103),I= 25, 30) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,103),I= 31, 36) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,103),I= 37, 42) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,103),I= 43, 48) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,103),I= 49, 54) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,103),I= 55, 60) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,103),I= 61, 66) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,103),I= 67, 72) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I,103),I= 73, 78) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,103),I= 79, 84) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,103),I= 85, 90) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,103),I= 91, 96) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I,103),I= 97,102) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,103),I=103,108) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I,103),I=109,114) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I,103),I=115,120) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ + DATA (CF(I),I=7090,7107) /4096,-1024,-1024,128,128,1280,1280, + $ -160,128,-16,992,1136,-160,992,-16,-160,-448,992/ C 1 T(7,2,1,5,6,3,4) - DATA (CF(I,104),I= 1, 6) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,104),I= 7, 12) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,104),I= 13, 18) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,104),I= 19, 24) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03,3.086419753086420D - $ -02,-2.469135802469136D-02,3.086419753086420D-03/ - DATA (CF(I,104),I= 25, 30) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,104),I= 31, 36) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,104),I= 37, 42) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,104),I= 43, 48) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,104),I= 49, 54) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,104),I= 55, 60) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,104),I= 61, 66) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,104),I= 67, 72) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I,104),I= 73, 78) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,104),I= 79, 84) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,104),I= 85, 90) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,104),I= 91, 96) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I,104),I= 97,102) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,104),I=103,108) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I,104),I=109,114) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,104),I=115,120) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ + DATA (CF(I),I=7108,7124) /4096,128,1280,-1024,128,-160,992,-16, + $ -160,-448,992,1280,-160,128,-16,992,1136/ C 1 T(7,2,1,6,5,3,4) - DATA (CF(I,105),I= 1, 6) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,105),I= 7, 12) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,105),I= 13, 18) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,105),I= 19, 24) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,105),I= 25, 30) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,105),I= 31, 36) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,105),I= 37, 42) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,105),I= 43, 48) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,105),I= 49, 54) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,105),I= 55, 60) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,105),I= 61, 66) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,105),I= 67, 72) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,105),I= 73, 78) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,105),I= 79, 84) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,105),I= 85, 90) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,105),I= 91, 96) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I,105),I= 97,102) /1.975308641975309D-01, - $ -2.469135802469136D-02,1.975308641975309D+00, - $ -2.469135802469136D-01,1.753086419753086D+00,1.530864197530864D - $ +00/ - DATA (CF(I,105),I=103,108) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I,105),I=109,114) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,105),I=115,120) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ + DATA (CF(I),I=7125,7140) /4096,-1024,1280,128,128,-16,-1024,128, + $ -160,-16,992,-448,-160,-16,992,-160/ C 1 T(7,2,5,1,6,3,4) - DATA (CF(I,106),I= 1, 6) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,106),I= 7, 12) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,106),I= 13, 18) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,106),I= 19, 24) /3.086419753086420D-03 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,8.641975308641975D-02/ - DATA (CF(I,106),I= 25, 30) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,106),I= 31, 36) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,106),I= 37, 42) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,106),I= 43, 48) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,106),I= 49, 54) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,106),I= 55, 60) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,106),I= 61, 66) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,106),I= 67, 72) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,106),I= 73, 78) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,106),I= 79, 84) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,106),I= 85, 90) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,106),I= 91, 96) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,106),I= 97,102) /-2.469135802469136D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -6.913580246913580D-01/ - DATA (CF(I,106),I=103,108) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,106),I=109,114) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,106),I=115,120) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ + DATA (CF(I),I=7141,7155) /4096,128,-1024,-16,-160,128,-1024,-16 + $ ,128,1136,992,-16,128,-160,1280/ C 1 T(7,2,5,6,1,3,4) - DATA (CF(I,107),I= 1, 6) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,107),I= 7, 12) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,107),I= 13, 18) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,107),I= 19, 24) /3.086419753086420D-03, - $ -2.469135802469136D-02,-2.191358024691358D-01, - $ -1.913580246913580D-01,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,107),I= 25, 30) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,107),I= 31, 36) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,107),I= 37, 42) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,107),I= 43, 48) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I,107),I= 49, 54) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,107),I= 55, 60) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,107),I= 61, 66) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,107),I= 67, 72) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I,107),I= 73, 78) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,107),I= 79, 84) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,107),I= 85, 90) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,107),I= 91, 96) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,107),I= 97,102) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.753086419753086D+00,1.530864197530864D - $ +00,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,107),I=103,108) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I,107),I=109,114) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I,107),I=115,120) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ + DATA (CF(I),I=7156,7169) /4096,-1024,992,-448,-160,-16,992,-160 + $ ,128,-16,-1024,128,-160,-16/ C 1 T(7,2,6,1,5,3,4) - DATA (CF(I,108),I= 1, 6) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,108),I= 7, 12) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,108),I= 13, 18) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,108),I= 19, 24) /3.086419753086420D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02, - $ -1.913580246913580D-01/ - DATA (CF(I,108),I= 25, 30) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,108),I= 31, 36) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,108),I= 37, 42) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,108),I= 43, 48) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,108),I= 49, 54) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,108),I= 55, 60) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,108),I= 61, 66) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,108),I= 67, 72) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,108),I= 73, 78) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,108),I= 79, 84) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,108),I= 85, 90) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,108),I= 91, 96) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,108),I= 97,102) /-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,108),I=103,108) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I,108),I=109,114) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,108),I=115,120) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ + DATA (CF(I),I=7170,7182) /4096,1136,992,-16,128,-160,1280,-16, + $ -160,128,-1024,-16,128/ C 1 T(7,2,6,5,1,3,4) - DATA (CF(I,109),I= 1, 6) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,109),I= 7, 12) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,109),I= 13, 18) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,109),I= 19, 24) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,109),I= 25, 30) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,109),I= 31, 36) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,109),I= 37, 42) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,109),I= 43, 48) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I,109),I= 49, 54) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,109),I= 55, 60) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,109),I= 61, 66) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,109),I= 67, 72) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,109),I= 73, 78) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,109),I= 79, 84) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,109),I= 85, 90) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,109),I= 91, 96) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,109),I= 97,102) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,109),I=103,108) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I,109),I=109,114) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ - DATA (CF(I,109),I=115,120) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ + DATA (CF(I),I=7183,7194) /4096,-1024,-1024,128,128,1280,992,-160 + $ ,-448,992,-16,-160/ C 1 T(7,5,1,2,6,3,4) - DATA (CF(I,110),I= 1, 6) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,110),I= 7, 12) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,110),I= 13, 18) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,110),I= 19, 24) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,110),I= 25, 30) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,110),I= 31, 36) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,110),I= 37, 42) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,110),I= 43, 48) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I,110),I= 49, 54) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,110),I= 55, 60) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,110),I= 61, 66) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,110),I= 67, 72) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,110),I= 73, 78) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,110),I= 79, 84) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,110),I= 85, 90) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,110),I= 91, 96) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,110),I= 97,102) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,110),I=103,108) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,110),I=109,114) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ - DATA (CF(I,110),I=115,120) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ + DATA (CF(I),I=7195,7205) /4096,128,1280,-1024,128,-160,1280,992 + $ ,1136,128,-16/ C 1 T(7,5,1,6,2,3,4) - DATA (CF(I,111),I= 1, 6) /8.641975308641975D-02, - $ -6.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,1.530864197530864D+00, - $ -1.913580246913580D-01/ - DATA (CF(I,111),I= 7, 12) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,111),I= 13, 18) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,111),I= 19, 24) /-2.469135802469136D-01 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,3.086419753086420D-03,-1.913580246913580D-01, - $ -2.191358024691358D-01/ - DATA (CF(I,111),I= 25, 30) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,1.586419753086420D+00,1.558641975308642D - $ +00,1.753086419753086D+00,-2.191358024691358D-01/ - DATA (CF(I,111),I= 31, 36) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,111),I= 37, 42) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,111),I= 43, 48) /-2.469135802469136D-02 - $ ,3.086419753086420D-03,1.975308641975309D-01, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,111),I= 49, 54) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,111),I= 55, 60) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,111),I= 61, 66) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,111),I= 67, 72) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,111),I= 73, 78) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,111),I= 79, 84) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,111),I= 85, 90) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,111),I= 91, 96) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,111),I= 97,102) /1.975308641975309D+00, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,1.530864197530864D+00,1.753086419753086D - $ +00/ - DATA (CF(I,111),I=103,108) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,111),I=109,114) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ - DATA (CF(I,111),I=115,120) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ + DATA (CF(I),I=7206,7215) /4096,-1024,1280,128,-448,992,992,-160, + $ -160,-16/ C 1 T(7,5,2,1,6,3,4) - DATA (CF(I,112),I= 1, 6) /-1.358024691358025D-01 - $ ,8.641975308641975D-02,-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.913580246913580D-01, - $ -1.635802469135803D-01/ - DATA (CF(I,112),I= 7, 12) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,112),I= 13, 18) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,112),I= 19, 24) /3.086419753086420D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02,8.641975308641975D-02,-1.913580246913580D-01/ - DATA (CF(I,112),I= 25, 30) /-1.635802469135803D-01, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -4.135802469135803D-01,-2.191358024691358D-01 - $ ,5.864197530864197D-02/ - DATA (CF(I,112),I= 31, 36) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,112),I= 37, 42) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,112),I= 43, 48) /3.086419753086420D-03 - $ ,3.086419753086420D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,112),I= 49, 54) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,112),I= 55, 60) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,112),I= 61, 66) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,112),I= 67, 72) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,112),I= 73, 78) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,112),I= 79, 84) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,112),I= 85, 90) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,112),I= 91, 96) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,112),I= 97,102) /-2.469135802469136D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,112),I=103,108) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,112),I=109,114) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,112),I=115,120) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ + DATA (CF(I),I=7216,7224) /4096,128,-1024,992,1136,-160,1280,-16 + $ ,128/ C 1 T(7,5,2,6,1,3,4) - DATA (CF(I,113),I= 1, 6) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,113),I= 7, 12) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,113),I= 13, 18) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,113),I= 19, 24) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,113),I= 25, 30) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,113),I= 31, 36) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,113),I= 37, 42) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,113),I= 43, 48) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I,113),I= 49, 54) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,113),I= 55, 60) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,113),I= 61, 66) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,113),I= 67, 72) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I,113),I= 73, 78) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,113),I= 79, 84) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,113),I= 85, 90) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,113),I= 91, 96) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,113),I= 97,102) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,113),I=103,108) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I,113),I=109,114) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ - DATA (CF(I,113),I=115,120) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ + DATA (CF(I),I=7225,7232) /4096,-1024,-16,128,-160,-16,-1024,128/ C 1 T(7,5,6,1,2,3,4) - DATA (CF(I,114),I= 1, 6) /-3.580246913580247D-01, - $ -1.358024691358025D-01,4.197530864197531D-01, - $ -3.580246913580247D-01,1.586419753086420D+00, - $ -1.358024691358025D-01/ - DATA (CF(I,114),I= 7, 12) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,114),I= 13, 18) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,114),I= 19, 24) /-1.913580246913580D-01 - $ ,8.641975308641975D-02,3.086419753086420D-02,3.086419753086420D - $ -03,-1.913580246913580D-01,3.086419753086420D-02/ - DATA (CF(I,114),I= 25, 30) /1.364197530864198D+00, - $ -4.135802469135803D-01,-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.558641975308642D+00, - $ -4.135802469135803D-01/ - DATA (CF(I,114),I= 31, 36) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,114),I= 37, 42) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,114),I= 43, 48) /-2.191358024691358D-01, - $ -1.913580246913580D-01,3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,114),I= 49, 54) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,114),I= 55, 60) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,114),I= 61, 66) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,114),I= 67, 72) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,114),I= 73, 78) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,114),I= 79, 84) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,114),I= 85, 90) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,114),I= 91, 96) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,114),I= 97,102) /1.530864197530864D+00, - $ -6.913580246913580D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,1.530864197530864D+00, - $ -2.469135802469136D-01/ - DATA (CF(I,114),I=103,108) /1.753086419753086D+00 - $ ,1.530864197530864D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,114),I=109,114) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ - DATA (CF(I,114),I=115,120) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ + DATA (CF(I),I=7233,7239) /4096,-160,-16,-16,128,128,-1024/ C 1 T(7,5,6,2,1,3,4) - DATA (CF(I,115),I= 1, 6) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,115),I= 7, 12) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,115),I= 13, 18) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,115),I= 19, 24) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,115),I= 25, 30) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,115),I= 31, 36) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,115),I= 37, 42) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,115),I= 43, 48) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,115),I= 49, 54) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,115),I= 55, 60) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,115),I= 61, 66) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,115),I= 67, 72) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,115),I= 73, 78) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,115),I= 79, 84) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,115),I= 85, 90) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,115),I= 91, 96) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,115),I= 97,102) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I,115),I=103,108) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,115),I=109,114) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,115),I=115,120) /1.264197530864197D+01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01,1.975308641975309D - $ +00/ + DATA (CF(I),I=7240,7245) /4096,-1024,-1024,128,128,1280/ C 1 T(7,6,1,2,5,3,4) - DATA (CF(I,116),I= 1, 6) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,116),I= 7, 12) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,116),I= 13, 18) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,116),I= 19, 24) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,116),I= 25, 30) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,116),I= 31, 36) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,116),I= 37, 42) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,116),I= 43, 48) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,116),I= 49, 54) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,116),I= 55, 60) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,116),I= 61, 66) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,116),I= 67, 72) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,116),I= 73, 78) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,116),I= 79, 84) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,116),I= 85, 90) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,116),I= 91, 96) /1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,116),I= 97,102) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,116),I=103,108) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,116),I=109,114) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,116),I=115,120) /-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01,1.975308641975309D - $ +00,-1.580246913580247D+00,1.975308641975309D-01/ + DATA (CF(I),I=7246,7250) /4096,128,1280,-1024,128/ C 1 T(7,6,1,5,2,3,4) - DATA (CF(I,117),I= 1, 6) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,117),I= 7, 12) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,117),I= 13, 18) /-1.913580246913580D-01 - $ ,1.530864197530864D+00,-1.635802469135803D-01 - $ ,5.864197530864197D-02,-2.469135802469136D-01 - $ ,3.086419753086420D-02/ - DATA (CF(I,117),I= 19, 24) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,117),I= 25, 30) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,117),I= 31, 36) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,117),I= 37, 42) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,117),I= 43, 48) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,117),I= 49, 54) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,117),I= 55, 60) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,117),I= 61, 66) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,117),I= 67, 72) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,117),I= 73, 78) /3.086419753086420D-02, - $ -2.469135802469136D-01,-1.913580246913580D-01, - $ -2.191358024691358D-01,-2.469135802469136D-02 - $ ,3.086419753086420D-03/ - DATA (CF(I,117),I= 79, 84) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,117),I= 85, 90) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,117),I= 91, 96) /1.975308641975309D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,117),I= 97,102) /-2.469135802469136D-01 - $ ,1.975308641975309D+00,1.530864197530864D+00,1.753086419753086D - $ +00,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,117),I=103,108) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I,117),I=109,114) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,117),I=115,120) /-1.580246913580247D+00 - $ ,1.975308641975309D-01,1.264197530864197D+01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01/ + DATA (CF(I),I=7251,7254) /4096,-1024,1280,128/ C 1 T(7,6,2,1,5,3,4) - DATA (CF(I,118),I= 1, 6) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,118),I= 7, 12) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,118),I= 13, 18) /1.586419753086420D+00, - $ -1.913580246913580D-01,-1.358024691358025D-01, - $ -1.635802469135803D-01,3.086419753086420D-02,3.086419753086420D - $ -01/ - DATA (CF(I,118),I= 19, 24) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,118),I= 25, 30) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,118),I= 31, 36) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,118),I= 37, 42) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,118),I= 43, 48) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,118),I= 49, 54) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,118),I= 55, 60) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,118),I= 61, 66) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,118),I= 67, 72) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,118),I= 73, 78) /-1.913580246913580D-01 - $ ,3.086419753086420D-02,8.641975308641975D-02, - $ -1.913580246913580D-01,3.086419753086420D-03,3.086419753086420D - $ -02/ - DATA (CF(I,118),I= 79, 84) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,118),I= 85, 90) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,118),I= 91, 96) /-2.469135802469136D-02, - $ -2.469135802469136D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,118),I= 97,102) /1.530864197530864D+00, - $ -2.469135802469136D-01,-6.913580246913580D-01 - $ ,1.530864197530864D+00,-2.469135802469136D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,118),I=103,108) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,118),I=109,114) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,118),I=115,120) /1.975308641975309D-01 - $ ,1.975308641975309D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01,1.975308641975309D-01, - $ -1.580246913580247D+00/ + DATA (CF(I),I=7255,7257) /4096,128,-1024/ C 1 T(7,6,2,5,1,3,4) - DATA (CF(I,119),I= 1, 6) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,119),I= 7, 12) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,119),I= 13, 18) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,119),I= 19, 24) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,119),I= 25, 30) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,119),I= 31, 36) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,119),I= 37, 42) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,119),I= 43, 48) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,119),I= 49, 54) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,119),I= 55, 60) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,119),I= 61, 66) /3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-01,3.086419753086420D - $ -02,1.975308641975309D+00,-2.469135802469136D-01/ - DATA (CF(I,119),I= 67, 72) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,119),I= 73, 78) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,119),I= 79, 84) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,119),I= 85, 90) /3.086419753086420D-03, - $ -2.469135802469136D-02,3.086419753086420D-02,3.086419753086420D - $ -03,1.975308641975309D-01,-2.469135802469136D-02/ - DATA (CF(I,119),I= 91, 96) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I,119),I= 97,102) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,119),I=103,108) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,119),I=109,114) /-2.469135802469136D-02 - $ ,1.975308641975309D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02,-1.580246913580247D+00 - $ ,1.975308641975309D-01/ - DATA (CF(I,119),I=115,120) /1.975308641975309D-01, - $ -1.580246913580247D+00,1.975308641975309D+00,1.975308641975309D - $ -01,1.264197530864197D+01,-1.580246913580247D+00/ + DATA (CF(I),I=7258,7259) /4096,-1024/ C 1 T(7,6,5,1,2,3,4) - DATA (CF(I,120),I= 1, 6) /4.197530864197531D-01, - $ -3.580246913580247D-01,-3.580246913580247D-01, - $ -1.358024691358025D-01,-1.358024691358025D-01 - $ ,1.586419753086420D+00/ - DATA (CF(I,120),I= 7, 12) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,-1.358024691358025D-01 - $ ,8.641975308641975D-02,-1.635802469135803D-01, - $ -1.913580246913580D-01/ - DATA (CF(I,120),I= 13, 18) /-1.358024691358025D-01, - $ -1.635802469135803D-01,1.586419753086420D+00, - $ -1.913580246913580D-01,3.086419753086420D-01,3.086419753086420D - $ -02/ - DATA (CF(I,120),I= 19, 24) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,120),I= 25, 30) /-3.580246913580247D-01 - $ ,1.364197530864198D+00,1.364197530864198D+00, - $ -4.135802469135803D-01,-4.135802469135803D-01 - $ ,1.558641975308642D+00/ - DATA (CF(I,120),I= 31, 36) /-1.358024691358025D-01, - $ -4.135802469135803D-01,8.641975308641975D-02, - $ -6.913580246913580D-01,-1.913580246913580D-01 - $ ,1.530864197530864D+00/ - DATA (CF(I,120),I= 37, 42) /-1.635802469135803D-01 - $ ,5.864197530864197D-02,-1.913580246913580D-01 - $ ,1.530864197530864D+00,3.086419753086420D-02, - $ -2.469135802469136D-01/ - DATA (CF(I,120),I= 43, 48) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,120),I= 49, 54) /-1.358024691358025D-01, - $ -4.135802469135803D-01,-1.635802469135803D-01, - $ -1.913580246913580D-01,5.864197530864197D-02, - $ -2.191358024691358D-01/ - DATA (CF(I,120),I= 55, 60) /1.586419753086420D+00 - $ ,1.558641975308642D+00,-1.913580246913580D-01 - $ ,1.530864197530864D+00,-2.191358024691358D-01 - $ ,1.753086419753086D+00/ - DATA (CF(I,120),I= 61, 66) /3.086419753086420D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02, - $ -2.469135802469136D-01,-2.469135802469136D-01 - $ ,1.975308641975309D+00/ - DATA (CF(I,120),I= 67, 72) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,120),I= 73, 78) /8.641975308641975D-02, - $ -1.913580246913580D-01,-1.913580246913580D-01 - $ ,3.086419753086420D-02,3.086419753086420D-02,3.086419753086420D - $ -03/ - DATA (CF(I,120),I= 79, 84) /-1.913580246913580D-01, - $ -2.191358024691358D-01,3.086419753086420D-02, - $ -2.469135802469136D-01,3.086419753086420D-03, - $ -2.469135802469136D-02/ - DATA (CF(I,120),I= 85, 90) /3.086419753086420D-02 - $ ,3.086419753086420D-03,3.086419753086420D-03, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,120),I= 91, 96) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,120),I= 97,102) /-6.913580246913580D-01 - $ ,1.530864197530864D+00,1.530864197530864D+00, - $ -2.469135802469136D-01,-2.469135802469136D-01, - $ -2.469135802469136D-02/ - DATA (CF(I,120),I=103,108) /1.530864197530864D+00 - $ ,1.753086419753086D+00,-2.469135802469136D-01 - $ ,1.975308641975309D+00,-2.469135802469136D-02 - $ ,1.975308641975309D-01/ - DATA (CF(I,120),I=109,114) /-2.469135802469136D-01, - $ -2.469135802469136D-02,-2.469135802469136D-02 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00/ - DATA (CF(I,120),I=115,120) /1.975308641975309D+00 - $ ,1.975308641975309D-01,1.975308641975309D-01, - $ -1.580246913580247D+00,-1.580246913580247D+00 - $ ,1.264197530864197D+01/ + DATA (CF(I),I=7260,7260) /4096/ C 1 T(7,6,5,2,1,3,4) C ---------- C BEGIN CODE @@ -18811,10 +10171,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -18823,6 +10185,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/cuts.f b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/genps.f b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/myamp.f b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/banner.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/banner.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/check_param_card.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/file_writers.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/files.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/files.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/histograms.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/restore_data b/epochX/cudacpp/gg_ttggg.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/restore_data +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/sum_html.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/gg_ttggg.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/gg_ttggg.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/gg_ttggg.mad/bin/madevent b/epochX/cudacpp/gg_ttggg.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/gg_ttggg.mad/bin/madevent +++ b/epochX/cudacpp/gg_ttggg.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/gg_ttggg.mad/src/HelAmps_sm.h b/epochX/cudacpp/gg_ttggg.mad/src/HelAmps_sm.h index 53dd560ed6..921ace57e7 100644 --- a/epochX/cudacpp/gg_ttggg.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_ttggg.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.cc b/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.h b/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_ttggg.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.sa/CODEGEN_cudacpp_gg_ttggg_log.txt b/epochX/cudacpp/gg_ttggg.sa/CODEGEN_cudacpp_gg_ttggg_log.txt index 37d3314a5d..9992b378f9 100644 --- a/epochX/cudacpp/gg_ttggg.sa/CODEGEN_cudacpp_gg_ttggg_log.txt +++ b/epochX/cudacpp/gg_ttggg.sa/CODEGEN_cudacpp_gg_ttggg_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -58,7 +60,7 @@ generate g g > t t~ g g g No model currently active, so we import the Standard Model INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.005965471267700195  +DEBUG: model prefixing takes 0.0018663406372070312  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -151,13 +153,13 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=5: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ g g g WEIGHTED<=5 @1 INFO: Process has 1240 diagrams -1 processes with 1240 diagrams generated in 1.863 s +1 processes with 1240 diagrams generated in 0.683 s Total: 1 processes with 1240 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_gg_ttggg Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g g g WEIGHTED<=5 @1 INFO: Processing color information for process: g g > t t~ g g g @1 @@ -166,18 +168,18 @@ INFO: Processing color information for process: g g > t t~ g g g @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg/. -Generated helas calls for 1 subprocesses (1240 diagrams) in 6.535 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/SubProcesses/P1_Sigma_sm_gg_ttxggg/. +Generated helas calls for 1 subprocesses (1240 diagrams) in 2.529 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 5 routines in 0.348 s +ALOHA: aloha creates 5 routines in 0.140 s VVV1 VVV1 FFV1 @@ -190,17 +192,17 @@ ALOHA: aloha creates 5 routines in 0.348 s VVVV3 VVVV4 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gg_ttggg/src/. quit -real 0m12.948s -user 0m12.781s -sys 0m0.107s -Code generation completed in 13 seconds +real 0m8.444s +user 0m5.036s +sys 0m0.315s +Code generation completed in 9 seconds diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/Bridge.h b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.cc b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.cc index 07099839d3..047387cab4 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.cc +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -32273,7 +32337,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -32647,9 +32713,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -32657,7 +32720,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -32682,11 +32744,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -32699,17 +32762,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -32824,38 +32877,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -33028,11 +33050,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.h b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.h index 2eb1e066ff..a89060a269 100644 --- a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.h +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.sa/src/HelAmps_sm.h b/epochX/cudacpp/gg_ttggg.sa/src/HelAmps_sm.h index 53dd560ed6..921ace57e7 100644 --- a/epochX/cudacpp/gg_ttggg.sa/src/HelAmps_sm.h +++ b/epochX/cudacpp/gg_ttggg.sa/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.cc b/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.cc +++ b/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.h b/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.h +++ b/epochX/cudacpp/gg_ttggg.sa/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.mad/CODEGEN_mad_gq_ttq_log.txt b/epochX/cudacpp/gq_ttq.mad/CODEGEN_mad_gq_ttq_log.txt index 1baee42e06..8486c2944e 100644 --- a/epochX/cudacpp/gq_ttq.mad/CODEGEN_mad_gq_ttq_log.txt +++ b/epochX/cudacpp/gq_ttq.mad/CODEGEN_mad_gq_ttq_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -57,7 +59,7 @@ set zerowidth_tchannel F define q = u c d s u~ c~ d~ s~ INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006198406219482422  +DEBUG: model prefixing takes 0.001968860626220703  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -166,21 +168,21 @@ INFO: Crossed process found for g u~ > t t~ u~, reuse diagrams. INFO: Crossed process found for g c~ > t t~ c~, reuse diagrams. INFO: Crossed process found for g d~ > t t~ d~, reuse diagrams. INFO: Crossed process found for g s~ > t t~ s~, reuse diagrams. -8 processes with 40 diagrams generated in 0.078 s +8 processes with 40 diagrams generated in 0.055 s Total: 8 processes with 40 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_gq_ttq --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_gq_ttq INFO: remove old information in CODEGEN_mad_gq_ttq DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g u > t t~ u WEIGHTED<=3 @1 INFO: Processing color information for process: g u > t t~ u @1 @@ -200,9 +202,9 @@ FileWriter t t~ u WEIGHTED<=3 @1 INFO: Finding symmetric diagrams for subprocess group gu_ttxu -DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gux_ttxux DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -211,62 +213,64 @@ FileWriter t t~ u~ WEIGHTED<=3 @1 INFO: Finding symmetric diagrams for subprocess group gux_ttxux -DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1552]  -Generated helas calls for 2 subprocesses (10 diagrams) in 0.030 s -Wrote files for 32 helas calls in 0.164 s +DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1563]  +Generated helas calls for 2 subprocesses (10 diagrams) in 0.024 s +Wrote files for 32 helas calls in 2.151 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVV1 routines -ALOHA: aloha creates 2 routines in 0.148 s +ALOHA: aloha creates 2 routines in 0.064 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVV1 routines -ALOHA: aloha creates 4 routines in 0.132 s +ALOHA: aloha creates 4 routines in 0.074 s FFV1 FFV1 FFV1 FFV1 VVV1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/SubProcesses/P1_gu_ttxu; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/SubProcesses/P1_gu_ttxu; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 254 (offset 27 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/SubProcesses/P1_gux_ttxux; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/SubProcesses/P1_gux_ttxux; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 254 (offset 27 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/README Run "open index.html" to see more information about this process. quit -real 0m2.210s -user 0m1.890s -sys 0m0.303s -Code generation completed in 2 seconds +real 0m7.939s +user 0m1.339s +sys 0m0.754s +Code generation completed in 8 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -279,7 +283,7 @@ Code generation completed in 2 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -287,10 +291,9 @@ Code generation completed in 2 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -309,7 +312,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -317,10 +320,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_gq_ttq/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/gq_ttq.mad/Cards/me5_configuration.txt b/epochX/cudacpp/gq_ttq.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/gq_ttq.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/gq_ttq.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/gq_ttq.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/gq_ttq.mad/Cards/proc_card_mg5.dat index 795e11afaf..d9e54f3f0e 100644 --- a/epochX/cudacpp/gq_ttq.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/gq_ttq.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/gq_ttq.mad/Cards/run_card.dat b/epochX/cudacpp/gq_ttq.mad/Cards/run_card.dat index 66a805e521..3db737130c 100644 --- a/epochX/cudacpp/gq_ttq.mad/Cards/run_card.dat +++ b/epochX/cudacpp/gq_ttq.mad/Cards/run_card.dat @@ -109,6 +109,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gq_ttq.mad/Cards/run_card_default.dat b/epochX/cudacpp/gq_ttq.mad/Cards/run_card_default.dat index 8c0f1e2199..47c2051950 100644 --- a/epochX/cudacpp/gq_ttq.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/gq_ttq.mad/Cards/run_card_default.dat @@ -109,6 +109,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/gq_ttq.mad/MGMEVersion.txt b/epochX/cudacpp/gq_ttq.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gq_ttq.mad/MGMEVersion.txt +++ b/epochX/cudacpp/gq_ttq.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gq_ttq.mad/Source/alfas_functions.f b/epochX/cudacpp/gq_ttq.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/gq_ttq.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/gq_ttq.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/gq_ttq.mad/Source/cuts.inc b/epochX/cudacpp/gq_ttq.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/gq_ttq.mad/Source/cuts.inc +++ b/epochX/cudacpp/gq_ttq.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/gq_ttq.mad/Source/make_opts b/epochX/cudacpp/gq_ttq.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/gq_ttq.mad/Source/make_opts +++ b/epochX/cudacpp/gq_ttq.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/gq_ttq.mad/Source/makefile b/epochX/cudacpp/gq_ttq.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/gq_ttq.mad/Source/makefile +++ b/epochX/cudacpp/gq_ttq.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/gq_ttq.mad/Source/run_card.inc b/epochX/cudacpp/gq_ttq.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/gq_ttq.mad/Source/run_card.inc +++ b/epochX/cudacpp/gq_ttq.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/Bridge.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc index 99573ab87a..2e83974fdb 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -341,8 +405,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[4], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[5], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -370,8 +440,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[5], w_fp[2], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -384,8 +457,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[1], w_fp[5], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -398,8 +474,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 VVV1_0( w_fp[0], w_fp[7], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -610,7 +689,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -980,9 +1061,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -990,7 +1068,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1015,11 +1092,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1032,17 +1110,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1157,38 +1225,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1361,11 +1398,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h index b501a9772e..0db2d57c1d 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f index b0cc58e89c..04ee9916ca 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f index 2b281a8200..2afe71ca6b 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,14 +140,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF D2=PDG2PDF(LPP(IB(2)),1, IB(2),XBK(IB(2)), QSCALE) U2=PDG2PDF(LPP(IB(2)),2, IB(2),XBK(IB(2)), QSCALE) @@ -234,7 +234,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -309,6 +309,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -393,18 +397,18 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) D2(IVEC)=PDG2PDF(LPP(IB(2)),1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) U2(IVEC)=PDG2PDF(LPP(IB(2)),2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) S2(IVEC)=PDG2PDF(LPP(IB(2)),3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) C2(IVEC)=PDG2PDF(LPP(IB(2)),4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/matrix1.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/matrix1.f index 1efce64e40..2bd0e076bf 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/matrix1.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -341,7 +341,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -387,7 +387,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -430,21 +431,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,3,2) T(5,4) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,3,4) T(5,2) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,5,2) T(3,4) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,5,4) T(3,2) C ---------- C BEGIN CODE @@ -507,10 +501,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -519,6 +515,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc index 6dc0abd17c..84f20844d3 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -341,8 +405,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[5], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -370,8 +440,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[5], w_fp[2], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 6. * amp_sv[0]; @@ -384,8 +457,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[4], w_fp[5], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -398,8 +474,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 VVV1_0( w_fp[0], w_fp[7], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -610,7 +689,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -980,9 +1061,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -990,7 +1068,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1015,11 +1092,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1032,17 +1110,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1157,38 +1225,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1361,11 +1398,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h index d658e0394e..d18eb18110 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f index e36675626f..7c2b7d44c2 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f index 61bb13c3e7..b869d6cc8f 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,14 +140,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -234,7 +234,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -309,6 +309,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -393,18 +397,18 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/matrix1.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/matrix1.f index c8fbbe9e22..895210eff5 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/matrix1.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -341,7 +341,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -387,7 +387,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -430,21 +431,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,2,4) T(3,5) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,2,5) T(3,4) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,3,4) T(2,5) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,3,5) T(2,4) C ---------- C BEGIN CODE @@ -507,10 +501,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -519,6 +515,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/cuts.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/genps.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/myamp.f b/epochX/cudacpp/gq_ttq.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/gq_ttq.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/banner.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/banner.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/check_param_card.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/file_writers.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/files.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/files.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/histograms.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/restore_data b/epochX/cudacpp/gq_ttq.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/restore_data +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/sum_html.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/gq_ttq.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/gq_ttq.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/gq_ttq.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/gq_ttq.mad/bin/madevent b/epochX/cudacpp/gq_ttq.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/gq_ttq.mad/bin/madevent +++ b/epochX/cudacpp/gq_ttq.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/gq_ttq.mad/src/HelAmps_sm.h b/epochX/cudacpp/gq_ttq.mad/src/HelAmps_sm.h index a304fc85c8..a7f18284b4 100644 --- a/epochX/cudacpp/gq_ttq.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/gq_ttq.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.cc b/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.cc index 998cb505a0..5f2def274e 100644 --- a/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.h b/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.h index 1565ed5888..d2a4a36268 100644 --- a/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/gq_ttq.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.sa/CODEGEN_cudacpp_gq_ttq_log.txt b/epochX/cudacpp/gq_ttq.sa/CODEGEN_cudacpp_gq_ttq_log.txt index 8249ac5d67..8c6d0c28b4 100644 --- a/epochX/cudacpp/gq_ttq.sa/CODEGEN_cudacpp_gq_ttq_log.txt +++ b/epochX/cudacpp/gq_ttq.sa/CODEGEN_cudacpp_gq_ttq_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -57,7 +59,7 @@ set zerowidth_tchannel F define q = u c d s u~ c~ d~ s~ INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006358146667480469  +DEBUG: model prefixing takes 0.001814126968383789  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -166,13 +168,13 @@ INFO: Crossed process found for g u~ > t t~ u~, reuse diagrams. INFO: Crossed process found for g c~ > t t~ c~, reuse diagrams. INFO: Crossed process found for g d~ > t t~ d~, reuse diagrams. INFO: Crossed process found for g s~ > t t~ s~, reuse diagrams. -8 processes with 40 diagrams generated in 0.078 s +8 processes with 40 diagrams generated in 0.063 s Total: 8 processes with 40 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_gq_ttq Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g u > t t~ u WEIGHTED<=3 @1 INFO: Processing color information for process: g u > t t~ u @1 @@ -189,40 +191,40 @@ INFO: Combined process g s~ > t t~ s~ WEIGHTED<=3 @1 with process g u~ > t t~ u~ DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu/. +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gu_ttxu/. DEBUG: Entering PLUGIN_ProcessExporter.generate_subprocess_directory (create the directory) [output.py at line 218]  DEBUG: type(subproc_group)= [output.py at line 219]  DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=1 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux/. -Generated helas calls for 2 subprocesses (10 diagrams) in 0.031 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/SubProcesses/P1_Sigma_sm_gux_ttxux/. +Generated helas calls for 2 subprocesses (10 diagrams) in 0.025 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVV1 routines -ALOHA: aloha creates 2 routines in 0.145 s +ALOHA: aloha creates 2 routines in 0.061 s FFV1 FFV1 FFV1 FFV1 VVV1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_gq_ttq/src/. quit -real 0m0.670s -user 0m0.588s -sys 0m0.061s -Code generation completed in 1 seconds +real 0m1.667s +user 0m0.425s +sys 0m0.153s +Code generation completed in 2 seconds diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/Bridge.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.cc b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.cc index 81ab8669a5..ca7f355c3b 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.cc +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -605,7 +669,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -975,9 +1041,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -985,7 +1048,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1010,11 +1072,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1027,17 +1090,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1152,38 +1205,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1356,11 +1378,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.h index b501a9772e..0db2d57c1d 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.h +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.cc b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.cc index c1c42990a2..0fcd144b28 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.cc +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -605,7 +669,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -975,9 +1041,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -985,7 +1048,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1010,11 +1072,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1027,17 +1090,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1152,38 +1205,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1356,11 +1378,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.h index d658e0394e..d18eb18110 100644 --- a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.h +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.sa/src/HelAmps_sm.h b/epochX/cudacpp/gq_ttq.sa/src/HelAmps_sm.h index a304fc85c8..a7f18284b4 100644 --- a/epochX/cudacpp/gq_ttq.sa/src/HelAmps_sm.h +++ b/epochX/cudacpp/gq_ttq.sa/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.cc b/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.cc index 998cb505a0..5f2def274e 100644 --- a/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.cc +++ b/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.h b/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.h index 1565ed5888..d2a4a36268 100644 --- a/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.h +++ b/epochX/cudacpp/gq_ttq.sa/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.mad/CODEGEN_mad_heft_gg_bb_log.txt b/epochX/cudacpp/heft_gg_bb.mad/CODEGEN_mad_heft_gg_bb_log.txt index c46ef95a65..4e2a1052c6 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/CODEGEN_mad_heft_gg_bb_log.txt +++ b/epochX/cudacpp/heft_gg_bb.mad/CODEGEN_mad_heft_gg_bb_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,17 +49,16 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 set zerowidth_tchannel F set auto_convert_model T save options auto_convert_model -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt import model heft INFO: Restrict model heft with file models/heft/restrict_default.dat . DEBUG: Simplifying conditional expressions  @@ -128,16 +130,16 @@ Total: 1 processes with 4 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_heft_gg_bb --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_heft_gg_bb INFO: remove old information in CODEGEN_mad_heft_gg_bb DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > b b~ HIG<=1 HIW<=1 @1 INFO: Processing color information for process: g g > b b~ HIG<=1 HIW<=1 @1 @@ -149,60 +151,62 @@ FileWriter b b~ HIG<=1 HIW<=1 @1 INFO: Finding symmetric diagrams for subprocess group gg_bbx -DEBUG: len(subproc_diagrams_for_config) =  4 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4} [model_handling.py at line 1552]  -Generated helas calls for 1 subprocesses (4 diagrams) in 0.009 s -Wrote files for 12 helas calls in 0.076 s +DEBUG: len(subproc_diagrams_for_config) =  4 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4} [model_handling.py at line 1563]  +Generated helas calls for 1 subprocesses (4 diagrams) in 0.005 s +Wrote files for 12 helas calls in 1.315 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVS3 routines ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFS2 routines -ALOHA: aloha creates 4 routines in 0.266 s +ALOHA: aloha creates 4 routines in 0.149 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVS3 routines ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFS2 routines -ALOHA: aloha creates 8 routines in 0.250 s +ALOHA: aloha creates 8 routines in 0.109 s VVS3 VVV1 FFV1 FFV1 FFV1 FFS2 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/./HelAmps_heft.h -INFO: Created file HelAmps_heft.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/./HelAmps_heft.h +INFO: Created file HelAmps_heft.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/./Parameters_heft.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/./Parameters_heft.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/./Parameters_heft.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/./Parameters_heft.cc INFO: Created files Parameters_heft.h and Parameters_heft.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/SubProcesses/P1_gg_bbx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/SubProcesses/P1_gg_bbx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/README Run "open index.html" to see more information about this process. quit -real 0m2.141s -user 0m1.860s -sys 0m0.270s -Code generation completed in 2 seconds +real 0m6.533s +user 0m1.288s +sys 0m0.697s +Code generation completed in 7 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -215,7 +219,7 @@ Code generation completed in 2 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -223,10 +227,9 @@ Code generation completed in 2 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -245,7 +248,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -253,10 +256,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_heft_gg_bb/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/heft_gg_bb.mad/Cards/me5_configuration.txt b/epochX/cudacpp/heft_gg_bb.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/heft_gg_bb.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/heft_gg_bb.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/heft_gg_bb.mad/Cards/proc_card_mg5.dat index 92581deeee..5cc845819b 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/heft_gg_bb.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card.dat b/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card.dat index 8af20dc4e4..3802880982 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card.dat +++ b/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card_default.dat b/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card_default.dat index 0815703ee4..6917ce597f 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/heft_gg_bb.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/heft_gg_bb.mad/MGMEVersion.txt b/epochX/cudacpp/heft_gg_bb.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/MGMEVersion.txt +++ b/epochX/cudacpp/heft_gg_bb.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/heft_gg_bb.mad/Source/alfas_functions.f b/epochX/cudacpp/heft_gg_bb.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/heft_gg_bb.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/heft_gg_bb.mad/Source/cuts.inc b/epochX/cudacpp/heft_gg_bb.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Source/cuts.inc +++ b/epochX/cudacpp/heft_gg_bb.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/heft_gg_bb.mad/Source/make_opts b/epochX/cudacpp/heft_gg_bb.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Source/make_opts +++ b/epochX/cudacpp/heft_gg_bb.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/heft_gg_bb.mad/Source/makefile b/epochX/cudacpp/heft_gg_bb.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Source/makefile +++ b/epochX/cudacpp/heft_gg_bb.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/heft_gg_bb.mad/Source/run_card.inc b/epochX/cudacpp/heft_gg_bb.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/Source/run_card.inc +++ b/epochX/cudacpp/heft_gg_bb.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/Bridge.h b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryBuffers.h index 90075da66e..429fac84eb 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_heft.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.cc b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.cc index 5d6a4e1f06..12a95b6dbc 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.cc +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -335,8 +399,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFS2_0( w_fp[3], w_fp[2], w_fp[4], COUPs[ndcoup + 0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 2. * amp_sv[0]; @@ -348,8 +415,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[2], w_fp[4], COUPs[2], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -362,8 +432,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[3], w_fp[4], w_fp[1], COUPs[2], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -375,8 +448,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[4], w_fp[2], w_fp[1], COUPs[2], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -569,7 +645,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -938,9 +1016,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -948,7 +1023,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -973,11 +1047,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -990,17 +1065,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1115,38 +1180,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1319,11 +1353,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.h b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.h index 30c5663297..ecaebc93d2 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.h +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig.f b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig.f index 0b39d55964..f6c184008c 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig.f +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig1.f b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig1.f index c57e06d578..ff3bb04846 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig1.f +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/matrix1.f b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/matrix1.f index 598338d03e..ac4f9e7a76 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/matrix1.f +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -307,7 +307,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -350,7 +350,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -393,14 +394,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 3) /5.333333333333333D+00, - $ -6.666666666666666D-01,2.000000000000000D+00/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 3) /16,-4,12/ C 1 T(1,2,3,4) - DATA (CF(I, 2),I= 1, 3) /-6.666666666666666D-01 - $ ,5.333333333333333D+00,2.000000000000000D+00/ + DATA (CF(I),I= 4, 5) /16,12/ C 1 T(2,1,3,4) - DATA (CF(I, 3),I= 1, 3) /2.000000000000000D+00 - $ ,2.000000000000000D+00,6.000000000000000D+00/ + DATA (CF(I),I= 6, 6) /18/ C 1 T(3,4) Tr(1,2) C ---------- C BEGIN CODE @@ -455,10 +454,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -467,6 +468,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/cuts.f b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/genps.f b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/myamp.f b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/banner.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/banner.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/check_param_card.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/file_writers.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/files.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/files.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/histograms.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/restore_data b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/restore_data +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/sum_html.py b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/heft_gg_bb.mad/bin/madevent b/epochX/cudacpp/heft_gg_bb.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/heft_gg_bb.mad/bin/madevent +++ b/epochX/cudacpp/heft_gg_bb.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/heft_gg_bb.mad/src/HelAmps_heft.h b/epochX/cudacpp/heft_gg_bb.mad/src/HelAmps_heft.h index 1b04401547..592d4983b9 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/src/HelAmps_heft.h +++ b/epochX/cudacpp/heft_gg_bb.mad/src/HelAmps_heft.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.cc b/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.cc index 0fa5a34cf0..24b36c694b 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.cc +++ b/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.h b/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.h index 0faa7bb71e..f95cc7b9a7 100644 --- a/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.h +++ b/epochX/cudacpp/heft_gg_bb.mad/src/Parameters_heft.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.sa/CODEGEN_cudacpp_heft_gg_bb_log.txt b/epochX/cudacpp/heft_gg_bb.sa/CODEGEN_cudacpp_heft_gg_bb_log.txt index 04039fcd14..ae8ff60bc5 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/CODEGEN_cudacpp_heft_gg_bb_log.txt +++ b/epochX/cudacpp/heft_gg_bb.sa/CODEGEN_cudacpp_heft_gg_bb_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,18 +49,23 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 set zerowidth_tchannel F set auto_convert_model T save options auto_convert_model -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt import model heft +INFO: reload from .py file +INFO: load particles +INFO: load vertices +WARNING: coupling GC_13=-(complex(0,1)*GH) has direct dependence in aS but has QCD order set to 0. Automatic computation of scale uncertainty can be wrong for such model.  +WARNING: coupling GC_16=(complex(0,1)*Gphi)/8. has direct dependence in aS but has QCD order set to 0. Automatic computation of scale uncertainty can be wrong for such model.  +DEBUG: model prefixing takes 0.0024192333221435547  INFO: Restrict model heft with file models/heft/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: s u w+ at order: QED=1  @@ -123,13 +131,13 @@ Defined multiparticle all = g u c d s u~ c~ d~ s~ a ve vm vt e- mu- ve~ vm~ vt~ generate g g > b b~ HIW<=1 INFO: Trying process: g g > b b~ HIG<=1 HIW<=1 @1 INFO: Process has 4 diagrams -1 processes with 4 diagrams generated in 0.006 s +1 processes with 4 diagrams generated in 0.003 s Total: 1 processes with 4 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_heft_gg_bb Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > b b~ HIG<=1 HIW<=1 @1 INFO: Processing color information for process: g g > b b~ HIG<=1 HIW<=1 @1 @@ -138,34 +146,34 @@ INFO: Processing color information for process: g g > b b~ HIG<=1 HIW<=1 @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx/. -Generated helas calls for 1 subprocesses (4 diagrams) in 0.008 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/SubProcesses/P1_Sigma_heft_gg_bbx/. +Generated helas calls for 1 subprocesses (4 diagrams) in 0.005 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVS3 routines ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFS2 routines -ALOHA: aloha creates 4 routines in 0.261 s +ALOHA: aloha creates 4 routines in 0.110 s VVS3 VVV1 FFV1 FFV1 FFV1 FFS2 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/./HelAmps_heft.h -INFO: Created file HelAmps_heft.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/./HelAmps_heft.h +INFO: Created file HelAmps_heft.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/./Parameters_heft.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/./Parameters_heft.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/./Parameters_heft.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/./Parameters_heft.cc INFO: Created files Parameters_heft.h and Parameters_heft.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_heft_gg_bb/src/. quit -real 0m0.646s -user 0m0.583s -sys 0m0.051s -Code generation completed in 1 seconds +real 0m1.358s +user 0m0.407s +sys 0m0.114s +Code generation completed in 2 seconds diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/Bridge.h b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryBuffers.h index 90075da66e..429fac84eb 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_heft.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.cc b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.cc index b9f394434a..d59514bed4 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.cc +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -565,7 +629,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -934,9 +1000,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -944,7 +1007,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -969,11 +1031,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -986,17 +1049,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1111,38 +1164,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1315,11 +1337,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.h b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.h index 30c5663297..ecaebc93d2 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.h +++ b/epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.sa/src/HelAmps_heft.h b/epochX/cudacpp/heft_gg_bb.sa/src/HelAmps_heft.h index 1b04401547..592d4983b9 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/src/HelAmps_heft.h +++ b/epochX/cudacpp/heft_gg_bb.sa/src/HelAmps_heft.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.cc b/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.cc index 0fa5a34cf0..24b36c694b 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.cc +++ b/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.h b/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.h index 0faa7bb71e..f95cc7b9a7 100644 --- a/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.h +++ b/epochX/cudacpp/heft_gg_bb.sa/src/Parameters_heft.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/CODEGEN_mad_nobm_pp_ttW_log.txt b/epochX/cudacpp/nobm_pp_ttW.mad/CODEGEN_mad_nobm_pp_ttW_log.txt index 11380fe474..63bec4118a 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/CODEGEN_mad_nobm_pp_ttW_log.txt +++ b/epochX/cudacpp/nobm_pp_ttW.mad/CODEGEN_mad_nobm_pp_ttW_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -57,7 +59,7 @@ set zerowidth_tchannel F import model sm-no_b_mass INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.006017446517944336  +DEBUG: model prefixing takes 0.0018105506896972656  INFO: Restrict model sm-no_b_mass with file models/sm/restrict_no_b_mass.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -181,7 +183,7 @@ INFO: Process u~ d > t t~ w- added to mirror process d u~ > t t~ w- INFO: Process c~ s > t t~ w- added to mirror process s c~ > t t~ w- INFO: Process d~ u > t t~ w+ added to mirror process u d~ > t t~ w+ INFO: Process s~ c > t t~ w+ added to mirror process c s~ > t t~ w+ -4 processes with 8 diagrams generated in 0.107 s +4 processes with 8 diagrams generated in 0.058 s Total: 4 processes with 8 diagrams add process p p > t t~ w j @1 INFO: Checking for minimal orders which gives processes. @@ -223,21 +225,21 @@ INFO: Process d~ g > t t~ w+ u~ added to mirror process g d~ > t t~ w+ u~ INFO: Process d~ u > t t~ w+ g added to mirror process u d~ > t t~ w+ g INFO: Process s~ g > t t~ w+ c~ added to mirror process g s~ > t t~ w+ c~ INFO: Process s~ c > t t~ w+ g added to mirror process c s~ > t t~ w+ g -12 processes with 144 diagrams generated in 0.640 s +12 processes with 144 diagrams generated in 0.270 s Total: 16 processes with 152 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_nobm_pp_ttW --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_nobm_pp_ttW INFO: remove old information in CODEGEN_mad_nobm_pp_ttW DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g u > t t~ w+ d WEIGHTED<=5 @1 INFO: Processing color information for process: g u > t t~ w+ d @1 @@ -271,9 +273,9 @@ FileWriter t t~ w+ d WEIGHTED<=5 @1 INFO: Finding symmetric diagrams for subprocess group gu_ttxwpd -DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gd_ttxwmu DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -282,9 +284,9 @@ FileWriter t t~ w- u WEIGHTED<=5 @1 INFO: Finding symmetric diagrams for subprocess group gd_ttxwmu -DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gux_ttxwmdx DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -293,9 +295,9 @@ FileWriter t t~ w- d~ WEIGHTED<=5 @1 INFO: Finding symmetric diagrams for subprocess group gux_ttxwmdx -DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gdx_ttxwpux DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -304,9 +306,9 @@ FileWriter t t~ w+ u~ WEIGHTED<=5 @1 INFO: Finding symmetric diagrams for subprocess group gdx_ttxwpux -DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1563]  INFO: Creating files in directory P1_udx_ttxwpg DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -315,9 +317,9 @@ FileWriter t t~ w+ g WEIGHTED<=5 @1 INFO: Finding symmetric diagrams for subprocess group udx_ttxwpg -DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1563]  INFO: Creating files in directory P1_dux_ttxwmg DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -326,9 +328,9 @@ FileWriter t t~ w- g WEIGHTED<=5 @1 INFO: Finding symmetric diagrams for subprocess group dux_ttxwmg -DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  12 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12} [model_handling.py at line 1563]  INFO: Creating files in directory P0_udx_ttxwp DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -337,9 +339,9 @@ FileWriter t t~ w+ WEIGHTED<=4 INFO: Finding symmetric diagrams for subprocess group udx_ttxwp -DEBUG: len(subproc_diagrams_for_config) =  2 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  2 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2} [model_handling.py at line 1563]  INFO: Creating files in directory P0_dux_ttxwm DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -348,21 +350,21 @@ FileWriter t t~ w- WEIGHTED<=4 INFO: Finding symmetric diagrams for subprocess group dux_ttxwm -DEBUG: len(subproc_diagrams_for_config) =  2 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2} [model_handling.py at line 1552]  -Generated helas calls for 8 subprocesses (76 diagrams) in 0.202 s -Wrote files for 212 helas calls in 0.830 s +DEBUG: len(subproc_diagrams_for_config) =  2 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2} [model_handling.py at line 1563]  +Generated helas calls for 8 subprocesses (76 diagrams) in 0.098 s +Wrote files for 212 helas calls in 10.449 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFV2 routines ALOHA: aloha creates VVV1 set of routines with options: P0 -ALOHA: aloha creates 3 routines in 0.204 s +ALOHA: aloha creates 3 routines in 0.097 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates FFV1 routines ALOHA: aloha creates FFV2 routines ALOHA: aloha creates VVV1 set of routines with options: P0 -ALOHA: aloha creates 6 routines in 0.200 s +ALOHA: aloha creates 6 routines in 0.088 s FFV1 FFV1 FFV1 @@ -370,74 +372,76 @@ ALOHA: aloha creates 6 routines in 0.200 s FFV2 FFV2 VVV1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/./HelAmps_sm_no_b_mass.h -INFO: Created file HelAmps_sm_no_b_mass.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/./HelAmps_sm_no_b_mass.h +INFO: Created file HelAmps_sm_no_b_mass.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/./Parameters_sm_no_b_mass.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/./Parameters_sm_no_b_mass.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/./Parameters_sm_no_b_mass.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/./Parameters_sm_no_b_mass.cc INFO: Created files Parameters_sm_no_b_mass.h and Parameters_sm_no_b_mass.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P0_dux_ttxwm; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P0_dux_ttxwm; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 268 (offset 41 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P0_udx_ttxwp; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P0_udx_ttxwp; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 268 (offset 41 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_dux_ttxwmg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_dux_ttxwmg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 316 (offset 89 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gd_ttxwmu; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gd_ttxwmu; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 316 (offset 89 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gdx_ttxwpux; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gdx_ttxwpux; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 316 (offset 89 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gu_ttxwpd; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gu_ttxwpd; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 316 (offset 89 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gux_ttxwmdx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_gux_ttxwmdx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 316 (offset 89 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_udx_ttxwpg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/SubProcesses/P1_udx_ttxwpg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 72 (offset 1 line). Hunk #2 succeeded at 316 (offset 89 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/README Run "open index.html" to see more information about this process. quit -real 0m4.658s -user 0m4.105s -sys 0m0.537s -Code generation completed in 5 seconds +real 0m17.259s +user 0m2.677s +sys 0m1.431s +Code generation completed in 18 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -450,7 +454,7 @@ Code generation completed in 5 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -458,10 +462,9 @@ Code generation completed in 5 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -480,7 +483,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -488,10 +491,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_nobm_pp_ttW/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/me5_configuration.txt b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/proc_card_mg5.dat index 72b31976a0..fd4a094f1f 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card.dat b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card.dat index 5eca3e3f2b..48beb899d9 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card.dat +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card.dat @@ -127,6 +127,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card_default.dat b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card_default.dat index 3b445d02a0..c22a9e0249 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Cards/run_card_default.dat @@ -127,6 +127,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/MGMEVersion.txt b/epochX/cudacpp/nobm_pp_ttW.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/MGMEVersion.txt +++ b/epochX/cudacpp/nobm_pp_ttW.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Source/alfas_functions.f b/epochX/cudacpp/nobm_pp_ttW.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Source/cuts.inc b/epochX/cudacpp/nobm_pp_ttW.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Source/cuts.inc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Source/make_opts b/epochX/cudacpp/nobm_pp_ttW.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Source/make_opts +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Source/makefile b/epochX/cudacpp/nobm_pp_ttW.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Source/makefile +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/Source/run_card.inc b/epochX/cudacpp/nobm_pp_ttW.mad/Source/run_card.inc index 2588190439..e169c1f193 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/Source/run_card.inc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/Bridge.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryBuffers.h index 1e7cc050f7..7c6daa1dbb 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm_no_b_mass.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.cc index 97050f0aa2..34562bc93a 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -339,8 +403,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -353,8 +420,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[0], w_fp[5], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -579,7 +649,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -950,9 +1022,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -960,7 +1029,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -985,11 +1053,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1002,17 +1071,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1127,38 +1186,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1331,11 +1359,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.h index 9d6c262053..f581e4e5eb 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig.f index 7f7324dc0b..dde4a1e826 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig1.f index 08dd1f728a..36ac113779 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,7 +138,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) S1=PDG2PDF(LPP(IB(1)),3, IB(1),XBK(IB(1)), QSCALE) @@ -146,7 +146,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) UX2=PDG2PDF(LPP(IB(2)),-2, IB(2),XBK(IB(2)), QSCALE) @@ -225,7 +225,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -297,6 +297,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -380,16 +384,16 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/matrix1.f index 5c47e1c729..74552b2a97 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -355,7 +355,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -399,7 +399,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(1) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -444,11 +445,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /9.000000000000000D+00 - $ ,3.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 2) /9,6/ C 1 T(2,1) T(3,4) - DATA (CF(I, 2),I= 1, 2) /3.000000000000000D+00 - $ ,9.000000000000000D+00/ + DATA (CF(I),I= 3, 3) /9/ C 1 T(2,4) T(3,1) C ---------- C BEGIN CODE @@ -497,10 +497,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -509,6 +511,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.cc index 57246ba1e7..254db04176 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -339,8 +403,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -353,8 +420,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[0], w_fp[5], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -579,7 +649,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -950,9 +1022,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -960,7 +1029,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -985,11 +1053,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1002,17 +1071,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1127,38 +1186,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1331,11 +1359,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.h index cd8edd3e39..39f3958078 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig.f index 2e439af0a3..86d348b359 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig1.f index 0808ce67ce..d419649d81 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,7 +138,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) C1=PDG2PDF(LPP(IB(1)),4, IB(1),XBK(IB(1)), QSCALE) @@ -146,7 +146,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) DX2=PDG2PDF(LPP(IB(2)),-1, IB(2),XBK(IB(2)), QSCALE) @@ -225,7 +225,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -297,6 +297,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -380,16 +384,16 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/matrix1.f index bbf708250a..39364c11fc 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -355,7 +355,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -399,7 +399,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(1) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -444,11 +445,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /9.000000000000000D+00 - $ ,3.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 2) /9,6/ C 1 T(2,1) T(3,4) - DATA (CF(I, 2),I= 1, 2) /3.000000000000000D+00 - $ ,9.000000000000000D+00/ + DATA (CF(I),I= 3, 3) /9/ C 1 T(2,4) T(3,1) C ---------- C BEGIN CODE @@ -497,10 +497,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -509,6 +511,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.cc index 3261780672..a3ffec653a 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -342,8 +406,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[8], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[6], w_fp[8], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -372,8 +442,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -386,8 +459,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[0], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -401,8 +477,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[1], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -415,8 +494,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[0], w_fp[8], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -429,8 +511,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[9], w_fp[3], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -443,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[0], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -457,8 +545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -471,8 +562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -485,8 +579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[0], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -499,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[0], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -775,7 +875,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1148,9 +1250,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1158,7 +1257,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1183,11 +1281,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1200,17 +1299,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1325,38 +1414,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1529,11 +1587,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.h index ecb184f729..b11badb4c3 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig.f index 26d6979a1d..569e58058f 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig1.f index 330b566ed8..1806e31d33 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,7 +138,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) S1=PDG2PDF(LPP(IB(1)),3, IB(1),XBK(IB(1)), QSCALE) @@ -146,7 +146,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) UX2=PDG2PDF(LPP(IB(2)),-2, IB(2),XBK(IB(2)), QSCALE) @@ -225,7 +225,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -297,6 +297,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -380,16 +384,16 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix1.f index 4b8ccfcacb..43e8b313bf 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -403,7 +403,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -447,7 +447,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(7) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -492,21 +493,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(2,1) T(6,3,4) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(2,4) T(6,3,1) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(3,1) T(6,2,4) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(3,4) T(6,2,1) C ---------- C BEGIN CODE @@ -601,10 +595,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -613,6 +609,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.cc index c933a8f276..72756b605b 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -342,8 +406,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[8], w_fp[5], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[6], w_fp[8], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -372,8 +442,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[9], w_fp[5], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -386,8 +459,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[1], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -401,8 +477,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[5], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -415,8 +494,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[1], w_fp[8], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -429,8 +511,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[9], w_fp[3], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -443,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[1], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -457,8 +545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[5], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -471,8 +562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[9], w_fp[5], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -485,8 +579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[1], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -499,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[1], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -775,7 +875,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1148,9 +1250,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1158,7 +1257,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1183,11 +1281,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1200,17 +1299,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1325,38 +1414,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1529,11 +1587,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.h index a5c44d3213..2a73af4b9a 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig.f index 3779397ce4..225a391d4c 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig1.f index 1dae307565..e0f47e9c3d 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,14 +138,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF D2=PDG2PDF(LPP(IB(2)),1, IB(2),XBK(IB(2)), QSCALE) S2=PDG2PDF(LPP(IB(2)),3, IB(2),XBK(IB(2)), QSCALE) @@ -224,7 +224,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -296,6 +296,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -379,14 +383,14 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) D2(IVEC)=PDG2PDF(LPP(IB(2)),1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) S2(IVEC)=PDG2PDF(LPP(IB(2)),3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix1.f index a3a57cd8b8..552a0ed42d 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -403,7 +403,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -447,7 +447,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(7) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -492,21 +493,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,3,2) T(6,4) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,3,4) T(6,2) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,6,2) T(3,4) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,6,4) T(3,2) C ---------- C BEGIN CODE @@ -601,10 +595,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -613,6 +609,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.cc index 6f1f37d1eb..6f30a06d82 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -342,8 +406,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[8], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[6], w_fp[8], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -372,8 +442,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -386,8 +459,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[5], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -401,8 +477,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[1], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 6. * amp_sv[0]; @@ -415,8 +494,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[5], w_fp[8], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 6. * amp_sv[0]; @@ -429,8 +511,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[9], w_fp[3], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -443,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[5], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -457,8 +545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -471,8 +562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -485,8 +579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[5], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -499,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[5], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -775,7 +875,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1148,9 +1250,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1158,7 +1257,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1183,11 +1281,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1200,17 +1299,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1325,38 +1414,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1529,11 +1587,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.h index d0dd16c512..e7439324b3 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig.f index 7c1bbde100..809dbb2ab2 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig1.f index ece4509a8c..239f34eb31 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,14 +138,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) DX2=PDG2PDF(LPP(IB(2)),-1, IB(2),XBK(IB(2)), QSCALE) @@ -224,7 +224,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -296,6 +296,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -379,14 +383,14 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix1.f index e550640e16..ace70306d3 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -403,7 +403,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -447,7 +447,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(7) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -492,21 +493,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,2,4) T(3,6) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,2,6) T(3,4) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,3,4) T(2,6) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,3,6) T(2,4) C ---------- C BEGIN CODE @@ -601,10 +595,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -613,6 +609,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.cc index 16d1e89a53..867acb3b75 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -342,8 +406,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[8], w_fp[5], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[6], w_fp[8], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -372,8 +442,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[9], w_fp[5], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -386,8 +459,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[1], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -401,8 +477,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[5], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -415,8 +494,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[1], w_fp[8], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -429,8 +511,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[9], w_fp[3], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -443,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[1], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -457,8 +545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[5], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -471,8 +562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[9], w_fp[5], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -485,8 +579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[1], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -499,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[1], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -775,7 +875,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1148,9 +1250,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1158,7 +1257,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1183,11 +1281,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1200,17 +1299,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1325,38 +1414,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1529,11 +1587,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.h index f799f32129..5ca4976990 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig.f index e5ddbf348a..78747ee297 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig1.f index 4ebece2e78..dd8d63263e 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,14 +138,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF U2=PDG2PDF(LPP(IB(2)),2, IB(2),XBK(IB(2)), QSCALE) C2=PDG2PDF(LPP(IB(2)),4, IB(2),XBK(IB(2)), QSCALE) @@ -224,7 +224,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -296,6 +296,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -379,14 +383,14 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) U2(IVEC)=PDG2PDF(LPP(IB(2)),2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) C2(IVEC)=PDG2PDF(LPP(IB(2)),4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix1.f index 738301d049..c2e8c2975c 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -403,7 +403,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -447,7 +447,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(7) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -492,21 +493,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,3,2) T(6,4) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,3,4) T(6,2) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,6,2) T(3,4) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,6,4) T(3,2) C ---------- C BEGIN CODE @@ -601,10 +595,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -613,6 +609,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.cc index 41a6e0002f..2d8e1ce247 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -342,8 +406,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[8], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[6], w_fp[8], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -372,8 +442,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -386,8 +459,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[5], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -401,8 +477,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[1], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 6. * amp_sv[0]; @@ -415,8 +494,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[5], w_fp[8], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 6. * amp_sv[0]; @@ -429,8 +511,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[9], w_fp[3], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -443,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[5], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -457,8 +545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -471,8 +562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -485,8 +579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[5], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -499,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[5], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -775,7 +875,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1148,9 +1250,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1158,7 +1257,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1183,11 +1281,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1200,17 +1299,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1325,38 +1414,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1529,11 +1587,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.h index b6253b6715..c851104598 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig.f index 8e03eed7eb..8f328acf0e 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig1.f index 9d0ddcecfc..977cc5a608 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,14 +138,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) UX2=PDG2PDF(LPP(IB(2)),-2, IB(2),XBK(IB(2)), QSCALE) @@ -224,7 +224,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -296,6 +296,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -379,14 +383,14 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix1.f index 6b3ff14d2d..b0004829e9 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -403,7 +403,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -447,7 +447,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(7) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -492,21 +493,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,2,4) T(3,6) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,2,6) T(3,4) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,3,4) T(2,6) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,3,6) T(2,4) C ---------- C BEGIN CODE @@ -601,10 +595,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -613,6 +609,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.cc b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.cc index f90db593a9..522e8ee68a 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -97,6 +98,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -306,7 +370,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -316,7 +380,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -342,8 +406,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[8], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[6], w_fp[8], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -372,8 +442,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -386,8 +459,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[0], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -401,8 +477,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[1], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -415,8 +494,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[0], w_fp[8], w_fp[3], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -429,8 +511,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[9], w_fp[3], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -443,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[0], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -457,8 +545,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[1], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -471,8 +562,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[9], w_fp[1], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -485,8 +579,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[0], w_fp[8], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -499,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[0], w_fp[10], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -775,7 +875,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1148,9 +1250,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1158,7 +1257,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1183,11 +1281,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1200,17 +1299,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1325,38 +1414,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1529,11 +1587,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.h index b4a0ccb74d..50adc138aa 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig.f index 7e750641c8..dd792566df 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig1.f index 28ad0eed08..6813f38791 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -138,7 +138,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) C1=PDG2PDF(LPP(IB(1)),4, IB(1),XBK(IB(1)), QSCALE) @@ -146,7 +146,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) DX2=PDG2PDF(LPP(IB(2)),-1, IB(2),XBK(IB(2)), QSCALE) @@ -225,7 +225,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -297,6 +297,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -380,16 +384,16 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix1.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix1.f index 536bec2827..64c618703b 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix1.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -403,7 +403,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -447,7 +447,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(7) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -492,21 +493,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(2,1) T(6,3,4) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(2,4) T(6,3,1) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(3,1) T(6,2,4) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(3,4) T(6,2,1) C ---------- C BEGIN CODE @@ -601,10 +595,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -613,6 +609,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/cuts.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/genps.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/myamp.f b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/banner.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/banner.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/check_param_card.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/file_writers.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/files.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/files.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/histograms.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/restore_data b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/restore_data +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/sum_html.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/bin/madevent b/epochX/cudacpp/nobm_pp_ttW.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/nobm_pp_ttW.mad/bin/madevent +++ b/epochX/cudacpp/nobm_pp_ttW.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/src/HelAmps_sm_no_b_mass.h b/epochX/cudacpp/nobm_pp_ttW.mad/src/HelAmps_sm_no_b_mass.h index 850b86e0e6..1f55e37f1d 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/src/HelAmps_sm_no_b_mass.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/src/HelAmps_sm_no_b_mass.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.cc b/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.cc index d799b19eeb..6dd54b6b99 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.cc +++ b/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.h b/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.h index e448052141..8e97b4ea6f 100644 --- a/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.h +++ b/epochX/cudacpp/nobm_pp_ttW.mad/src/Parameters_sm_no_b_mass.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/CODEGEN_mad_pp_tt012j_log.txt b/epochX/cudacpp/pp_tt012j.mad/CODEGEN_mad_pp_tt012j_log.txt index 0a0d056033..c07758c8fc 100644 --- a/epochX/cudacpp/pp_tt012j.mad/CODEGEN_mad_pp_tt012j_log.txt +++ b/epochX/cudacpp/pp_tt012j.mad/CODEGEN_mad_pp_tt012j_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -57,7 +59,7 @@ set zerowidth_tchannel F define j = p INFO: load particles INFO: load vertices -DEBUG: model prefixing takes 0.0064830780029296875  +DEBUG: model prefixing takes 0.0018301010131835938  INFO: Restrict model sm with file models/sm/restrict_default.dat . DEBUG: Simplifying conditional expressions  DEBUG: remove interactions: u s w+ at order: QED=1  @@ -168,7 +170,7 @@ INFO: Process u~ u > t t~ added to mirror process u u~ > t t~ INFO: Process c~ c > t t~ added to mirror process c c~ > t t~ INFO: Process d~ d > t t~ added to mirror process d d~ > t t~ INFO: Process s~ s > t t~ added to mirror process s s~ > t t~ -5 processes with 7 diagrams generated in 0.030 s +5 processes with 7 diagrams generated in 0.037 s Total: 5 processes with 7 diagrams add process p p > t t~ j @1 INFO: Checking for minimal orders which gives processes. @@ -208,7 +210,7 @@ INFO: Process d~ g > t t~ d~ added to mirror process g d~ > t t~ d~ INFO: Process d~ d > t t~ g added to mirror process d d~ > t t~ g INFO: Process s~ g > t t~ s~ added to mirror process g s~ > t t~ s~ INFO: Process s~ s > t t~ g added to mirror process s s~ > t t~ g -13 processes with 76 diagrams generated in 0.135 s +13 processes with 76 diagrams generated in 0.090 s Total: 18 processes with 83 diagrams add process p p > t t~ j j @2 INFO: Checking for minimal orders which gives processes. @@ -374,21 +376,21 @@ INFO: Process s~ u~ > t t~ u~ s~ added to mirror process u~ s~ > t t~ u~ s~ INFO: Process s~ c~ > t t~ c~ s~ added to mirror process c~ s~ > t t~ c~ s~ INFO: Process s~ d~ > t t~ d~ s~ added to mirror process d~ s~ > t t~ d~ s~ INFO: Crossed process found for s~ s~ > t t~ s~ s~, reuse diagrams. -65 processes with 1119 diagrams generated in 1.933 s +65 processes with 1119 diagrams generated in 0.801 s Total: 83 processes with 1202 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_pp_tt012j --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_pp_tt012j INFO: remove old information in CODEGEN_mad_pp_tt012j DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ g g WEIGHTED<=4 @2 INFO: Processing color information for process: g g > t t~ g g @2 @@ -499,9 +501,9 @@ FileWriter t t~ g g WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group gg_ttxgg -DEBUG: len(subproc_diagrams_for_config) =  105 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 30: 31, 31: 33, 32: 34, 33: 35, 34: 36, 35: 37, 36: 38, 37: 39, 38: 40, 39: 41, 40: 42, 41: 43, 42: 44, 43: 45, 44: 46, 45: 47, 46: 49, 47: 50, 48: 51, 49: 52, 50: 53, 51: 54, 52: 55, 53: 56, 54: 57, 55: 59, 56: 60, 57: 61, 58: 62, 59: 63, 60: 64, 61: 65, 62: 66, 63: 67, 64: 68, 65: 69, 66: 70, 67: 71, 68: 72, 69: 73, 70: 75, 71: 76, 72: 77, 73: 78, 74: 79, 75: 80, 76: 81, 77: 82, 78: 83, 79: 84, 80: 85, 81: 86, 82: 87, 83: 88, 84: 89, 85: 90, 86: 91, 87: 92, 88: 94, 89: 95, 90: 96, 91: 97, 92: 98, 93: 99, 94: 101, 95: 102, 96: 103, 97: 104, 98: 105, 99: 106, 100: 108, 101: 109, 102: 110, 103: 111, 104: 112, 105: 113} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 29, 31: 30, 33: 31, 34: 32, 35: 33, 36: 34, 37: 35, 38: 36, 39: 37, 40: 38, 41: 39, 42: 40, 43: 41, 44: 42, 45: 43, 46: 44, 47: 45, 49: 46, 50: 47, 51: 48, 52: 49, 53: 50, 54: 51, 55: 52, 56: 53, 57: 54, 59: 55, 60: 56, 61: 57, 62: 58, 63: 59, 64: 60, 65: 61, 66: 62, 67: 63, 68: 64, 69: 65, 70: 66, 71: 67, 72: 68, 73: 69, 75: 70, 76: 71, 77: 72, 78: 73, 79: 74, 80: 75, 81: 76, 82: 77, 83: 78, 84: 79, 85: 80, 86: 81, 87: 82, 88: 83, 89: 84, 90: 85, 91: 86, 92: 87, 94: 88, 95: 89, 96: 90, 97: 91, 98: 92, 99: 93, 101: 94, 102: 95, 103: 96, 104: 97, 105: 98, 106: 99, 108: 100, 109: 101, 110: 102, 111: 103, 112: 104, 113: 105} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  105 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 30: 31, 31: 33, 32: 34, 33: 35, 34: 36, 35: 37, 36: 38, 37: 39, 38: 40, 39: 41, 40: 42, 41: 43, 42: 44, 43: 45, 44: 46, 45: 47, 46: 49, 47: 50, 48: 51, 49: 52, 50: 53, 51: 54, 52: 55, 53: 56, 54: 57, 55: 59, 56: 60, 57: 61, 58: 62, 59: 63, 60: 64, 61: 65, 62: 66, 63: 67, 64: 68, 65: 69, 66: 70, 67: 71, 68: 72, 69: 73, 70: 75, 71: 76, 72: 77, 73: 78, 74: 79, 75: 80, 76: 81, 77: 82, 78: 83, 79: 84, 80: 85, 81: 86, 82: 87, 83: 88, 84: 89, 85: 90, 86: 91, 87: 92, 88: 94, 89: 95, 90: 96, 91: 97, 92: 98, 93: 99, 94: 101, 95: 102, 96: 103, 97: 104, 98: 105, 99: 106, 100: 108, 101: 109, 102: 110, 103: 111, 104: 112, 105: 113} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 29, 31: 30, 33: 31, 34: 32, 35: 33, 36: 34, 37: 35, 38: 36, 39: 37, 40: 38, 41: 39, 42: 40, 43: 41, 44: 42, 45: 43, 46: 44, 47: 45, 49: 46, 50: 47, 51: 48, 52: 49, 53: 50, 54: 51, 55: 52, 56: 53, 57: 54, 59: 55, 60: 56, 61: 57, 62: 58, 63: 59, 64: 60, 65: 61, 66: 62, 67: 63, 68: 64, 69: 65, 70: 66, 71: 67, 72: 68, 73: 69, 75: 70, 76: 71, 77: 72, 78: 73, 79: 74, 80: 75, 81: 76, 82: 77, 83: 78, 84: 79, 85: 80, 86: 81, 87: 82, 88: 83, 89: 84, 90: 85, 91: 86, 92: 87, 94: 88, 95: 89, 96: 90, 97: 91, 98: 92, 99: 93, 101: 94, 102: 95, 103: 96, 104: 97, 105: 98, 106: 99, 108: 100, 109: 101, 110: 102, 111: 103, 112: 104, 113: 105} [model_handling.py at line 1563]  INFO: Creating files in directory P2_gg_ttxuux DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -510,9 +512,9 @@ FileWriter t t~ u u~ WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group gg_ttxuux -DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1563]  INFO: Creating files in directory P2_gu_ttxgu DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -521,9 +523,9 @@ FileWriter t t~ g u WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group gu_ttxgu -DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1563]  INFO: Creating files in directory P2_gux_ttxgux DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -532,9 +534,9 @@ FileWriter t t~ g u~ WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group gux_ttxgux -DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1563]  INFO: Creating files in directory P2_uux_ttxgg DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -543,9 +545,9 @@ FileWriter t t~ g g WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group uux_ttxgg -DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  35 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 35, 35: 36} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 35: 34, 36: 35} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gg_ttxg DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -554,9 +556,9 @@ FileWriter t t~ g WEIGHTED<=3 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttxg -DEBUG: len(subproc_diagrams_for_config) =  15 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  15 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15} [model_handling.py at line 1563]  INFO: Creating files in directory P2_uu_ttxuu DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -565,9 +567,9 @@ FileWriter t t~ u u WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group uu_ttxuu -DEBUG: len(subproc_diagrams_for_config) =  14 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  14 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1563]  INFO: Creating files in directory P2_uux_ttxuux DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -576,9 +578,9 @@ FileWriter t t~ u u~ WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group uux_ttxuux -DEBUG: len(subproc_diagrams_for_config) =  14 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  14 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1563]  INFO: Creating files in directory P2_uxux_ttxuxux DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -587,9 +589,9 @@ FileWriter t t~ u~ u~ WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group uxux_ttxuxux -DEBUG: len(subproc_diagrams_for_config) =  14 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  14 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14} [model_handling.py at line 1563]  INFO: Creating files in directory P2_uc_ttxuc DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -598,9 +600,9 @@ FileWriter t t~ u c WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group uc_ttxuc -DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1563]  INFO: Creating files in directory P2_uux_ttxccx DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -609,9 +611,9 @@ FileWriter t t~ c c~ WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group uux_ttxccx -DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1563]  INFO: Creating files in directory P2_ucx_ttxucx DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -620,9 +622,9 @@ FileWriter t t~ u c~ WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group ucx_ttxucx -DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1563]  INFO: Creating files in directory P2_uxcx_ttxuxcx DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -631,9 +633,9 @@ FileWriter t t~ u~ c~ WEIGHTED<=4 @2 INFO: Finding symmetric diagrams for subprocess group uxcx_ttxuxcx -DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  7 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gu_ttxu DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -642,9 +644,9 @@ FileWriter t t~ u WEIGHTED<=3 @1 INFO: Finding symmetric diagrams for subprocess group gu_ttxu -DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1563]  INFO: Creating files in directory P1_gux_ttxux DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -653,9 +655,9 @@ FileWriter t t~ u~ WEIGHTED<=3 @1 INFO: Finding symmetric diagrams for subprocess group gux_ttxux -DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1563]  INFO: Creating files in directory P1_uux_ttxg DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -664,9 +666,9 @@ FileWriter t t~ g WEIGHTED<=3 @1 INFO: Finding symmetric diagrams for subprocess group uux_ttxg -DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} [model_handling.py at line 1563]  INFO: Creating files in directory P0_gg_ttx DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -675,9 +677,9 @@ FileWriter t t~ WEIGHTED<=2 INFO: Finding symmetric diagrams for subprocess group gg_ttx -DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1563]  INFO: Creating files in directory P0_uux_ttx DEBUG: kwargs[prefix] = 0 [model_handling.py at line 1156]  INFO: Creating files in directory . @@ -686,25 +688,25 @@ FileWriter t t~ WEIGHTED<=2 INFO: Finding symmetric diagrams for subprocess group uux_ttx -DEBUG: len(subproc_diagrams_for_config) =  1 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1} [model_handling.py at line 1552]  -Generated helas calls for 18 subprocesses (372 diagrams) in 1.286 s -Wrote files for 810 helas calls in 2.762 s +DEBUG: len(subproc_diagrams_for_config) =  1 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1} [model_handling.py at line 1563]  +Generated helas calls for 18 subprocesses (372 diagrams) in 0.573 s +Wrote files for 810 helas calls in 28.386 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 5 routines in 0.340 s +ALOHA: aloha creates 5 routines in 0.178 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV3 routines ALOHA: aloha creates VVVV4 routines -ALOHA: aloha creates 10 routines in 0.315 s +ALOHA: aloha creates 10 routines in 0.151 s VVV1 VVV1 FFV1 @@ -717,120 +719,122 @@ ALOHA: aloha creates 10 routines in 0.315 s VVVV3 VVVV4 VVVV4 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/./HelAmps_sm.h -INFO: Created file HelAmps_sm.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/./HelAmps_sm.h +INFO: Created file HelAmps_sm.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/./Parameters_sm.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/./Parameters_sm.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/./Parameters_sm.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/./Parameters_sm.cc INFO: Created files Parameters_sm.h and Parameters_sm.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P0_gg_ttx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P0_gg_ttx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P0_uux_ttx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P0_uux_ttx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 230 (offset 3 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_gg_ttxg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_gg_ttxg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 243 (offset 16 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_gu_ttxu; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_gu_ttxu; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 246 (offset 19 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_gux_ttxux; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_gux_ttxux; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 246 (offset 19 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_uux_ttxg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P1_uux_ttxg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 246 (offset 19 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gg_ttxgg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gg_ttxgg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 275 (offset 48 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gg_ttxuux; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gg_ttxuux; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 278 (offset 51 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gu_ttxgu; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gu_ttxgu; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 278 (offset 51 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gux_ttxgux; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_gux_ttxgux; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 278 (offset 51 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uc_ttxuc; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uc_ttxuc; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 76 (offset 5 lines). Hunk #2 succeeded at 280 (offset 53 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_ucx_ttxucx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_ucx_ttxucx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 82 (offset 11 lines). Hunk #2 succeeded at 286 (offset 59 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uu_ttxuu; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uu_ttxuu; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 278 (offset 51 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uux_ttxccx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uux_ttxccx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 82 (offset 11 lines). Hunk #2 succeeded at 286 (offset 59 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uux_ttxgg; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uux_ttxgg; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 278 (offset 51 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uux_ttxuux; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uux_ttxuux; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 278 (offset 51 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uxcx_ttxuxcx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uxcx_ttxuxcx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 76 (offset 5 lines). Hunk #2 succeeded at 280 (offset 53 lines). -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uxux_ttxuxux; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/SubProcesses/P2_uxux_ttxuxux; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #1 succeeded at 74 (offset 3 lines). Hunk #2 succeeded at 278 (offset 51 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/README Run "open index.html" to see more information about this process. quit -real 0m11.258s -user 0m9.633s -sys 0m0.984s -Code generation completed in 12 seconds +real 0m38.393s +user 0m5.901s +sys 0m2.452s +Code generation completed in 40 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -843,7 +847,7 @@ Code generation completed in 12 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -851,10 +855,9 @@ Code generation completed in 12 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -873,7 +876,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -881,10 +884,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_pp_tt012j/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/pp_tt012j.mad/Cards/me5_configuration.txt b/epochX/cudacpp/pp_tt012j.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/pp_tt012j.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/pp_tt012j.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/pp_tt012j.mad/Cards/proc_card_mg5.dat index 33311e49bc..0191086c1d 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/pp_tt012j.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/pp_tt012j.mad/Cards/run_card.dat b/epochX/cudacpp/pp_tt012j.mad/Cards/run_card.dat index 5eb60f35df..fe9c38d826 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Cards/run_card.dat +++ b/epochX/cudacpp/pp_tt012j.mad/Cards/run_card.dat @@ -125,6 +125,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/pp_tt012j.mad/Cards/run_card_default.dat b/epochX/cudacpp/pp_tt012j.mad/Cards/run_card_default.dat index 38810a6b83..0185201786 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/pp_tt012j.mad/Cards/run_card_default.dat @@ -125,6 +125,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/pp_tt012j.mad/MGMEVersion.txt b/epochX/cudacpp/pp_tt012j.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/pp_tt012j.mad/MGMEVersion.txt +++ b/epochX/cudacpp/pp_tt012j.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/Source/alfas_functions.f b/epochX/cudacpp/pp_tt012j.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/pp_tt012j.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/pp_tt012j.mad/Source/cuts.inc b/epochX/cudacpp/pp_tt012j.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Source/cuts.inc +++ b/epochX/cudacpp/pp_tt012j.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/pp_tt012j.mad/Source/make_opts b/epochX/cudacpp/pp_tt012j.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Source/make_opts +++ b/epochX/cudacpp/pp_tt012j.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/pp_tt012j.mad/Source/makefile b/epochX/cudacpp/pp_tt012j.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Source/makefile +++ b/epochX/cudacpp/pp_tt012j.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/pp_tt012j.mad/Source/run_card.inc b/epochX/cudacpp/pp_tt012j.mad/Source/run_card.inc index 2588190439..e169c1f193 100644 --- a/epochX/cudacpp/pp_tt012j.mad/Source/run_card.inc +++ b/epochX/cudacpp/pp_tt012j.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/Bridge.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryBuffers.h index 65a101888d..17ba7a89e5 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_sm.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.cc index a17c5f1eef..dd239b0581 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -335,8 +399,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[2], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -349,8 +416,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[4], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -362,8 +432,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[4], w_fp[2], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -555,7 +628,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -923,9 +998,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -933,7 +1005,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -958,11 +1029,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -975,17 +1047,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1100,38 +1162,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1304,11 +1335,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.h index 2d89e0e244..167fe8f7a4 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig.f index 19278bca59..4b47d38060 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig1.f index 42cc7c9d61..9aac5584ec 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/matrix1.f index ca1785b808..fccc5a19c5 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -307,7 +307,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -350,7 +350,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -393,11 +394,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /5.333333333333333D+00, - $ -6.666666666666666D-01/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 2) /16,-4/ C 1 T(1,2,3,4) - DATA (CF(I, 2),I= 1, 2) /-6.666666666666666D-01 - $ ,5.333333333333333D+00/ + DATA (CF(I),I= 3, 3) /16/ C 1 T(2,1,3,4) C ---------- C BEGIN CODE @@ -446,10 +446,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -458,6 +460,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.cc index 0979455d7a..744204da44 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -338,8 +402,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[2], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -532,7 +599,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -900,9 +969,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -910,7 +976,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -935,11 +1000,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -952,17 +1018,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1077,38 +1133,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1281,11 +1306,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.h index d6fa3205c0..72dd5c9200 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig.f index 6558c40922..6a5d5f05e2 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig1.f index 86f844defe..71863d2954 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,7 +140,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -150,7 +150,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -237,7 +237,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -313,6 +313,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -398,24 +402,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/matrix1.f index ec88a303fa..ff93a66dbe 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -310,7 +310,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -356,7 +356,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -399,11 +400,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /9.000000000000000D+00 - $ ,3.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 2) /9,6/ C 1 T(2,1) T(3,4) - DATA (CF(I, 2),I= 1, 2) /3.000000000000000D+00 - $ ,9.000000000000000D+00/ + DATA (CF(I),I= 3, 3) /9/ C 1 T(2,4) T(3,1) C ---------- C BEGIN CODE @@ -444,10 +444,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -456,6 +458,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc index 5de1c626c8..cd559e5714 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -338,8 +402,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 VVV1_0( w_fp[5], w_fp[6], w_fp[4], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; jamp_sv[2] += amp_sv[0]; @@ -354,8 +421,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[7], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -368,8 +438,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[8], w_fp[2], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -383,8 +456,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[9], w_fp[5], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -396,8 +472,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[3], w_fp[5], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -410,8 +489,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[8], w_fp[5], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -424,8 +506,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[5], w_fp[11], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; @@ -437,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[5], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -451,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[5], w_fp[7], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; @@ -464,8 +555,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[3], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -478,8 +572,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[9], w_fp[2], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -492,8 +589,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 VVV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -508,8 +608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[8], w_fp[11], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; @@ -521,8 +624,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[9], w_fp[7], w_fp[0], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; @@ -534,8 +640,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[0], w_fp[10], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -774,7 +883,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1144,9 +1255,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1154,7 +1262,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1179,11 +1286,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1196,17 +1304,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1321,38 +1419,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1525,11 +1592,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h index 2acfa000a7..f052d1a725 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f index 10496aa04d..b25c70108f 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f index 7c8695090c..ef24864bf5 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix1.f index 797b19405d..c0a032fb9f 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -323,7 +323,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -366,7 +366,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(9) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -409,33 +410,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /7.111111111111111D+00, - $ -8.888888888888888D-01,-8.888888888888888D-01 - $ ,1.111111111111111D-01,1.111111111111111D-01,1.111111111111111D - $ +00/ + DATA DENOM/9/ + DATA (CF(I),I= 1, 6) /64,-16,-16,2,2,20/ C 1 T(1,2,5,3,4) - DATA (CF(I, 2),I= 1, 6) /-8.888888888888888D-01 - $ ,7.111111111111111D+00,1.111111111111111D-01,1.111111111111111D - $ +00,-8.888888888888888D-01,1.111111111111111D-01/ + DATA (CF(I),I= 7, 11) /64,2,20,-16,2/ C 1 T(1,5,2,3,4) - DATA (CF(I, 3),I= 1, 6) /-8.888888888888888D-01 - $ ,1.111111111111111D-01,7.111111111111111D+00, - $ -8.888888888888888D-01,1.111111111111111D+00,1.111111111111111D - $ -01/ + DATA (CF(I),I= 12, 15) /64,-16,20,2/ C 1 T(2,1,5,3,4) - DATA (CF(I, 4),I= 1, 6) /1.111111111111111D-01 - $ ,1.111111111111111D+00,-8.888888888888888D-01 - $ ,7.111111111111111D+00,1.111111111111111D-01, - $ -8.888888888888888D-01/ + DATA (CF(I),I= 16, 18) /64,2,-16/ C 1 T(2,5,1,3,4) - DATA (CF(I, 5),I= 1, 6) /1.111111111111111D-01, - $ -8.888888888888888D-01,1.111111111111111D+00,1.111111111111111D - $ -01,7.111111111111111D+00,-8.888888888888888D-01/ + DATA (CF(I),I= 19, 20) /64,-16/ C 1 T(5,1,2,3,4) - DATA (CF(I, 6),I= 1, 6) /1.111111111111111D+00 - $ ,1.111111111111111D-01,1.111111111111111D-01, - $ -8.888888888888888D-01,-8.888888888888888D-01 - $ ,7.111111111111111D+00/ + DATA (CF(I),I= 21, 21) /64/ C 1 T(5,2,1,3,4) C ---------- C BEGIN CODE @@ -549,10 +535,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -561,6 +549,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc index 4f8f49270b..4377c78a9e 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -341,8 +405,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[4], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[5], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -370,8 +440,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[5], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -384,8 +457,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[1], w_fp[5], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -398,8 +474,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 VVV1_0( w_fp[0], w_fp[7], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -610,7 +689,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -980,9 +1061,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -990,7 +1068,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1015,11 +1092,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1032,17 +1110,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1157,38 +1225,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1361,11 +1398,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h index b501a9772e..0db2d57c1d 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f index b0cc58e89c..04ee9916ca 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f index 2b281a8200..2afe71ca6b 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,14 +140,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF D2=PDG2PDF(LPP(IB(2)),1, IB(2),XBK(IB(2)), QSCALE) U2=PDG2PDF(LPP(IB(2)),2, IB(2),XBK(IB(2)), QSCALE) @@ -234,7 +234,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -309,6 +309,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -393,18 +397,18 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) D2(IVEC)=PDG2PDF(LPP(IB(2)),1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) U2(IVEC)=PDG2PDF(LPP(IB(2)),2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) S2(IVEC)=PDG2PDF(LPP(IB(2)),3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) C2(IVEC)=PDG2PDF(LPP(IB(2)),4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/matrix1.f index 9394a561b8..beb1006203 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -326,7 +326,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -372,7 +372,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -415,21 +416,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,3,2) T(5,4) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,3,4) T(5,2) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,5,2) T(3,4) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,5,4) T(3,2) C ---------- C BEGIN CODE @@ -492,10 +486,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -504,6 +500,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc index e2d65a2667..bb99637e81 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -341,8 +405,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[5], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -370,8 +440,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[5], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 6. * amp_sv[0]; @@ -384,8 +457,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[4], w_fp[5], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -398,8 +474,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 VVV1_0( w_fp[0], w_fp[7], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -610,7 +689,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -980,9 +1061,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -990,7 +1068,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1015,11 +1092,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1032,17 +1110,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1157,38 +1225,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1361,11 +1398,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h index d658e0394e..d18eb18110 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f index e36675626f..7c2b7d44c2 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f index 61bb13c3e7..b869d6cc8f 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,14 +140,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -234,7 +234,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -309,6 +309,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -393,18 +397,18 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/matrix1.f index c7fdad381b..ff1fa6c22a 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -326,7 +326,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -372,7 +372,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -415,21 +416,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(1,2,4) T(3,5) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(1,2,5) T(3,4) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(1,3,4) T(2,5) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(1,3,5) T(2,4) C ---------- C BEGIN CODE @@ -492,10 +486,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -504,6 +500,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.cc index 4f41927bc9..0dc7137ad7 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -341,8 +405,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[1], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -356,8 +423,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[5], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[1] -= 1. / 2. * amp_sv[0]; @@ -370,8 +440,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[5], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -384,8 +457,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[0], w_fp[5], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -398,8 +474,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 VVV1_0( w_fp[4], w_fp[7], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -610,7 +689,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -980,9 +1061,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -990,7 +1068,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1015,11 +1092,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1032,17 +1110,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1157,38 +1225,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1361,11 +1398,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.h index ebf14aca9e..a3116a04e7 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig.f index d46dad4fcb..b83f3f262d 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig1.f index d8e94d91bb..98820b5316 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,7 +140,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -150,7 +150,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -237,7 +237,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -313,6 +313,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -398,24 +402,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/matrix1.f index 787dae76b2..2011afe930 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -326,7 +326,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -372,7 +372,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -415,21 +416,14 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 4) /1.200000000000000D+01 - $ ,4.000000000000000D+00,4.000000000000000D+00,0.000000000000000D - $ +00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 4) /12,8,8,0/ C 1 T(2,1) T(5,3,4) - DATA (CF(I, 2),I= 1, 4) /4.000000000000000D+00 - $ ,1.200000000000000D+01,0.000000000000000D+00,4.000000000000000D - $ +00/ + DATA (CF(I),I= 5, 7) /12,0,8/ C 1 T(2,4) T(5,3,1) - DATA (CF(I, 3),I= 1, 4) /4.000000000000000D+00 - $ ,0.000000000000000D+00,1.200000000000000D+01,4.000000000000000D - $ +00/ + DATA (CF(I),I= 8, 9) /12,8/ C 1 T(3,1) T(5,2,4) - DATA (CF(I, 4),I= 1, 4) /0.000000000000000D+00 - $ ,4.000000000000000D+00,4.000000000000000D+00,1.200000000000000D - $ +01/ + DATA (CF(I),I= 10, 10) /12/ C 1 T(3,4) T(5,2,1) C ---------- C BEGIN CODE @@ -492,10 +486,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -504,6 +500,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.cc index da962495fd..aad3612e5a 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -374,8 +438,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 VVV1_0( w_fp[7], w_fp[5], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -394,8 +461,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[7], w_fp[4], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -414,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 VVV1_0( w_fp[6], w_fp[7], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -435,8 +508,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[12], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -449,8 +525,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[11], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -465,8 +544,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[13], w_fp[11], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -479,8 +561,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[12], w_fp[14], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -493,8 +578,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[3], w_fp[14], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -509,8 +597,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[15], w_fp[14], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -523,8 +614,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[15], w_fp[16], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -537,8 +631,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[15], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -553,8 +650,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[13], w_fp[16], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -567,8 +667,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[13], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -583,8 +686,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 FFV1_0( w_fp[3], w_fp[16], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -599,8 +705,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 FFV1_0( w_fp[12], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += amp_sv[0]; jamp_sv[17] -= amp_sv[0]; @@ -617,8 +726,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 17 FFV1_0( w_fp[16], w_fp[8], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 17 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[16] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= amp_sv[0]; @@ -630,8 +742,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 FFV1_0( w_fp[16], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= amp_sv[0]; @@ -643,8 +758,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 FFV1_0( w_fp[16], w_fp[12], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -658,8 +776,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV1_0( w_fp[6], w_fp[5], w_fp[17], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -674,8 +795,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 21 FFV1_0( w_fp[3], w_fp[9], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 21 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[20] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -688,8 +812,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 FFV1_0( w_fp[13], w_fp[12], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -702,8 +829,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 VVV1_0( w_fp[18], w_fp[4], w_fp[17], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -718,8 +848,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 FFV1_0( w_fp[3], w_fp[8], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -732,8 +865,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 25 FFV1_0( w_fp[15], w_fp[12], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 25 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[24] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -746,8 +882,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[15], w_fp[19], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -759,8 +898,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[15], w_fp[9], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= amp_sv[0]; @@ -772,8 +914,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 FFV1_0( w_fp[13], w_fp[19], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -785,8 +930,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[13], w_fp[8], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= amp_sv[0]; @@ -798,8 +946,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 FFV1_0( w_fp[3], w_fp[19], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -812,8 +963,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 VVV1_0( w_fp[1], w_fp[10], w_fp[17], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[1] -= amp_sv[0]; @@ -854,8 +1008,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[20], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] -= amp_sv[0]; @@ -867,8 +1024,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 34 FFV1_0( w_fp[21], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 34 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[33] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] -= amp_sv[0]; @@ -880,8 +1040,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 FFV1_0( w_fp[12], w_fp[9], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -894,8 +1057,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 VVV1_0( w_fp[6], w_fp[5], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -910,8 +1076,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 37 FFV1_0( w_fp[21], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 37 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[36] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -924,8 +1093,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 38 FFV1_0( w_fp[12], w_fp[14], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 38 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[37] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -938,8 +1110,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 39 VVV1_0( w_fp[18], w_fp[4], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 39 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[38] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += amp_sv[0]; jamp_sv[15] -= amp_sv[0]; @@ -954,8 +1129,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 40 FFV1_0( w_fp[20], w_fp[2], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 40 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[39] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[11] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -968,8 +1146,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 41 FFV1_0( w_fp[12], w_fp[11], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 41 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[40] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[17] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -982,8 +1163,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 42 FFV1_0( w_fp[23], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 42 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[41] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] -= amp_sv[0]; @@ -995,8 +1179,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 43 FFV1_0( w_fp[21], w_fp[11], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 43 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[42] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[15] -= amp_sv[0]; @@ -1008,8 +1195,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 44 FFV1_0( w_fp[23], w_fp[14], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 44 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[43] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[23] -= amp_sv[0]; @@ -1021,8 +1211,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 45 FFV1_0( w_fp[20], w_fp[14], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 45 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[44] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[21] -= amp_sv[0]; @@ -1034,8 +1227,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 46 FFV1_0( w_fp[23], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 46 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[45] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[17] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[23] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1048,8 +1244,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 47 VVV1_0( w_fp[1], w_fp[10], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 47 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[46] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -1087,8 +1286,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 49 FFV1_0( w_fp[22], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 49 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[48] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1101,8 +1303,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 50 FFV1_0( w_fp[3], w_fp[9], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 50 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[49] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -1117,8 +1322,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 51 FFV1_0( w_fp[13], w_fp[9], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 51 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[50] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1131,8 +1339,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 52 FFV1_0( w_fp[16], w_fp[20], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 52 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[51] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1145,8 +1356,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 53 FFV1_0( w_fp[16], w_fp[2], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 53 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[52] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -1161,8 +1375,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 54 FFV1_0( w_fp[16], w_fp[14], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 54 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[53] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1175,8 +1392,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 55 FFV1_0( w_fp[3], w_fp[20], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 55 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[54] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[3] -= amp_sv[0]; @@ -1191,8 +1411,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 56 FFV1_0( w_fp[22], w_fp[2], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 56 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[55] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += amp_sv[0]; jamp_sv[11] -= amp_sv[0]; @@ -1207,8 +1430,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 57 VVV1_0( w_fp[12], w_fp[18], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 57 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[56] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1261,8 +1487,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 59 VVV1_0( w_fp[7], w_fp[5], w_fp[21], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 59 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[58] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1281,8 +1510,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 60 VVV1_0( w_fp[1], w_fp[7], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 60 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[59] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1301,8 +1533,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 61 FFV1_0( w_fp[3], w_fp[14], w_fp[21], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 61 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[60] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] += amp_sv[0]; jamp_sv[20] -= amp_sv[0]; @@ -1317,8 +1552,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 62 FFV1_0( w_fp[22], w_fp[14], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 62 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[61] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[21] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1331,8 +1569,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 63 FFV1_0( w_fp[13], w_fp[2], w_fp[21], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 63 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[62] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += amp_sv[0]; jamp_sv[6] -= amp_sv[0]; @@ -1347,8 +1588,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 64 FFV1_0( w_fp[13], w_fp[20], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 64 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[63] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[12] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1362,8 +1606,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 65 FFV1_0( w_fp[21], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 65 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[64] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1376,8 +1623,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 66 FFV1_0( w_fp[3], w_fp[9], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 66 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[65] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += amp_sv[0]; jamp_sv[8] -= amp_sv[0]; @@ -1392,8 +1642,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 67 FFV1_0( w_fp[15], w_fp[9], w_fp[20], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 67 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[66] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1406,8 +1659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 68 FFV1_0( w_fp[16], w_fp[23], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 68 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[67] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1420,8 +1676,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 69 FFV1_0( w_fp[16], w_fp[2], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 69 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[68] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -1436,8 +1695,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 70 FFV1_0( w_fp[16], w_fp[11], w_fp[20], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 70 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[69] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[16] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1450,8 +1712,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 71 FFV1_0( w_fp[3], w_fp[23], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 71 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[70] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -1466,8 +1731,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 72 FFV1_0( w_fp[21], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 72 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[71] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += amp_sv[0]; jamp_sv[9] -= amp_sv[0]; @@ -1482,8 +1750,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 73 VVV1_0( w_fp[20], w_fp[6], w_fp[7], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 73 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[72] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1536,8 +1807,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 75 VVV1_0( w_fp[7], w_fp[4], w_fp[12], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 75 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[74] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1556,8 +1830,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 76 VVV1_0( w_fp[1], w_fp[7], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 76 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[75] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += cxtype( 0, 1 ) * amp_sv[0]; @@ -1576,8 +1853,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 77 FFV1_0( w_fp[3], w_fp[11], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 77 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[76] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] += amp_sv[0]; jamp_sv[14] -= amp_sv[0]; @@ -1592,8 +1872,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 78 FFV1_0( w_fp[21], w_fp[11], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 78 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[77] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[15] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1606,8 +1889,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 79 FFV1_0( w_fp[15], w_fp[2], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 79 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[78] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -1622,8 +1908,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 80 FFV1_0( w_fp[15], w_fp[23], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 80 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[79] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[18] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1636,8 +1925,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 81 FFV1_0( w_fp[15], w_fp[23], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 81 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[80] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= amp_sv[0]; @@ -1649,8 +1941,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 82 FFV1_0( w_fp[12], w_fp[9], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 82 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[81] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= amp_sv[0]; @@ -1662,8 +1957,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 83 FFV1_0( w_fp[13], w_fp[23], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 83 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[82] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= amp_sv[0]; @@ -1675,8 +1973,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 84 FFV1_0( w_fp[21], w_fp[9], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 84 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[83] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= amp_sv[0]; @@ -1688,8 +1989,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 85 FFV1_0( w_fp[3], w_fp[23], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 85 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[84] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1702,8 +2006,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 86 FFV1_0( w_fp[3], w_fp[9], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 86 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[85] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += amp_sv[0]; jamp_sv[7] -= amp_sv[0]; @@ -1718,8 +2025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 87 FFV1_0( w_fp[22], w_fp[11], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 87 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[86] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] -= amp_sv[0]; @@ -1731,8 +2041,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 88 FFV1_0( w_fp[16], w_fp[20], w_fp[5], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 88 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[87] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[13] -= amp_sv[0]; @@ -1744,8 +2057,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 89 FFV1_0( w_fp[22], w_fp[14], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 89 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[88] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[22] -= amp_sv[0]; @@ -1757,8 +2073,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 90 FFV1_0( w_fp[16], w_fp[24], w_fp[4], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 90 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[89] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[19] -= amp_sv[0]; @@ -1770,8 +2089,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 91 FFV1_0( w_fp[22], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 91 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[90] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[16] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[22] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1784,8 +2106,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 92 FFV1_0( w_fp[16], w_fp[2], w_fp[23], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 92 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[91] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += amp_sv[0]; jamp_sv[5] -= amp_sv[0]; @@ -1834,8 +2159,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 94 VVV1_0( w_fp[7], w_fp[5], w_fp[22], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 94 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[93] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1854,8 +2182,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 95 VVV1_0( w_fp[6], w_fp[5], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 95 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[94] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1874,8 +2205,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 96 FFV1_0( w_fp[3], w_fp[14], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 96 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[95] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += amp_sv[0]; jamp_sv[19] -= amp_sv[0]; @@ -1890,8 +2224,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 97 FFV1_0( w_fp[3], w_fp[24], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 97 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[96] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[19] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1904,8 +2241,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 98 FFV1_0( w_fp[13], w_fp[2], w_fp[22], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 98 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[97] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; jamp_sv[2] -= amp_sv[0]; @@ -1920,8 +2260,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 99 FFV1_0( w_fp[21], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 99 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[98] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[14] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1968,8 +2311,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 101 VVV1_0( w_fp[7], w_fp[4], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 101 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[100] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -1988,8 +2334,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 102 VVV1_0( w_fp[18], w_fp[4], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 102 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[101] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2008,8 +2357,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 103 FFV1_0( w_fp[3], w_fp[11], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 103 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[102] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += amp_sv[0]; jamp_sv[13] -= amp_sv[0]; @@ -2024,8 +2376,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 104 FFV1_0( w_fp[3], w_fp[20], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 104 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[103] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[13] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2038,8 +2393,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 105 FFV1_0( w_fp[15], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 105 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[104] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; jamp_sv[4] -= amp_sv[0]; @@ -2054,8 +2412,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 106 FFV1_0( w_fp[12], w_fp[2], w_fp[18], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 106 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[105] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[20] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2102,8 +2463,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 108 VVV1_0( w_fp[1], w_fp[10], w_fp[25], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 108 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[107] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -2122,8 +2486,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 109 VVV1_0( w_fp[1], w_fp[7], w_fp[23], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 109 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[108] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += cxtype( 0, 1 ) * amp_sv[0]; @@ -2142,8 +2509,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 110 FFV1_0( w_fp[13], w_fp[20], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 110 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[109] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[12] -= amp_sv[0]; @@ -2155,8 +2525,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 111 FFV1_0( w_fp[21], w_fp[11], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 111 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[110] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[14] -= amp_sv[0]; @@ -2168,8 +2541,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 112 FFV1_0( w_fp[15], w_fp[24], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 112 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[111] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[18] -= amp_sv[0]; @@ -2181,8 +2557,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 113 FFV1_0( w_fp[12], w_fp[14], w_fp[1], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 113 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[112] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[20] -= amp_sv[0]; @@ -2718,7 +3097,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -3090,9 +3471,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -3100,7 +3478,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -3125,11 +3502,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -3142,17 +3520,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -3267,38 +3635,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -3471,11 +3808,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.h index b6e3ba16d4..35780287be 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig.f index 850bc73f22..bbc27d3f4d 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig1.f index 7af9753fb7..f79911156c 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix1.f index 39ecff768a..1357357795 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -355,7 +355,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -398,7 +398,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(155) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -441,397 +442,67 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ - DATA (CF(I, 1),I= 7, 12) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 1),I= 13, 18) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ - DATA (CF(I, 1),I= 19, 24) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ + DATA DENOM/54/ + DATA (CF(I),I= 1, 24) /512,-128,-128,16,16,160,-128,16,16,-2,-2 + $ ,-20,16,-2,160,-20,142,124,-2,-20,-20,124,124,-56/ C 1 T(1,2,5,6,3,4) - DATA (CF(I, 2),I= 1, 6) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ - DATA (CF(I, 2),I= 7, 12) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 2),I= 13, 18) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ - DATA (CF(I, 2),I= 19, 24) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ + DATA (CF(I),I= 25, 47) /512,16,160,-128,16,16,-128,-2,-20,16,-2, + $ -2,-20,-20,124,124,-56,16,-2,160,-20,142,124/ C 1 T(1,2,6,5,3,4) - DATA (CF(I, 3),I= 1, 6) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ - DATA (CF(I, 3),I= 7, 12) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ - DATA (CF(I, 3),I= 13, 18) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 3),I= 19, 24) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ + DATA (CF(I),I= 48, 69) /512,-128,160,16,16,-2,160,-20,142,124, + $ -128,16,16,-2,-2,-20,-20,-2,124,-56,-20,124/ C 1 T(1,5,2,6,3,4) - DATA (CF(I, 4),I= 1, 6) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 4),I= 7, 12) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ - DATA (CF(I, 4),I= 13, 18) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 4),I= 19, 24) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ + DATA (CF(I),I= 70, 90) /512,16,-128,-2,-20,-20,124,124,-56,16, + $ -128,-2,-20,16,-2,-2,16,142,124,160,-20/ C 1 T(1,5,6,2,3,4) - DATA (CF(I, 5),I= 1, 6) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ - DATA (CF(I, 5),I= 7, 12) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ - DATA (CF(I, 5),I= 13, 18) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 5),I= 19, 24) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ + DATA (CF(I),I= 91,110) /512,-128,-2,16,142,124,160,-20,-20,-2 + $ ,124,-56,-20,124,-128,16,16,-2,-2,-20/ C 1 T(1,6,2,5,3,4) - DATA (CF(I, 6),I= 1, 6) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ - DATA (CF(I, 6),I= 7, 12) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 6),I= 13, 18) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ - DATA (CF(I, 6),I= 19, 24) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ + DATA (CF(I),I=111,129) /512,-20,-2,124,-56,-20,124,-2,16,142,124 + $ ,160,-20,16,-128,-2,-20,16,-2/ C 1 T(1,6,5,2,3,4) - DATA (CF(I, 7),I= 1, 6) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 7),I= 7, 12) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ - DATA (CF(I, 7),I= 13, 18) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ - DATA (CF(I, 7),I= 19, 24) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ + DATA (CF(I),I=130,147) /512,-128,-128,16,16,160,160,-20,16,-2 + $ ,124,142,-20,124,-2,-20,-56,124/ C 1 T(2,1,5,6,3,4) - DATA (CF(I, 8),I= 1, 6) /1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 8),I= 7, 12) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ - DATA (CF(I, 8),I= 13, 18) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 8),I= 19, 24) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ + DATA (CF(I),I=148,164) /512,16,160,-128,16,-20,124,-2,-20,-56 + $ ,124,160,-20,16,-2,124,142/ C 1 T(2,1,6,5,3,4) - DATA (CF(I, 9),I= 1, 6) /1.481481481481481D-01, - $ -1.851851851851852D-02,1.481481481481481D+00, - $ -1.851851851851852D-01,1.314814814814815D+00,1.148148148148148D - $ +00/ - DATA (CF(I, 9),I= 7, 12) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ - DATA (CF(I, 9),I= 13, 18) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 9),I= 19, 24) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ + DATA (CF(I),I=165,180) /512,-128,160,16,16,-2,-128,16,-20,-2,124 + $ ,-56,-20,-2,124,-20/ C 1 T(2,5,1,6,3,4) - DATA (CF(I, 10),I= 1, 6) /-1.851851851851852D-02, - $ -1.851851851851852D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -5.185185185185185D-01/ - DATA (CF(I, 10),I= 7, 12) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 10),I= 13, 18) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 10),I= 19, 24) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ + DATA (CF(I),I=181,195) /512,16,-128,-2,-20,16,-128,-2,16,142,124 + $ ,-2,16,-20,160/ C 1 T(2,5,6,1,3,4) - DATA (CF(I, 11),I= 1, 6) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.314814814814815D+00,1.148148148148148D - $ +00,1.481481481481481D+00,-1.851851851851852D-01/ - DATA (CF(I, 11),I= 7, 12) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ - DATA (CF(I, 11),I= 13, 18) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ - DATA (CF(I, 11),I= 19, 24) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ + DATA (CF(I),I=196,209) /512,-128,124,-56,-20,-2,124,-20,16,-2, + $ -128,16,-20,-2/ C 1 T(2,6,1,5,3,4) - DATA (CF(I, 12),I= 1, 6) /-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 12),I= 7, 12) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ - DATA (CF(I, 12),I= 13, 18) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ - DATA (CF(I, 12),I= 19, 24) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ + DATA (CF(I),I=210,222) /512,142,124,-2,16,-20,160,-2,-20,16,-128 + $ ,-2,16/ C 1 T(2,6,5,1,3,4) - DATA (CF(I, 13),I= 1, 6) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 13),I= 7, 12) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ - DATA (CF(I, 13),I= 13, 18) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ - DATA (CF(I, 13),I= 19, 24) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ + DATA (CF(I),I=223,234) /512,-128,-128,16,16,160,124,-20,-56,124, + $ -2,-20/ C 1 T(5,1,2,6,3,4) - DATA (CF(I, 14),I= 1, 6) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 14),I= 7, 12) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 14),I= 13, 18) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ - DATA (CF(I, 14),I= 19, 24) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ + DATA (CF(I),I=235,245) /512,16,160,-128,16,-20,160,124,142,16,-2/ C 1 T(5,1,6,2,3,4) - DATA (CF(I, 15),I= 1, 6) /1.481481481481481D+00, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.851851851851852D-02,1.148148148148148D+00,1.314814814814815D - $ +00/ - DATA (CF(I, 15),I= 7, 12) /1.481481481481481D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 15),I= 13, 18) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ - DATA (CF(I, 15),I= 19, 24) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ + DATA (CF(I),I=246,255) /512,-128,160,16,-56,124,124,-20,-20,-2/ C 1 T(5,2,1,6,3,4) - DATA (CF(I, 16),I= 1, 6) /-1.851851851851852D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00/ - DATA (CF(I, 16),I= 7, 12) /-1.851851851851852D-02, - $ -1.851851851851852D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 16),I= 13, 18) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 16),I= 19, 24) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ + DATA (CF(I),I=256,264) /512,16,-128,124,142,-20,160,-2,16/ C 1 T(5,2,6,1,3,4) - DATA (CF(I, 17),I= 1, 6) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ - DATA (CF(I, 17),I= 7, 12) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ - DATA (CF(I, 17),I= 13, 18) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ - DATA (CF(I, 17),I= 19, 24) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ + DATA (CF(I),I=265,272) /512,-128,-2,16,-20,-2,-128,16/ C 1 T(5,6,1,2,3,4) - DATA (CF(I, 18),I= 1, 6) /1.148148148148148D+00, - $ -5.185185185185185D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,1.148148148148148D+00, - $ -1.851851851851852D-01/ - DATA (CF(I, 18),I= 7, 12) /1.314814814814815D+00 - $ ,1.148148148148148D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01 - $ ,1.481481481481481D+00/ - DATA (CF(I, 18),I= 13, 18) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ - DATA (CF(I, 18),I= 19, 24) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ + DATA (CF(I),I=273,279) /512,-20,-2,-2,16,16,-128/ C 1 T(5,6,2,1,3,4) - DATA (CF(I, 19),I= 1, 6) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ - DATA (CF(I, 19),I= 7, 12) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ - DATA (CF(I, 19),I= 13, 18) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 19),I= 19, 24) /9.481481481481481D+00, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01,1.481481481481481D - $ +00/ + DATA (CF(I),I=280,285) /512,-128,-128,16,16,160/ C 1 T(6,1,2,5,3,4) - DATA (CF(I, 20),I= 1, 6) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 20),I= 7, 12) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 20),I= 13, 18) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ - DATA (CF(I, 20),I= 19, 24) /-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01,1.481481481481481D - $ +00,-1.185185185185185D+00,1.481481481481481D-01/ + DATA (CF(I),I=286,290) /512,16,160,-128,16/ C 1 T(6,1,5,2,3,4) - DATA (CF(I, 21),I= 1, 6) /-1.851851851851852D-01 - $ ,1.481481481481481D+00,1.148148148148148D+00,1.314814814814815D - $ +00,1.481481481481481D-01,-1.851851851851852D-02/ - DATA (CF(I, 21),I= 7, 12) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ - DATA (CF(I, 21),I= 13, 18) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 21),I= 19, 24) /-1.185185185185185D+00 - $ ,1.481481481481481D-01,9.481481481481481D+00, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01/ + DATA (CF(I),I=291,294) /512,-128,160,16/ C 1 T(6,2,1,5,3,4) - DATA (CF(I, 22),I= 1, 6) /1.148148148148148D+00, - $ -1.851851851851852D-01,-5.185185185185185D-01 - $ ,1.148148148148148D+00,-1.851851851851852D-02, - $ -1.851851851851852D-01/ - DATA (CF(I, 22),I= 7, 12) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 22),I= 13, 18) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 22),I= 19, 24) /1.481481481481481D-01 - $ ,1.481481481481481D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00,1.481481481481481D-01, - $ -1.185185185185185D+00/ + DATA (CF(I),I=295,297) /512,16,-128/ C 1 T(6,2,5,1,3,4) - DATA (CF(I, 23),I= 1, 6) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 23),I= 7, 12) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 23),I= 13, 18) /-1.851851851851852D-02 - $ ,1.481481481481481D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.185185185185185D+00 - $ ,1.481481481481481D-01/ - DATA (CF(I, 23),I= 19, 24) /1.481481481481481D-01, - $ -1.185185185185185D+00,1.481481481481481D+00,1.481481481481481D - $ -01,9.481481481481481D+00,-1.185185185185185D+00/ + DATA (CF(I),I=298,299) /512,-128/ C 1 T(6,5,1,2,3,4) - DATA (CF(I, 24),I= 1, 6) /-5.185185185185185D-01 - $ ,1.148148148148148D+00,1.148148148148148D+00, - $ -1.851851851851852D-01,-1.851851851851852D-01, - $ -1.851851851851852D-02/ - DATA (CF(I, 24),I= 7, 12) /1.148148148148148D+00 - $ ,1.314814814814815D+00,-1.851851851851852D-01 - $ ,1.481481481481481D+00,-1.851851851851852D-02 - $ ,1.481481481481481D-01/ - DATA (CF(I, 24),I= 13, 18) /-1.851851851851852D-01, - $ -1.851851851851852D-02,-1.851851851851852D-02 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00/ - DATA (CF(I, 24),I= 19, 24) /1.481481481481481D+00 - $ ,1.481481481481481D-01,1.481481481481481D-01, - $ -1.185185185185185D+00,-1.185185185185185D+00 - $ ,9.481481481481481D+00/ + DATA (CF(I),I=300,300) /512/ C 1 T(6,5,2,1,3,4) C ---------- C BEGIN CODE @@ -1547,10 +1218,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -1559,6 +1232,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(2)=AMP2(2)+AMP(4)*DCONJG(AMP(4)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.cc index 70d0f7cb8e..7c493ab814 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -360,8 +427,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -376,8 +446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -392,8 +465,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -408,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -425,8 +504,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[6], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * amp_sv[0]; jamp_sv[5] += 1. / 2. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[5], w_fp[10], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 6. * amp_sv[0]; jamp_sv[5] += 1. / 2. * amp_sv[0]; @@ -454,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[12], w_fp[4], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[4] -= 1. / 6. * amp_sv[0]; @@ -468,8 +556,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[3], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * amp_sv[0]; jamp_sv[1] += 1. / 2. * amp_sv[0]; @@ -482,8 +573,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 VVV1_0( w_fp[1], w_fp[8], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -497,8 +591,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[11], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 2. * amp_sv[0]; jamp_sv[8] -= 1. / 6. * amp_sv[0]; @@ -511,8 +608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[5], w_fp[10], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 6. * amp_sv[0]; jamp_sv[10] += 1. / 2. * amp_sv[0]; @@ -525,8 +625,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[12], w_fp[4], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 6. * amp_sv[0]; jamp_sv[6] += 1. / 2. * amp_sv[0]; @@ -539,8 +642,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[14], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 6. * amp_sv[0]; jamp_sv[10] += 1. / 2. * amp_sv[0]; @@ -553,8 +659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[1], w_fp[8], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -568,8 +677,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 FFV1_0( w_fp[3], w_fp[13], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 2. * amp_sv[0]; jamp_sv[7] -= 1. / 6. * amp_sv[0]; @@ -582,8 +694,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 17 FFV1_0( w_fp[6], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 17 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[16] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * amp_sv[0]; jamp_sv[7] -= 1. / 6. * amp_sv[0]; @@ -596,8 +711,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 FFV1_0( w_fp[12], w_fp[9], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 6. * amp_sv[0]; jamp_sv[6] += 1. / 2. * amp_sv[0]; @@ -610,8 +728,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 FFV1_0( w_fp[5], w_fp[11], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * amp_sv[0]; jamp_sv[3] -= 1. / 6. * amp_sv[0]; @@ -624,8 +745,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV1_0( w_fp[1], w_fp[7], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -639,8 +763,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 21 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 21 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[20] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= 1. / 6. * amp_sv[0]; jamp_sv[9] += 1. / 2. * amp_sv[0]; @@ -653,8 +780,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * amp_sv[0]; jamp_sv[7] -= 1. / 6. * amp_sv[0]; @@ -667,8 +797,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 FFV1_0( w_fp[14], w_fp[10], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * amp_sv[0]; jamp_sv[11] -= 1. / 6. * amp_sv[0]; @@ -681,8 +814,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 FFV1_0( w_fp[9], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += 1. / 2. * amp_sv[0]; jamp_sv[11] -= 1. / 6. * amp_sv[0]; @@ -695,8 +831,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 25 VVV1_0( w_fp[1], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 25 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[24] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -709,8 +848,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[3], w_fp[11], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 6. * amp_sv[0]; jamp_sv[9] += 1. / 2. * amp_sv[0]; @@ -723,8 +865,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -737,8 +882,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 FFV1_0( w_fp[13], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * amp_sv[0]; jamp_sv[2] += 1. / 2. * amp_sv[0]; @@ -751,8 +899,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -765,8 +916,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 FFV1_0( w_fp[5], w_fp[6], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += 1. / 2. * amp_sv[0]; jamp_sv[11] -= 1. / 6. * amp_sv[0]; @@ -779,8 +933,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 FFV1_0( w_fp[5], w_fp[10], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -793,8 +950,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 32 FFV1_0( w_fp[10], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 32 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[31] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[3] -= 1. / 6. * amp_sv[0]; @@ -807,8 +967,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[12], w_fp[4], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -843,8 +1006,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 VVV1_0( w_fp[1], w_fp[8], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -859,8 +1025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 VVV1_0( w_fp[1], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -1113,7 +1282,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1485,9 +1656,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1495,7 +1663,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1520,11 +1687,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1537,17 +1705,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1662,38 +1820,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1866,11 +1993,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.h index 84a8066974..df28183fe3 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig.f index 49cac7230f..f1501ab162 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig1.f index 6e1c3f774f..e7e1a0dc4c 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,14 +140,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -231,7 +231,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -305,6 +305,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -388,12 +392,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix1.f index 9fb8f4d180..db378d1148 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -358,7 +358,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -404,7 +404,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(17) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -447,101 +448,30 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /1.600000000000000D+01 - $ ,5.333333333333333D+00,5.333333333333333D+00,2.000000000000000D - $ +00,0.000000000000000D+00,5.333333333333333D+00/ - DATA (CF(I, 1),I= 7, 12) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 12) /48,32,32,12,0,32,-4,0,-12,-4,-4,12/ C 1 T(1,2,3,4) T(5,6) - DATA (CF(I, 2),I= 1, 6) /5.333333333333333D+00 - $ ,1.600000000000000D+01,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,0.000000000000000D+00/ - DATA (CF(I, 2),I= 7, 12) /0.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 13, 23) /48,12,32,32,0,0,-4,-4,-12,12,-4/ C 1 T(1,2,3,6) T(5,4) - DATA (CF(I, 3),I= 1, 6) /5.333333333333333D+00 - $ ,2.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ - DATA (CF(I, 3),I= 7, 12) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,2.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 24, 33) /48,32,-4,0,0,32,-4,12,-12,-4/ C 1 T(1,2,5,4) T(3,6) - DATA (CF(I, 4),I= 1, 6) /2.000000000000000D+00 - $ ,5.333333333333333D+00,5.333333333333333D+00,1.600000000000000D - $ +01,0.000000000000000D+00,-6.666666666666666D-01/ - DATA (CF(I, 4),I= 7, 12) /5.333333333333333D+00 - $ ,0.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00/ + DATA (CF(I),I= 34, 42) /48,0,-4,32,0,12,-4,-4,-12/ C 1 T(1,2,5,6) T(3,4) - DATA (CF(I, 5),I= 1, 6) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00/ - DATA (CF(I, 5),I= 7, 12) /5.333333333333333D+00 - $ ,2.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ + DATA (CF(I),I= 43, 50) /48,32,32,12,0,-4,32,0/ C 1 T(1,3,4) T(2,5,6) - DATA (CF(I, 6),I= 1, 6) /5.333333333333333D+00 - $ ,0.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,1.600000000000000D - $ +01/ - DATA (CF(I, 6),I= 7, 12) /2.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ + DATA (CF(I),I= 51, 57) /48,12,32,-4,0,0,32/ C 1 T(1,3,6) T(2,5,4) - DATA (CF(I, 7),I= 1, 6) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ - DATA (CF(I, 7),I= 7, 12) /1.600000000000000D+01 - $ ,5.333333333333333D+00,5.333333333333333D+00,0.000000000000000D - $ +00,0.000000000000000D+00,-6.666666666666666D-01/ + DATA (CF(I),I= 58, 63) /48,32,32,0,0,-4/ C 1 T(1,5,4) T(2,3,6) - DATA (CF(I, 8),I= 1, 6) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00,2.000000000000000D+00,5.333333333333333D+00/ - DATA (CF(I, 8),I= 7, 12) /5.333333333333333D+00 - $ ,1.600000000000000D+01,0.000000000000000D+00,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ + DATA (CF(I),I= 64, 68) /48,0,32,-4,0/ C 1 T(1,5,6) T(2,3,4) - DATA (CF(I, 9),I= 1, 6) /-2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 9),I= 7, 12) /5.333333333333333D+00 - $ ,0.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ + DATA (CF(I),I= 69, 72) /48,32,32,12/ C 1 T(2,1,3,4) T(5,6) - DATA (CF(I, 10),I= 1, 6) /-6.666666666666666D-01, - $ -2.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,0.000000000000000D+00/ - DATA (CF(I, 10),I= 7, 12) /0.000000000000000D+00 - $ ,5.333333333333333D+00,5.333333333333333D+00,1.600000000000000D - $ +01,2.000000000000000D+00,5.333333333333333D+00/ + DATA (CF(I),I= 73, 75) /48,12,32/ C 1 T(2,1,3,6) T(5,4) - DATA (CF(I, 11),I= 1, 6) /-6.666666666666666D-01 - $ ,2.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ - DATA (CF(I, 11),I= 7, 12) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,2.000000000000000D - $ +00,1.600000000000000D+01,5.333333333333333D+00/ + DATA (CF(I),I= 76, 77) /48,32/ C 1 T(2,1,5,4) T(3,6) - DATA (CF(I, 12),I= 1, 6) /2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ - DATA (CF(I, 12),I= 7, 12) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,1.600000000000000D+01/ + DATA (CF(I),I= 78, 78) /48/ C 1 T(2,1,5,6) T(3,4) C ---------- C BEGIN CODE @@ -760,10 +690,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -772,6 +704,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.cc index ac4bf091b7..5dfcf73aff 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[1], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -360,8 +427,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[5], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -376,8 +446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[5] += 1. / 2. * amp_sv[0]; @@ -392,8 +465,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -408,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -425,8 +504,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[6], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[1], w_fp[10], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -454,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[12], w_fp[5], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -468,8 +556,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[3], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 6. * amp_sv[0]; @@ -482,8 +573,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 VVV1_0( w_fp[4], w_fp[8], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -497,8 +591,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[11], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= 1. / 2. * amp_sv[0]; jamp_sv[11] += 1. / 6. * amp_sv[0]; @@ -511,8 +608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[1], w_fp[10], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[8] -= 1. / 2. * amp_sv[0]; @@ -525,8 +625,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[12], w_fp[5], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[7] -= 1. / 2. * amp_sv[0]; @@ -539,8 +642,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[14], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 2. * amp_sv[0]; jamp_sv[11] += 1. / 6. * amp_sv[0]; @@ -553,8 +659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[4], w_fp[8], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -568,8 +677,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 FFV1_0( w_fp[3], w_fp[13], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 6. * amp_sv[0]; jamp_sv[7] -= 1. / 2. * amp_sv[0]; @@ -582,8 +694,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 17 FFV1_0( w_fp[6], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 17 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[16] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= 1. / 2. * amp_sv[0]; jamp_sv[6] += 1. / 6. * amp_sv[0]; @@ -596,8 +711,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 FFV1_0( w_fp[12], w_fp[9], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += 1. / 6. * amp_sv[0]; jamp_sv[7] -= 1. / 2. * amp_sv[0]; @@ -610,8 +728,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 FFV1_0( w_fp[1], w_fp[11], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += 1. / 6. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -624,8 +745,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV1_0( w_fp[4], w_fp[7], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -639,8 +763,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 21 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 21 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[20] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 6. * amp_sv[0]; jamp_sv[10] -= 1. / 2. * amp_sv[0]; @@ -653,8 +780,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[6] += 1. / 6. * amp_sv[0]; @@ -667,8 +797,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 FFV1_0( w_fp[14], w_fp[10], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[9] += 1. / 6. * amp_sv[0]; @@ -681,8 +814,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 FFV1_0( w_fp[9], w_fp[5], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += 1. / 6. * amp_sv[0]; jamp_sv[10] -= 1. / 2. * amp_sv[0]; @@ -695,8 +831,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 25 VVV1_0( w_fp[4], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 25 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[24] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -709,8 +848,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[3], w_fp[11], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= 1. / 2. * amp_sv[0]; jamp_sv[11] += 1. / 6. * amp_sv[0]; @@ -723,8 +865,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -737,8 +882,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 FFV1_0( w_fp[13], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 6. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -751,8 +899,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -765,8 +916,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 FFV1_0( w_fp[1], w_fp[6], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 2. * amp_sv[0]; jamp_sv[9] += 1. / 6. * amp_sv[0]; @@ -779,8 +933,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 FFV1_0( w_fp[1], w_fp[10], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -793,8 +950,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 32 FFV1_0( w_fp[10], w_fp[5], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 32 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[31] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[4] += 1. / 6. * amp_sv[0]; @@ -807,8 +967,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[12], w_fp[5], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -843,8 +1006,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 VVV1_0( w_fp[4], w_fp[8], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -859,8 +1025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 VVV1_0( w_fp[4], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -1113,7 +1282,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1485,9 +1656,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1495,7 +1663,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1520,11 +1687,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1537,17 +1705,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1662,38 +1820,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1866,11 +1993,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.h index f75309f403..e28fbf6ae7 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig.f index 47e378e255..288bf58446 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig1.f index 756e98881c..fa7524e559 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,14 +140,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF D2=PDG2PDF(LPP(IB(2)),1, IB(2),XBK(IB(2)), QSCALE) U2=PDG2PDF(LPP(IB(2)),2, IB(2),XBK(IB(2)), QSCALE) @@ -234,7 +234,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -309,6 +309,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -393,18 +397,18 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) D2(IVEC)=PDG2PDF(LPP(IB(2)),1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) U2(IVEC)=PDG2PDF(LPP(IB(2)),2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) S2(IVEC)=PDG2PDF(LPP(IB(2)),3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) C2(IVEC)=PDG2PDF(LPP(IB(2)),4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix1.f index 0079f40417..ea95753e80 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -358,7 +358,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -404,7 +404,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(17) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -447,101 +448,30 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /1.600000000000000D+01 - $ ,5.333333333333333D+00,0.000000000000000D+00,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ - DATA (CF(I, 1),I= 7, 12) /5.333333333333333D+00 - $ ,2.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,0.000000000000000D+00,-6.666666666666666D-01/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 12) /48,32,0,32,-4,0,32,12,0,32,0,-4/ C 1 T(1,3,2) T(5,6,4) - DATA (CF(I, 2),I= 1, 6) /5.333333333333333D+00 - $ ,1.600000000000000D+01,5.333333333333333D+00,0.000000000000000D - $ +00,0.000000000000000D+00,-6.666666666666666D-01/ - DATA (CF(I, 2),I= 7, 12) /2.000000000000000D+00 - $ ,5.333333333333333D+00,5.333333333333333D+00,0.000000000000000D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ + DATA (CF(I),I= 13, 23) /48,32,0,0,-4,12,32,32,0,-4,0/ C 1 T(1,3,4) T(5,6,2) - DATA (CF(I, 3),I= 1, 6) /0.000000000000000D+00 - $ ,5.333333333333333D+00,1.600000000000000D+01,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ - DATA (CF(I, 3),I= 7, 12) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01,-2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 24, 33) /48,32,32,12,-4,0,12,-4,-12,-4/ C 1 T(1,5,3,2) T(6,4) - DATA (CF(I, 4),I= 1, 6) /5.333333333333333D+00 - $ ,0.000000000000000D+00,5.333333333333333D+00,1.600000000000000D - $ +01,2.000000000000000D+00,5.333333333333333D+00/ - DATA (CF(I, 4),I= 7, 12) /0.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00,-6.666666666666666D-01, - $ -2.000000000000000D+00/ + DATA (CF(I),I= 34, 42) /48,12,32,0,-4,-4,12,-4,-12/ C 1 T(1,5,3,4) T(6,2) - DATA (CF(I, 5),I= 1, 6) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,5.333333333333333D+00,2.000000000000000D - $ +00,1.600000000000000D+01,5.333333333333333D+00/ - DATA (CF(I, 5),I= 7, 12) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01, - $ -2.000000000000000D+00,-6.666666666666666D-01 - $ ,2.000000000000000D+00/ + DATA (CF(I),I= 43, 50) /48,32,0,32,-4,-12,-4,12/ C 1 T(1,5,6,2) T(3,4) - DATA (CF(I, 6),I= 1, 6) /0.000000000000000D+00, - $ -6.666666666666666D-01,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,1.600000000000000D+01/ - DATA (CF(I, 6),I= 7, 12) /5.333333333333333D+00 - $ ,0.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01,2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 51, 57) /48,32,0,-12,-4,12,-4/ C 1 T(1,5,6,4) T(3,2) - DATA (CF(I, 7),I= 1, 6) /5.333333333333333D+00 - $ ,2.000000000000000D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ - DATA (CF(I, 7),I= 7, 12) /1.600000000000000D+01 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,5.333333333333333D+00,0.000000000000000D - $ +00/ + DATA (CF(I),I= 58, 63) /48,32,-4,0,32,0/ C 1 T(1,6,2) T(5,3,4) - DATA (CF(I, 8),I= 1, 6) /2.000000000000000D+00 - $ ,5.333333333333333D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ - DATA (CF(I, 8),I= 7, 12) /5.333333333333333D+00 - $ ,1.600000000000000D+01,0.000000000000000D+00, - $ -6.666666666666666D-01,0.000000000000000D+00,5.333333333333333D - $ +00/ + DATA (CF(I),I= 64, 68) /48,0,-4,0,32/ C 1 T(1,6,4) T(5,3,2) - DATA (CF(I, 9),I= 1, 6) /0.000000000000000D+00 - $ ,5.333333333333333D+00,2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00/ - DATA (CF(I, 9),I= 7, 12) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,2.000000000000000D+00,5.333333333333333D+00/ + DATA (CF(I),I= 69, 72) /48,32,12,32/ C 1 T(3,2) T(5,1,6,4) - DATA (CF(I, 10),I= 1, 6) /5.333333333333333D+00 - $ ,0.000000000000000D+00,-6.666666666666666D-01 - $ ,2.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 10),I= 7, 12) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,1.600000000000000D - $ +01,5.333333333333333D+00,2.000000000000000D+00/ + DATA (CF(I),I= 73, 75) /48,32,12/ C 1 T(3,4) T(5,1,6,2) - DATA (CF(I, 11),I= 1, 6) /0.000000000000000D+00, - $ -6.666666666666666D-01,-2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00/ - DATA (CF(I, 11),I= 7, 12) /5.333333333333333D+00 - $ ,0.000000000000000D+00,2.000000000000000D+00,5.333333333333333D - $ +00,1.600000000000000D+01,5.333333333333333D+00/ + DATA (CF(I),I= 76, 77) /48,32/ C 1 T(5,1,3,2) T(6,4) - DATA (CF(I, 12),I= 1, 6) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,-6.666666666666666D-01, - $ -2.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 12),I= 7, 12) /0.000000000000000D+00 - $ ,5.333333333333333D+00,5.333333333333333D+00,2.000000000000000D - $ +00,5.333333333333333D+00,1.600000000000000D+01/ + DATA (CF(I),I= 78, 78) /48/ C 1 T(5,1,3,4) T(6,2) C ---------- C BEGIN CODE @@ -761,10 +691,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -773,6 +705,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.cc index acf1b836af..278550b7df 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -360,8 +427,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -376,8 +446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * amp_sv[0]; jamp_sv[7] += 1. / 2. * amp_sv[0]; @@ -392,8 +465,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -408,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -425,8 +504,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[6], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 2. * amp_sv[0]; jamp_sv[6] -= 1. / 6. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[5], w_fp[10], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -454,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[12], w_fp[1], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[7] += 1. / 2. * amp_sv[0]; @@ -468,8 +556,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[3], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= 1. / 6. * amp_sv[0]; jamp_sv[7] += 1. / 2. * amp_sv[0]; @@ -482,8 +573,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 VVV1_0( w_fp[4], w_fp[8], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -497,8 +591,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[11], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[9] -= 1. / 6. * amp_sv[0]; @@ -511,8 +608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[5], w_fp[10], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * amp_sv[0]; jamp_sv[11] += 1. / 2. * amp_sv[0]; @@ -525,8 +625,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[12], w_fp[1], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 6. * amp_sv[0]; @@ -539,8 +642,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[14], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] -= 1. / 6. * amp_sv[0]; jamp_sv[11] += 1. / 2. * amp_sv[0]; @@ -553,8 +659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[4], w_fp[8], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -568,8 +677,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 FFV1_0( w_fp[3], w_fp[13], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[1] -= 1. / 6. * amp_sv[0]; @@ -582,8 +694,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 17 FFV1_0( w_fp[6], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 17 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[16] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[4] += 1. / 2. * amp_sv[0]; @@ -596,8 +711,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 FFV1_0( w_fp[12], w_fp[9], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 6. * amp_sv[0]; @@ -610,8 +728,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 FFV1_0( w_fp[5], w_fp[11], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 6. * amp_sv[0]; @@ -624,8 +745,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV1_0( w_fp[4], w_fp[7], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -639,8 +763,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 21 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 21 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[20] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[8] += 1. / 2. * amp_sv[0]; @@ -653,8 +780,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -667,8 +797,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 FFV1_0( w_fp[14], w_fp[10], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 2. * amp_sv[0]; jamp_sv[10] -= 1. / 6. * amp_sv[0]; @@ -681,8 +814,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 FFV1_0( w_fp[9], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += 1. / 2. * amp_sv[0]; jamp_sv[10] -= 1. / 6. * amp_sv[0]; @@ -695,8 +831,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 25 VVV1_0( w_fp[4], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 25 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[24] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -709,8 +848,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[3], w_fp[11], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += 1. / 2. * amp_sv[0]; jamp_sv[9] -= 1. / 6. * amp_sv[0]; @@ -723,8 +865,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -737,8 +882,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 FFV1_0( w_fp[13], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += 1. / 2. * amp_sv[0]; jamp_sv[6] -= 1. / 6. * amp_sv[0]; @@ -751,8 +899,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -765,8 +916,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 FFV1_0( w_fp[5], w_fp[6], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= 1. / 6. * amp_sv[0]; jamp_sv[11] += 1. / 2. * amp_sv[0]; @@ -779,8 +933,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 FFV1_0( w_fp[5], w_fp[10], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -793,8 +950,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 32 FFV1_0( w_fp[10], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 32 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[31] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= 1. / 6. * amp_sv[0]; jamp_sv[7] += 1. / 2. * amp_sv[0]; @@ -807,8 +967,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[12], w_fp[1], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -843,8 +1006,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 VVV1_0( w_fp[4], w_fp[8], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -859,8 +1025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 VVV1_0( w_fp[4], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -1113,7 +1282,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1485,9 +1656,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1495,7 +1663,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1520,11 +1687,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1537,17 +1705,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1662,38 +1820,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1866,11 +1993,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.h index 531d6bcd03..4e5177e8a0 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig.f index f13f023e7d..717940377e 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig1.f index a59705bfaf..b63b44cf5d 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,14 +140,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -234,7 +234,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -309,6 +309,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -393,18 +397,18 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix1.f index 7cd8b962cc..d4585f3289 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -358,7 +358,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -404,7 +404,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(17) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -447,99 +448,30 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /1.600000000000000D+01 - $ ,5.333333333333333D+00,5.333333333333333D+00,2.000000000000000D - $ +00,0.000000000000000D+00,5.333333333333333D+00/ - DATA (CF(I, 1),I= 7, 12) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 12) /48,32,32,12,0,32,-4,0,0,32,-4,0/ C 1 T(1,2,4) T(5,3,6) - DATA (CF(I, 2),I= 1, 6) /5.333333333333333D+00 - $ ,1.600000000000000D+01,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,0.000000000000000D+00/ - DATA (CF(I, 2),I= 7, 12) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00,0.000000000000000D+00,-6.666666666666666D-01/ + DATA (CF(I),I= 13, 23) /48,12,32,32,0,0,-4,32,0,0,-4/ C 1 T(1,2,6) T(5,3,4) - DATA (CF(I, 3),I= 1, 6) /5.333333333333333D+00 - $ ,2.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ - DATA (CF(I, 3),I= 7, 12) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ + DATA (CF(I),I= 24, 33) /48,32,-4,0,0,32,-4,0,0,32/ C 1 T(1,3,4) T(5,2,6) - DATA (CF(I, 4),I= 1, 6) /2.000000000000000D+00 - $ ,5.333333333333333D+00,5.333333333333333D+00,1.600000000000000D - $ +01,0.000000000000000D+00,-6.666666666666666D-01/ - DATA (CF(I, 4),I= 7, 12) /5.333333333333333D+00 - $ ,0.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ + DATA (CF(I),I= 34, 42) /48,0,-4,32,0,0,-4,32,0/ C 1 T(1,3,6) T(5,2,4) - DATA (CF(I, 5),I= 1, 6) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00/ - DATA (CF(I, 5),I= 7, 12) /5.333333333333333D+00 - $ ,2.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00/ + DATA (CF(I),I= 43, 50) /48,32,32,12,12,-4,-4,-12/ C 1 T(1,5,2,4) T(3,6) - DATA (CF(I, 6),I= 1, 6) /5.333333333333333D+00 - $ ,0.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,1.600000000000000D - $ +01/ - DATA (CF(I, 6),I= 7, 12) /2.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,2.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 51, 57) /48,12,32,-4,12,-12,-4/ C 1 T(1,5,2,6) T(3,4) - DATA (CF(I, 7),I= 1, 6) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ - DATA (CF(I, 7),I= 7, 12) /1.600000000000000D+01 - $ ,5.333333333333333D+00,-6.666666666666666D-01, - $ -2.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 58, 63) /48,32,-4,-12,12,-4/ C 1 T(1,5,3,4) T(2,6) - DATA (CF(I, 8),I= 1, 6) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00,2.000000000000000D+00,5.333333333333333D+00/ - DATA (CF(I, 8),I= 7, 12) /5.333333333333333D+00 - $ ,1.600000000000000D+01,-2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00/ + DATA (CF(I),I= 64, 68) /48,-12,-4,-4,12/ C 1 T(1,5,3,6) T(2,4) - DATA (CF(I, 9),I= 1, 6) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 9),I= 7, 12) /-6.666666666666666D-01, - $ -2.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ + DATA (CF(I),I= 69, 72) /48,32,32,12/ C 1 T(2,4) T(5,1,3,6) - DATA (CF(I, 10),I= 1, 6) /5.333333333333333D+00 - $ ,0.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00/ - DATA (CF(I, 10),I= 7, 12) /-2.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,1.600000000000000D - $ +01,2.000000000000000D+00,5.333333333333333D+00/ + DATA (CF(I),I= 73, 75) /48,12,32/ C 1 T(2,6) T(5,1,3,4) - DATA (CF(I, 11),I= 1, 6) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,-6.666666666666666D-01,-2.000000000000000D+00/ - DATA (CF(I, 11),I= 7, 12) /2.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,2.000000000000000D - $ +00,1.600000000000000D+01,5.333333333333333D+00/ + DATA (CF(I),I= 76, 77) /48,32/ C 1 T(3,4) T(5,1,2,6) - DATA (CF(I, 12),I= 1, 6) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00,-2.000000000000000D+00,-6.666666666666666D-01/ - DATA (CF(I, 12),I= 7, 12) /-6.666666666666666D-01 - $ ,2.000000000000000D+00,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,1.600000000000000D+01/ + DATA (CF(I),I= 78, 78) /48/ C 1 T(3,6) T(5,1,2,4) C ---------- C BEGIN CODE @@ -758,10 +690,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -770,6 +704,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.cc index d34888db6a..05be30b53c 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -101,6 +102,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -310,7 +374,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -320,7 +384,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -346,8 +410,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -362,8 +429,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -378,8 +448,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -392,8 +465,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[5], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -408,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[1], w_fp[3], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 4. * amp_sv[0]; @@ -424,8 +503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[4], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 4. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[3], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -688,7 +773,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1060,9 +1147,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1070,7 +1154,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1095,11 +1178,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1112,17 +1196,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1237,38 +1311,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1441,11 +1484,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.h index 08510dfc85..2ed7fd78ca 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig.f index bb9d2c55fb..679ae9b6f6 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig1.f index b76b7c4456..ea57242a73 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -142,7 +142,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -151,7 +151,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF D2=PDG2PDF(LPP(IB(2)),1, IB(2),XBK(IB(2)), QSCALE) S2=PDG2PDF(LPP(IB(2)),3, IB(2),XBK(IB(2)), QSCALE) @@ -243,7 +243,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -321,6 +321,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -406,20 +410,20 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) D2(IVEC)=PDG2PDF(LPP(IB(2)),1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) S2(IVEC)=PDG2PDF(LPP(IB(2)),3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) C2(IVEC)=PDG2PDF(LPP(IB(2)),4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/matrix1.f index bfe665d186..9ea012209a 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -360,7 +360,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -408,7 +408,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(8) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -451,29 +452,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /2.700000000000000D+01 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,3.000000000000000D+00,9.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 6) /27,18,18,6,6,18/ C 1 T(3,1) T(5,2) T(6,4) - DATA (CF(I, 2),I= 1, 6) /9.000000000000000D+00 - $ ,2.700000000000000D+01,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 7, 11) /27,6,18,18,6/ C 1 T(3,1) T(5,4) T(6,2) - DATA (CF(I, 3),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,2.700000000000000D+01,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 12, 15) /27,18,18,6/ C 1 T(3,2) T(5,1) T(6,4) - DATA (CF(I, 4),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,2.700000000000000D - $ +01,3.000000000000000D+00,9.000000000000000D+00/ + DATA (CF(I),I= 16, 18) /27,6,18/ C 1 T(3,2) T(5,4) T(6,1) - DATA (CF(I, 5),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,2.700000000000000D+01,9.000000000000000D+00/ + DATA (CF(I),I= 19, 20) /27,18/ C 1 T(3,4) T(5,1) T(6,2) - DATA (CF(I, 6),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,2.700000000000000D+01/ + DATA (CF(I),I= 21, 21) /27/ C 1 T(3,4) T(5,2) T(6,1) C ---------- C BEGIN CODE @@ -553,10 +543,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -565,6 +557,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.cc index 66e4b80f71..b0cd3067e0 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -107,6 +108,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -316,7 +380,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -326,7 +390,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -352,8 +416,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -368,8 +435,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -384,8 +454,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -398,8 +471,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[1], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -414,8 +490,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[5], w_fp[3], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -430,8 +509,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[4], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -446,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[3], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -694,7 +779,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1066,9 +1153,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1076,7 +1160,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1101,11 +1184,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1118,17 +1202,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1243,38 +1317,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1447,11 +1490,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.h index 04b9f5bcb1..d12d4278a4 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig.f index 5046df7e56..e922b7f223 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig1.f index 848991a32a..af922b32b4 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -148,7 +148,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -158,7 +158,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -269,7 +269,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -353,6 +353,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -438,24 +442,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix1.f index 5dcb5155f3..8936b8858a 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -366,7 +366,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -420,7 +420,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(8) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -463,29 +464,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /2.700000000000000D+01 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,3.000000000000000D+00,9.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 6) /27,18,18,6,6,18/ C 1 T(2,1) T(3,4) T(5,6) - DATA (CF(I, 2),I= 1, 6) /9.000000000000000D+00 - $ ,2.700000000000000D+01,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 7, 11) /27,6,18,18,6/ C 1 T(2,1) T(3,6) T(5,4) - DATA (CF(I, 3),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,2.700000000000000D+01,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 12, 15) /27,18,18,6/ C 1 T(2,4) T(3,1) T(5,6) - DATA (CF(I, 4),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,2.700000000000000D - $ +01,3.000000000000000D+00,9.000000000000000D+00/ + DATA (CF(I),I= 16, 18) /27,6,18/ C 1 T(2,4) T(3,6) T(5,1) - DATA (CF(I, 5),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,2.700000000000000D+01,9.000000000000000D+00/ + DATA (CF(I),I= 19, 20) /27,18/ C 1 T(2,6) T(3,1) T(5,4) - DATA (CF(I, 6),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,2.700000000000000D+01/ + DATA (CF(I),I= 21, 21) /27/ C 1 T(2,6) T(3,4) T(5,1) C ---------- C BEGIN CODE @@ -565,10 +555,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -577,6 +569,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.cc index 8d266e82b7..edd133faea 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -360,8 +427,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -376,8 +446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -390,8 +463,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[9], w_fp[5], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -406,8 +482,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[1], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 4. * amp_sv[0]; @@ -424,8 +503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[10], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[10], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -456,8 +541,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 VVV1_0( w_fp[9], w_fp[6], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -470,8 +558,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[4], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -486,8 +577,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[1], w_fp[10], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -502,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[10], w_fp[5], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -518,8 +615,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[10], w_fp[5], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -534,8 +634,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[6], w_fp[4], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 4. * amp_sv[0]; @@ -550,8 +653,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[10], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -798,7 +904,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1170,9 +1278,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1180,7 +1285,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1205,11 +1309,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1222,17 +1327,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1347,38 +1442,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1551,11 +1615,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.h index fd123d932d..32144c2f8e 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig.f index 77164138e6..650e42d27b 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig1.f index f03c7f3b0c..63aadb5257 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,7 +140,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -150,7 +150,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF D2=PDG2PDF(LPP(IB(2)),1, IB(2),XBK(IB(2)), QSCALE) U2=PDG2PDF(LPP(IB(2)),2, IB(2),XBK(IB(2)), QSCALE) @@ -237,7 +237,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -313,6 +313,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -398,24 +402,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) D2(IVEC)=PDG2PDF(LPP(IB(2)),1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) U2(IVEC)=PDG2PDF(LPP(IB(2)),2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) S2(IVEC)=PDG2PDF(LPP(IB(2)),3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) C2(IVEC)=PDG2PDF(LPP(IB(2)),4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/matrix1.f index 8b80833180..bfbd5d3ac8 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -358,7 +358,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -404,7 +404,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(16) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -447,29 +448,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /2.700000000000000D+01 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,3.000000000000000D+00,9.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 6) /27,18,18,6,6,18/ C 1 T(3,1) T(5,2) T(6,4) - DATA (CF(I, 2),I= 1, 6) /9.000000000000000D+00 - $ ,2.700000000000000D+01,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 7, 11) /27,6,18,18,6/ C 1 T(3,1) T(5,4) T(6,2) - DATA (CF(I, 3),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,2.700000000000000D+01,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 12, 15) /27,18,18,6/ C 1 T(3,2) T(5,1) T(6,4) - DATA (CF(I, 4),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,2.700000000000000D - $ +01,3.000000000000000D+00,9.000000000000000D+00/ + DATA (CF(I),I= 16, 18) /27,6,18/ C 1 T(3,2) T(5,4) T(6,1) - DATA (CF(I, 5),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,2.700000000000000D+01,9.000000000000000D+00/ + DATA (CF(I),I= 19, 20) /27,18/ C 1 T(3,4) T(5,1) T(6,2) - DATA (CF(I, 6),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,2.700000000000000D+01/ + DATA (CF(I),I= 21, 21) /27/ C 1 T(3,4) T(5,2) T(6,1) C ---------- C BEGIN CODE @@ -585,10 +575,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -597,6 +589,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.cc index 1b918bae84..3d0bb538d6 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -107,6 +108,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -316,7 +380,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -326,7 +390,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -352,8 +416,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -368,8 +435,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -384,8 +454,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -398,8 +471,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[4], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -414,8 +490,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[5], w_fp[3], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -430,8 +509,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[1], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -446,8 +528,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[3], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -694,7 +779,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1066,9 +1153,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1076,7 +1160,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1101,11 +1184,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1118,17 +1202,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1243,38 +1317,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1447,11 +1490,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.h index 87faf25dfb..d210469055 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig.f index e3f26606a1..bb0e56154b 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig1.f index 74f009d272..5285d2a803 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -148,7 +148,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -158,7 +158,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -269,7 +269,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -353,6 +353,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -438,24 +442,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix1.f index 728711155f..302ca4bbd2 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -366,7 +366,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -420,7 +420,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(8) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -463,29 +464,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /2.700000000000000D+01 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,3.000000000000000D+00,9.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 6) /27,18,18,6,6,18/ C 1 T(2,1) T(3,4) T(5,6) - DATA (CF(I, 2),I= 1, 6) /9.000000000000000D+00 - $ ,2.700000000000000D+01,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 7, 11) /27,6,18,18,6/ C 1 T(2,1) T(3,6) T(5,4) - DATA (CF(I, 3),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,2.700000000000000D+01,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 12, 15) /27,18,18,6/ C 1 T(2,4) T(3,1) T(5,6) - DATA (CF(I, 4),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,2.700000000000000D - $ +01,3.000000000000000D+00,9.000000000000000D+00/ + DATA (CF(I),I= 16, 18) /27,6,18/ C 1 T(2,4) T(3,6) T(5,1) - DATA (CF(I, 5),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,2.700000000000000D+01,9.000000000000000D+00/ + DATA (CF(I),I= 19, 20) /27,18/ C 1 T(2,6) T(3,1) T(5,4) - DATA (CF(I, 6),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,2.700000000000000D+01/ + DATA (CF(I),I= 21, 21) /27/ C 1 T(2,6) T(3,4) T(5,1) C ---------- C BEGIN CODE @@ -565,10 +555,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -577,6 +569,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.cc index 1c575b7757..bdfe7f9261 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[0], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -360,8 +427,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -376,8 +446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -392,8 +465,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -408,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[9], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -425,8 +504,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[6], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[10] -= 1. / 2. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[0], w_fp[10], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] -= 1. / 2. * amp_sv[0]; jamp_sv[11] += 1. / 6. * amp_sv[0]; @@ -454,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[12], w_fp[1], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[11] += 1. / 6. * amp_sv[0]; @@ -468,8 +556,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[3], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -482,8 +573,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 VVV1_0( w_fp[5], w_fp[8], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -497,8 +591,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[11], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[9] -= 1. / 2. * amp_sv[0]; @@ -511,8 +608,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[0], w_fp[10], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= 1. / 2. * amp_sv[0]; jamp_sv[11] += 1. / 6. * amp_sv[0]; @@ -525,8 +625,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[12], w_fp[1], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] -= 1. / 2. * amp_sv[0]; jamp_sv[11] += 1. / 6. * amp_sv[0]; @@ -539,8 +642,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[14], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -553,8 +659,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 VVV1_0( w_fp[5], w_fp[8], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -568,8 +677,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 FFV1_0( w_fp[3], w_fp[13], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += 1. / 6. * amp_sv[0]; jamp_sv[9] -= 1. / 2. * amp_sv[0]; @@ -582,8 +694,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 17 FFV1_0( w_fp[6], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 17 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[16] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * amp_sv[0]; jamp_sv[8] += 1. / 6. * amp_sv[0]; @@ -596,8 +711,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 FFV1_0( w_fp[12], w_fp[9], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 6. * amp_sv[0]; jamp_sv[9] -= 1. / 2. * amp_sv[0]; @@ -610,8 +728,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 FFV1_0( w_fp[0], w_fp[11], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * amp_sv[0]; jamp_sv[6] += 1. / 6. * amp_sv[0]; @@ -624,8 +745,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV1_0( w_fp[5], w_fp[7], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -639,8 +763,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 21 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 21 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[20] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * amp_sv[0]; jamp_sv[8] += 1. / 6. * amp_sv[0]; @@ -653,8 +780,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] += 1. / 6. * amp_sv[0]; jamp_sv[10] -= 1. / 2. * amp_sv[0]; @@ -667,8 +797,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 FFV1_0( w_fp[14], w_fp[10], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += 1. / 6. * amp_sv[0]; jamp_sv[10] -= 1. / 2. * amp_sv[0]; @@ -681,8 +814,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 FFV1_0( w_fp[9], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * amp_sv[0]; jamp_sv[7] += 1. / 6. * amp_sv[0]; @@ -695,8 +831,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 25 VVV1_0( w_fp[5], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 25 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[24] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -709,8 +848,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[3], w_fp[11], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -723,8 +865,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -737,8 +882,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 FFV1_0( w_fp[13], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * amp_sv[0]; jamp_sv[4] -= 1. / 2. * amp_sv[0]; @@ -751,8 +899,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[6], w_fp[2], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -765,8 +916,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 FFV1_0( w_fp[0], w_fp[6], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= 1. / 2. * amp_sv[0]; jamp_sv[7] += 1. / 6. * amp_sv[0]; @@ -779,8 +933,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 FFV1_0( w_fp[0], w_fp[10], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -793,8 +950,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 32 FFV1_0( w_fp[10], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 32 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[31] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[6] += 1. / 6. * amp_sv[0]; @@ -807,8 +967,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[12], w_fp[1], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -843,8 +1006,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 VVV1_0( w_fp[5], w_fp[8], w_fp[6], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -859,8 +1025,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 VVV1_0( w_fp[5], w_fp[7], w_fp[11], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * amp_sv[0]; jamp_sv[4] -= 1. / 2. * amp_sv[0]; @@ -1113,7 +1282,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1485,9 +1656,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1495,7 +1663,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1520,11 +1687,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1537,17 +1705,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1662,38 +1820,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1866,11 +1993,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.h index 0689624568..9f6d1e73d8 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig.f index 5787ba42b2..c6e0ad713c 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig1.f index 75d947b792..4f87d87a30 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,7 +140,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -150,7 +150,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -237,7 +237,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -313,6 +313,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -398,24 +402,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix1.f index 65c377ffc0..594b3ed260 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -358,7 +358,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -404,7 +404,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(17) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -447,101 +448,30 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /1.600000000000000D+01, - $ -2.000000000000000D+00,5.333333333333333D+00, - $ -6.666666666666666D-01,5.333333333333333D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 1),I= 7, 12) /2.000000000000000D+00 - $ ,2.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 12) /48,-12,32,-4,32,-4,12,12,0,-4,32,0/ C 1 T(2,1) T(5,6,3,4) - DATA (CF(I, 2),I= 1, 6) /-2.000000000000000D+00 - $ ,1.600000000000000D+01,-6.666666666666666D-01 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,5.333333333333333D+00/ - DATA (CF(I, 2),I= 7, 12) /2.000000000000000D+00 - $ ,2.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ + DATA (CF(I),I= 13, 23) /48,-4,32,-4,32,12,12,0,32,-4,0/ C 1 T(2,1) T(6,5,3,4) - DATA (CF(I, 3),I= 1, 6) /5.333333333333333D+00, - $ -6.666666666666666D-01,1.600000000000000D+01, - $ -2.000000000000000D+00,2.000000000000000D+00,2.000000000000000D - $ +00/ - DATA (CF(I, 3),I= 7, 12) /5.333333333333333D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ + DATA (CF(I),I= 24, 33) /48,-12,12,12,32,-4,-4,0,0,32/ C 1 T(2,4) T(5,6,3,1) - DATA (CF(I, 4),I= 1, 6) /-6.666666666666666D-01 - $ ,5.333333333333333D+00,-2.000000000000000D+00 - $ ,1.600000000000000D+01,2.000000000000000D+00,2.000000000000000D - $ +00/ - DATA (CF(I, 4),I= 7, 12) /-6.666666666666666D-01 - $ ,5.333333333333333D+00,5.333333333333333D+00,0.000000000000000D - $ +00,0.000000000000000D+00,-6.666666666666666D-01/ + DATA (CF(I),I= 34, 42) /48,12,12,-4,32,32,0,0,-4/ C 1 T(2,4) T(6,5,3,1) - DATA (CF(I, 5),I= 1, 6) /5.333333333333333D+00, - $ -6.666666666666666D-01,2.000000000000000D+00,2.000000000000000D - $ +00,1.600000000000000D+01,-2.000000000000000D+00/ - DATA (CF(I, 5),I= 7, 12) /5.333333333333333D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00,0.000000000000000D+00,-6.666666666666666D-01/ + DATA (CF(I),I= 43, 50) /48,-12,32,-4,32,0,0,-4/ C 1 T(3,1) T(5,6,2,4) - DATA (CF(I, 6),I= 1, 6) /-6.666666666666666D-01 - $ ,5.333333333333333D+00,2.000000000000000D+00,2.000000000000000D - $ +00,-2.000000000000000D+00,1.600000000000000D+01/ - DATA (CF(I, 6),I= 7, 12) /-6.666666666666666D-01 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ + DATA (CF(I),I= 51, 57) /48,-4,32,-4,0,0,32/ C 1 T(3,1) T(6,5,2,4) - DATA (CF(I, 7),I= 1, 6) /2.000000000000000D+00 - $ ,2.000000000000000D+00,5.333333333333333D+00, - $ -6.666666666666666D-01,5.333333333333333D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 7),I= 7, 12) /1.600000000000000D+01, - $ -2.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ + DATA (CF(I),I= 58, 63) /48,-12,0,32,-4,0/ C 1 T(3,4) T(5,6,2,1) - DATA (CF(I, 8),I= 1, 6) /2.000000000000000D+00 - $ ,2.000000000000000D+00,-6.666666666666666D-01 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,5.333333333333333D+00/ - DATA (CF(I, 8),I= 7, 12) /-2.000000000000000D+00 - $ ,1.600000000000000D+01,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ + DATA (CF(I),I= 64, 68) /48,0,-4,32,0/ C 1 T(3,4) T(6,5,2,1) - DATA (CF(I, 9),I= 1, 6) /0.000000000000000D+00 - $ ,0.000000000000000D+00,-6.666666666666666D-01 - $ ,5.333333333333333D+00,5.333333333333333D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 9),I= 7, 12) /0.000000000000000D+00 - $ ,0.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ + DATA (CF(I),I= 69, 72) /48,32,32,12/ C 1 T(5,2,1) T(6,3,4) - DATA (CF(I, 10),I= 1, 6) /-6.666666666666666D-01 - $ ,5.333333333333333D+00,0.000000000000000D+00,0.000000000000000D - $ +00,0.000000000000000D+00,0.000000000000000D+00/ - DATA (CF(I, 10),I= 7, 12) /5.333333333333333D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,1.600000000000000D - $ +01,2.000000000000000D+00,5.333333333333333D+00/ + DATA (CF(I),I= 73, 75) /48,12,32/ C 1 T(5,2,4) T(6,3,1) - DATA (CF(I, 11),I= 1, 6) /5.333333333333333D+00, - $ -6.666666666666666D-01,0.000000000000000D+00,0.000000000000000D - $ +00,0.000000000000000D+00,0.000000000000000D+00/ - DATA (CF(I, 11),I= 7, 12) /-6.666666666666666D-01 - $ ,5.333333333333333D+00,5.333333333333333D+00,2.000000000000000D - $ +00,1.600000000000000D+01,5.333333333333333D+00/ + DATA (CF(I),I= 76, 77) /48,32/ C 1 T(5,3,1) T(6,2,4) - DATA (CF(I, 12),I= 1, 6) /0.000000000000000D+00 - $ ,0.000000000000000D+00,5.333333333333333D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,5.333333333333333D+00/ - DATA (CF(I, 12),I= 7, 12) /0.000000000000000D+00 - $ ,0.000000000000000D+00,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,1.600000000000000D+01/ + DATA (CF(I),I= 78, 78) /48/ C 1 T(5,3,4) T(6,2,1) C ---------- C BEGIN CODE @@ -761,10 +691,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -773,6 +705,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.cc index e6d6423d5e..ddfceba368 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -360,8 +427,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -376,8 +446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -390,8 +463,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[9], w_fp[4], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -406,8 +482,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[5], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -424,8 +503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[10], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[10], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -456,8 +541,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 VVV1_0( w_fp[9], w_fp[6], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -470,8 +558,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[1], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -486,8 +577,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[5], w_fp[10], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -502,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[10], w_fp[4], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -518,8 +615,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[10], w_fp[4], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -534,8 +634,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[6], w_fp[1], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -550,8 +653,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[10], w_fp[1], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 36. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -798,7 +904,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1170,9 +1278,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1180,7 +1285,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1205,11 +1309,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1222,17 +1327,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1347,38 +1442,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1551,11 +1615,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.h index de4fd12c37..d61cca972b 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig.f index 639c7207e3..a6822d8039 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig1.f index 8fc5eeb386..1a2a1fcc8b 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,7 +140,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF D1=PDG2PDF(LPP(IB(1)),1, IB(1),XBK(IB(1)), QSCALE) U1=PDG2PDF(LPP(IB(1)),2, IB(1),XBK(IB(1)), QSCALE) @@ -150,7 +150,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -237,7 +237,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -313,6 +313,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -398,24 +402,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) D1(IVEC)=PDG2PDF(LPP(IB(1)),1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) U1(IVEC)=PDG2PDF(LPP(IB(1)),2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) S1(IVEC)=PDG2PDF(LPP(IB(1)),3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) C1(IVEC)=PDG2PDF(LPP(IB(1)),4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix1.f index 9a6d844439..a20e35e5ec 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -358,7 +358,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -404,7 +404,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(16) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -447,29 +448,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /2.700000000000000D+01 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,3.000000000000000D+00,9.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 6) /27,18,18,6,6,18/ C 1 T(2,1) T(3,4) T(5,6) - DATA (CF(I, 2),I= 1, 6) /9.000000000000000D+00 - $ ,2.700000000000000D+01,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 7, 11) /27,6,18,18,6/ C 1 T(2,1) T(3,6) T(5,4) - DATA (CF(I, 3),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,2.700000000000000D+01,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 12, 15) /27,18,18,6/ C 1 T(2,4) T(3,1) T(5,6) - DATA (CF(I, 4),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,2.700000000000000D - $ +01,3.000000000000000D+00,9.000000000000000D+00/ + DATA (CF(I),I= 16, 18) /27,6,18/ C 1 T(2,4) T(3,6) T(5,1) - DATA (CF(I, 5),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,2.700000000000000D+01,9.000000000000000D+00/ + DATA (CF(I),I= 19, 20) /27,18/ C 1 T(2,6) T(3,1) T(5,4) - DATA (CF(I, 6),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,2.700000000000000D+01/ + DATA (CF(I),I= 21, 21) /27/ C 1 T(2,6) T(3,4) T(5,1) C ---------- C BEGIN CODE @@ -585,10 +575,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -597,6 +589,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.cc index bf560d981f..bbc0e7764a 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -101,6 +102,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -310,7 +374,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -320,7 +384,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -346,8 +410,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -362,8 +429,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -378,8 +448,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -392,8 +465,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[3], w_fp[1], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 36. * amp_sv[0]; @@ -408,8 +484,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[5], w_fp[3], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -424,8 +503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[0], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[3], w_fp[0], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 36. * amp_sv[0]; @@ -688,7 +773,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1060,9 +1147,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1070,7 +1154,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1095,11 +1178,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1112,17 +1196,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1237,38 +1311,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1441,11 +1484,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.h index 13a02cdb83..01ad188163 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig.f index bf9951e502..9578dc7e87 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig1.f index 24b0abb30c..34401887a2 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -142,7 +142,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF CX1=PDG2PDF(LPP(IB(1)),-4, IB(1),XBK(IB(1)), QSCALE) UX1=PDG2PDF(LPP(IB(1)),-2, IB(1),XBK(IB(1)), QSCALE) @@ -151,7 +151,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -243,7 +243,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -321,6 +321,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -406,20 +410,20 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) CX1(IVEC)=PDG2PDF(LPP(IB(1)),-4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) UX1(IVEC)=PDG2PDF(LPP(IB(1)),-2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) DX1(IVEC)=PDG2PDF(LPP(IB(1)),-1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/matrix1.f index 2a76dfeffb..991a639c73 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -360,7 +360,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -408,7 +408,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(8) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -451,29 +452,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /2.700000000000000D+01 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,3.000000000000000D+00,9.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 6) /27,18,18,6,6,18/ C 1 T(1,4) T(2,5) T(3,6) - DATA (CF(I, 2),I= 1, 6) /9.000000000000000D+00 - $ ,2.700000000000000D+01,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 7, 11) /27,6,18,18,6/ C 1 T(1,4) T(2,6) T(3,5) - DATA (CF(I, 3),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,2.700000000000000D+01,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 12, 15) /27,18,18,6/ C 1 T(1,5) T(2,4) T(3,6) - DATA (CF(I, 4),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,2.700000000000000D - $ +01,3.000000000000000D+00,9.000000000000000D+00/ + DATA (CF(I),I= 16, 18) /27,6,18/ C 1 T(1,5) T(2,6) T(3,4) - DATA (CF(I, 5),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,2.700000000000000D+01,9.000000000000000D+00/ + DATA (CF(I),I= 19, 20) /27,18/ C 1 T(1,6) T(2,4) T(3,5) - DATA (CF(I, 6),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,2.700000000000000D+01/ + DATA (CF(I),I= 21, 21) /27/ C 1 T(1,6) T(2,5) T(3,4) C ---------- C BEGIN CODE @@ -553,10 +543,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -565,6 +557,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.cc b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.cc index 83faf9192b..6f9870f1ef 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.cc +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -99,6 +100,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -308,7 +372,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -318,7 +382,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -360,8 +427,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[8], w_fp[2], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -376,8 +446,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV1_0( w_fp[6], w_fp[7], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -390,8 +463,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[9], w_fp[1], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 36. * amp_sv[0]; @@ -406,8 +482,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[5], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[2] -= 1. / 12. * amp_sv[0]; @@ -424,8 +503,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 FFV1_0( w_fp[3], w_fp[10], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -440,8 +522,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[10], w_fp[2], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -456,8 +541,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 VVV1_0( w_fp[9], w_fp[6], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= 1. / 4. * cxtype( 0, 1 ) * amp_sv[0]; @@ -470,8 +558,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[10], w_fp[0], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[1] -= 1. / 4. * amp_sv[0]; @@ -486,8 +577,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[5], w_fp[10], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 12. * amp_sv[0]; jamp_sv[2] -= 1. / 4. * amp_sv[0]; @@ -502,8 +596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[10], w_fp[1], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -518,8 +615,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[10], w_fp[1], w_fp[6], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 4. * amp_sv[0]; jamp_sv[3] += 1. / 12. * amp_sv[0]; @@ -534,8 +634,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[6], w_fp[0], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 4. * amp_sv[0]; jamp_sv[1] -= 1. / 12. * amp_sv[0]; @@ -550,8 +653,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[10], w_fp[0], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 12. * amp_sv[0]; jamp_sv[3] += 1. / 36. * amp_sv[0]; @@ -798,7 +904,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1170,9 +1278,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1180,7 +1285,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1205,11 +1309,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -1222,17 +1327,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1347,38 +1442,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1551,11 +1615,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.h index 0b67fca178..1413e54c6f 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.h +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig.f index f8d2319067..bf95a1a6e3 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig1.f index f9adb0c2a2..9b23b247d8 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -140,7 +140,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF CX1=PDG2PDF(LPP(IB(1)),-4, IB(1),XBK(IB(1)), QSCALE) SX1=PDG2PDF(LPP(IB(1)),-3, IB(1),XBK(IB(1)), QSCALE) @@ -150,7 +150,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF CX2=PDG2PDF(LPP(IB(2)),-4, IB(2),XBK(IB(2)), QSCALE) SX2=PDG2PDF(LPP(IB(2)),-3, IB(2),XBK(IB(2)), QSCALE) @@ -237,7 +237,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -313,6 +313,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -398,24 +402,24 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) CX1(IVEC)=PDG2PDF(LPP(IB(1)),-4, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) SX1(IVEC)=PDG2PDF(LPP(IB(1)),-3, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) UX1(IVEC)=PDG2PDF(LPP(IB(1)),-2, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) DX1(IVEC)=PDG2PDF(LPP(IB(1)),-1, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) CX2(IVEC)=PDG2PDF(LPP(IB(2)),-4, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) SX2(IVEC)=PDG2PDF(LPP(IB(2)),-3, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) UX2(IVEC)=PDG2PDF(LPP(IB(2)),-2, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) DX2(IVEC)=PDG2PDF(LPP(IB(2)),-1, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix1.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix1.f index 35761964e7..3b286148c7 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix1.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -358,7 +358,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -404,7 +404,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(16) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -447,29 +448,18 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /2.700000000000000D+01 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,3.000000000000000D+00,9.000000000000000D+00/ + DATA DENOM/1/ + DATA (CF(I),I= 1, 6) /27,18,18,6,6,18/ C 1 T(1,4) T(2,5) T(3,6) - DATA (CF(I, 2),I= 1, 6) /9.000000000000000D+00 - $ ,2.700000000000000D+01,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 7, 11) /27,6,18,18,6/ C 1 T(1,4) T(2,6) T(3,5) - DATA (CF(I, 3),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,2.700000000000000D+01,9.000000000000000D - $ +00,9.000000000000000D+00,3.000000000000000D+00/ + DATA (CF(I),I= 12, 15) /27,18,18,6/ C 1 T(1,5) T(2,4) T(3,6) - DATA (CF(I, 4),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,2.700000000000000D - $ +01,3.000000000000000D+00,9.000000000000000D+00/ + DATA (CF(I),I= 16, 18) /27,6,18/ C 1 T(1,5) T(2,6) T(3,4) - DATA (CF(I, 5),I= 1, 6) /3.000000000000000D+00 - $ ,9.000000000000000D+00,9.000000000000000D+00,3.000000000000000D - $ +00,2.700000000000000D+01,9.000000000000000D+00/ + DATA (CF(I),I= 19, 20) /27,18/ C 1 T(1,6) T(2,4) T(3,5) - DATA (CF(I, 6),I= 1, 6) /9.000000000000000D+00 - $ ,3.000000000000000D+00,3.000000000000000D+00,9.000000000000000D - $ +00,9.000000000000000D+00,2.700000000000000D+01/ + DATA (CF(I),I= 21, 21) /27/ C 1 T(1,6) T(2,5) T(3,4) C ---------- C BEGIN CODE @@ -585,10 +575,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -597,6 +589,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/cuts.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/genps.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/myamp.f b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/banner.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/banner.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/check_param_card.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/file_writers.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/files.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/files.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/histograms.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/restore_data b/epochX/cudacpp/pp_tt012j.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/restore_data +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/sum_html.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/pp_tt012j.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/pp_tt012j.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/pp_tt012j.mad/bin/madevent b/epochX/cudacpp/pp_tt012j.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/pp_tt012j.mad/bin/madevent +++ b/epochX/cudacpp/pp_tt012j.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/pp_tt012j.mad/src/HelAmps_sm.h b/epochX/cudacpp/pp_tt012j.mad/src/HelAmps_sm.h index 53dd560ed6..921ace57e7 100644 --- a/epochX/cudacpp/pp_tt012j.mad/src/HelAmps_sm.h +++ b/epochX/cudacpp/pp_tt012j.mad/src/HelAmps_sm.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.cc b/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.cc index 47a3a011b8..d17aac5b5c 100644 --- a/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.cc +++ b/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.h b/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.h index 76066c7bb1..63f7d185bd 100644 --- a/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.h +++ b/epochX/cudacpp/pp_tt012j.mad/src/Parameters_sm.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/CODEGEN_mad_smeft_gg_tttt_log.txt b/epochX/cudacpp/smeft_gg_tttt.mad/CODEGEN_mad_smeft_gg_tttt_log.txt index 85f434b58f..e16c922a03 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/CODEGEN_mad_smeft_gg_tttt_log.txt +++ b/epochX/cudacpp/smeft_gg_tttt.mad/CODEGEN_mad_smeft_gg_tttt_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,17 +49,16 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 set zerowidth_tchannel F set auto_convert_model T save options auto_convert_model -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt import model SMEFTsim_topU3l_MwScheme_UFO -massless_4t INFO: load particles INFO: load vertices @@ -73,7 +75,7 @@ INFO: load vertices DEBUG: MG5 converter defines FFFF26 to Gamma(-2,-4,-3)*Gamma(-2,2,-6)*Gamma(-1,-6,-5)*Gamma(-1,4,-4)*ProjP(-5,1)*ProjP(-3,3) + Gamma(-2,-4,-3)*Gamma(-2,4,-6)*Gamma(-1,-6,-5)*Gamma(-1,2,-4)*ProjP(-5,3)*ProjP(-3,1) + Gamma(-2,-4,-3)*Gamma(-2,2,-6)*Gamma(-1,-6,-5)*Gamma(-1,4,-4)*ProjM(-5,1)*ProjM(-3,3) + Gamma(-2,-4,-3)*Gamma(-2,4,-6)*Gamma(-1,-6,-5)*Gamma(-1,2,-4)*ProjM(-5,3)*ProjM(-3,1)  DEBUG: MG5 converter defines FFFF27 to ProjP(2,1)*ProjP(4,3) + ProjM(2,1)*ProjM(4,3)  DEBUG: MG5 converter defines FFFF112 to ProjM(2,3)*ProjM(4,1) + ProjP(2,3)*ProjP(4,1)  -DEBUG: model prefixing takes 0.12868547439575195  +DEBUG: model prefixing takes 0.04109644889831543  INFO: Change particles name to pass to MG5 convention Defined multiparticle p = g u c d s u~ c~ d~ s~ Defined multiparticle j = g u c d s u~ c~ d~ s~ @@ -88,21 +90,21 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=4: WEIGTHED IS QCD+2*QED+99*SMHLOOP+99*NP+99*NPshifts+99*NPprop+99*NPcpv+NPcbb+NPcbB+NPcbBB+NPcbd1+NPcbd8+NPcbe+NPcbG+NPcbH+NPcbj1+NPcbj8+NPcbl+NPcbu1+NPcbu8+NPcbW+NPcdB+NPcdd1+NPcdd8+NPcdG+NPcdH+NPcdW+NPceB+NPced+NPcee+NPceH+NPceu+NPceW+NPcG+NPcGtil+NPcH+NPcHB+NPcHbox+NPcHbq+NPcHBtil+NPcHd+NPcHDD+NPcHe+NPcHG+NPcHGtil+NPcHj1+NPcHj3+NPcHl1+NPcHl3+NPcHQ1+NPcHQ3+NPcHt+NPcHtb+NPcHu+NPcHud+NPcHW+NPcHWB+NPcHWBtil+NPcHWtil+NPcjd1+NPcjd8+NPcje+NPcjj11+NPcjj18+NPcjj31+NPcjj38+NPcjQbd1+NPcjQbd8+NPcjQtu1+NPcjQtu8+NPcjtQd1+NPcjtQd8+NPcju1+NPcju8+NPcjujd1+NPcjujd11+NPcjujd8+NPcjujd81+NPcjuQb1+NPcjuQb8+NPcld+NPcle+NPclebQ+NPcledj+NPcleju1+NPcleju3+NPcleQt1+NPcleQt3+NPclj1+NPclj3+NPcll+NPcll1+NPclu+NPcQb1+NPcQb8+NPcQd1+NPcQd8+NPcQe+NPcQj11+NPcQj18+NPcQj31+NPcQj38+NPcQl1+NPcQl3+NPcQQ1+NPcQQ8+NPcQt1+NPcQt8+NPcQtjd1+NPcQtjd8+NPcQtQb1+NPcQtQb8+NPcQu1+NPcQu8+NPcQujb1+NPcQujb8+NPctB+NPctb1+NPctb8+NPctd1+NPctd8+NPcte+NPctG+NPctH+NPctj1+NPctj8+NPctl+NPctt+NPctu1+NPctu8+NPctW+NPcuB+NPcud1+NPcud8+NPcuG+NPcuH+NPcutbd1+NPcutbd8+NPcuu1+NPcuu8+NPcuW+NPcW+NPcWtil+NPQjujb8 INFO: Trying process: g g > t t~ t t~ WEIGHTED<=4 @1 INFO: Process has 72 diagrams -1 processes with 72 diagrams generated in 3.699 s +1 processes with 72 diagrams generated in 1.408 s Total: 1 processes with 72 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_smeft_gg_tttt --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_smeft_gg_tttt INFO: remove old information in CODEGEN_mad_smeft_gg_tttt DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ t t~ WEIGHTED<=4 @1 INFO: Processing color information for process: g g > t t~ t t~ @1 @@ -114,25 +116,25 @@ FileWriter t t~ t t~ WEIGHTED<=4 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttxttx -DEBUG: len(subproc_diagrams_for_config) =  70 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 68, 68: 69, 69: 71, 70: 72} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 68: 67, 69: 68, 71: 69, 72: 70} [model_handling.py at line 1552]  -Generated helas calls for 1 subprocesses (72 diagrams) in 0.189 s -Wrote files for 119 helas calls in 0.388 s +DEBUG: len(subproc_diagrams_for_config) =  70 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 68, 68: 69, 69: 71, 70: 72} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 68: 67, 69: 68, 71: 69, 72: 70} [model_handling.py at line 1563]  +Generated helas calls for 1 subprocesses (72 diagrams) in 0.068 s +Wrote files for 119 helas calls in 1.958 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV5 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV9 routines ALOHA: aloha creates VVVV10 routines -ALOHA: aloha creates 5 routines in 0.319 s +ALOHA: aloha creates 5 routines in 0.151 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV5 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV9 routines ALOHA: aloha creates VVVV10 routines -ALOHA: aloha creates 10 routines in 0.341 s +ALOHA: aloha creates 10 routines in 0.143 s VVV5 VVV5 FFV1 @@ -142,38 +144,40 @@ ALOHA: aloha creates 10 routines in 0.341 s VVVV1 VVVV9 VVVV10 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/./HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h -INFO: Created file HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/./HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h +INFO: Created file HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc INFO: Created files Parameters_SMEFTsim_topU3l_MwScheme_UFO.h and Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/SubProcesses/P1_gg_ttxttx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/SubProcesses/P1_gg_ttxttx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 275 (offset 48 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/README Run "open index.html" to see more information about this process. quit -real 0m7.169s -user 0m6.853s -sys 0m0.298s -Code generation completed in 7 seconds +real 0m9.466s +user 0m3.333s +sys 0m0.694s +Code generation completed in 10 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -186,7 +190,7 @@ Code generation completed in 7 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -194,10 +198,9 @@ Code generation completed in 7 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -216,7 +219,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -224,10 +227,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_smeft_gg_tttt/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/ident_card.dat b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/ident_card.dat index 7758c3603b..ee875f040f 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/ident_card.dat +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/ident_card.dat @@ -216,17 +216,19 @@ decay 23 mdl_WZ decay 24 mdl_WW decay 25 mdl_WH decay 6 mdl_WT +mass 1 mdl_MD mass 11 mdl_Me mass 13 mdl_MMU mass 15 mdl_MTA -mass 1 mdl_MD +mass 2 mdl_MU mass 23 mdl_MZ mass 25 mdl_MH -mass 2 mdl_MU mass 3 mdl_MS mass 4 mdl_MC mass 5 mdl_MB mass 6 mdl_MT +smeft 1 mdl_cG +smeft 10 mdl_cuHRe smeft 100 mdl_ceHRe smeft 101 mdl_ceWRe smeft 102 mdl_ceBRe @@ -237,7 +239,7 @@ smeft 106 mdl_cll smeft 107 mdl_cll1 smeft 108 mdl_clj1 smeft 109 mdl_clj3 -smeft 10 mdl_cuHRe +smeft 11 mdl_ctHRe smeft 110 mdl_cQl1 smeft 111 mdl_cQl3 smeft 112 mdl_cee @@ -248,7 +250,7 @@ smeft 116 mdl_cbe smeft 117 mdl_cje smeft 118 mdl_cQe smeft 119 mdl_clu -smeft 11 mdl_ctHRe +smeft 12 mdl_cdHRe smeft 120 mdl_ctl smeft 121 mdl_cld smeft 122 mdl_cbl @@ -259,7 +261,6 @@ smeft 126 mdl_cleju1Re smeft 127 mdl_cleQt1Re smeft 128 mdl_cleju3Re smeft 129 mdl_cleQt3Re -smeft 12 mdl_cdHRe smeft 13 mdl_cbHRe smeft 14 mdl_cuGRe smeft 15 mdl_ctGRe @@ -267,7 +268,7 @@ smeft 16 mdl_cuWRe smeft 17 mdl_ctWRe smeft 18 mdl_cuBRe smeft 19 mdl_ctBRe -smeft 1 mdl_cG +smeft 2 mdl_cW smeft 20 mdl_cdGRe smeft 21 mdl_cbGRe smeft 22 mdl_cdWRe @@ -278,7 +279,7 @@ smeft 26 mdl_cHj1 smeft 27 mdl_cHQ1 smeft 28 mdl_cHj3 smeft 29 mdl_cHQ3 -smeft 2 mdl_cW +smeft 3 mdl_cH smeft 30 mdl_cHu smeft 31 mdl_cHt smeft 32 mdl_cHd @@ -289,7 +290,7 @@ smeft 36 mdl_cjj11 smeft 37 mdl_cjj18 smeft 38 mdl_cjj31 smeft 39 mdl_cjj38 -smeft 3 mdl_cH +smeft 4 mdl_cHbox smeft 40 mdl_cQj11 smeft 41 mdl_cQj18 smeft 42 mdl_cQj31 @@ -300,7 +301,7 @@ smeft 46 mdl_cuu1 smeft 47 mdl_cuu8 smeft 48 mdl_ctt smeft 49 mdl_ctu1 -smeft 4 mdl_cHbox +smeft 5 mdl_cHDD smeft 50 mdl_ctu8 smeft 51 mdl_cdd1 smeft 52 mdl_cdd8 @@ -311,7 +312,7 @@ smeft 56 mdl_cud1 smeft 57 mdl_ctb1 smeft 58 mdl_ctd1 smeft 59 mdl_cbu1 -smeft 5 mdl_cHDD +smeft 6 mdl_cHG smeft 60 mdl_cud8 smeft 61 mdl_ctb8 smeft 62 mdl_ctd8 @@ -322,7 +323,7 @@ smeft 66 mdl_cju1 smeft 67 mdl_cQu1 smeft 68 mdl_cju8 smeft 69 mdl_cQu8 -smeft 6 mdl_cHG +smeft 7 mdl_cHW smeft 70 mdl_ctj1 smeft 71 mdl_ctj8 smeft 72 mdl_cQt1 @@ -333,7 +334,7 @@ smeft 76 mdl_cQd1 smeft 77 mdl_cQd8 smeft 78 mdl_cbj1 smeft 79 mdl_cbj8 -smeft 7 mdl_cHW +smeft 8 mdl_cHB smeft 80 mdl_cQb1 smeft 81 mdl_cQb8 smeft 82 mdl_cjQtu1Re @@ -344,7 +345,7 @@ smeft 86 mdl_cjujd1Re smeft 87 mdl_cjujd8Re smeft 88 mdl_cjujd11Re smeft 89 mdl_cjujd81Re -smeft 8 mdl_cHB +smeft 9 mdl_cHWB smeft 90 mdl_cQtjd1Re smeft 91 mdl_cQtjd8Re smeft 92 mdl_cjuQb1Re @@ -355,7 +356,7 @@ smeft 96 mdl_cjtQd1Re smeft 97 mdl_cjtQd8Re smeft 98 mdl_cQtQb1Re smeft 99 mdl_cQtQb8Re -smeft 9 mdl_cHWB +smeftcpv 1 mdl_cGtil smeftcpv 10 mdl_ctWIm smeftcpv 11 mdl_cuBIm smeftcpv 12 mdl_ctBIm @@ -366,7 +367,7 @@ smeftcpv 16 mdl_cbWIm smeftcpv 17 mdl_cdBIm smeftcpv 18 mdl_cbBIm smeftcpv 19 mdl_cuHIm -smeftcpv 1 mdl_cGtil +smeftcpv 2 mdl_cWtil smeftcpv 20 mdl_ctHIm smeftcpv 21 mdl_cdHIm smeftcpv 22 mdl_cbHIm @@ -377,7 +378,7 @@ smeftcpv 26 mdl_cutbd8Im smeftcpv 27 mdl_cjQtu1Im smeftcpv 28 mdl_cjQtu8Im smeftcpv 29 mdl_cjQbd1Im -smeftcpv 2 mdl_cWtil +smeftcpv 3 mdl_cHGtil smeftcpv 30 mdl_cjQbd8Im smeftcpv 31 mdl_cjujd1Im smeftcpv 32 mdl_cjujd8Im @@ -388,7 +389,7 @@ smeftcpv 36 mdl_cQtjd8Im smeftcpv 37 mdl_cjuQb1Im smeftcpv 38 mdl_cjuQb8Im smeftcpv 39 mdl_cQujb1Im -smeftcpv 3 mdl_cHGtil +smeftcpv 4 mdl_cHWtil smeftcpv 40 mdl_cQujb8Im smeftcpv 41 mdl_cjtQd1Im smeftcpv 42 mdl_cjtQd8Im @@ -399,12 +400,11 @@ smeftcpv 46 mdl_ceWIm smeftcpv 47 mdl_ceBIm smeftcpv 48 mdl_cledjIm smeftcpv 49 mdl_clebQIm -smeftcpv 4 mdl_cHWtil +smeftcpv 5 mdl_cHBtil smeftcpv 50 mdl_cleju1Im smeftcpv 51 mdl_cleju3Im smeftcpv 52 mdl_cleQt1Im smeftcpv 53 mdl_cleQt3Im -smeftcpv 5 mdl_cHBtil smeftcpv 6 mdl_cHWBtil smeftcpv 7 mdl_cuGIm smeftcpv 8 mdl_ctGIm @@ -414,10 +414,10 @@ sminputs 1 mdl_MW sminputs 2 mdl_Gf sminputs 3 aS switches 1 mdl_linearPropCorrections +yukawa 1 mdl_ymdo yukawa 11 mdl_yme yukawa 13 mdl_ymm yukawa 15 mdl_ymtau -yukawa 1 mdl_ymdo yukawa 2 mdl_ymup yukawa 3 mdl_yms yukawa 4 mdl_ymc diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/me5_configuration.txt b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/proc_card_mg5.dat index 9bcf8cac8c..96a3c39299 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card.dat b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card.dat index 6b82577032..000832aacd 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card.dat +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card_default.dat b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card_default.dat index b8db871c35..85e1d39035 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/MGMEVersion.txt b/epochX/cudacpp/smeft_gg_tttt.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/MGMEVersion.txt +++ b/epochX/cudacpp/smeft_gg_tttt.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Source/alfas_functions.f b/epochX/cudacpp/smeft_gg_tttt.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Source/cuts.inc b/epochX/cudacpp/smeft_gg_tttt.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Source/cuts.inc +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Source/make_opts b/epochX/cudacpp/smeft_gg_tttt.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Source/make_opts +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Source/makefile b/epochX/cudacpp/smeft_gg_tttt.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Source/makefile +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Source/param_card.inc b/epochX/cudacpp/smeft_gg_tttt.mad/Source/param_card.inc index dab3aac603..e7bc7ae438 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Source/param_card.inc +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Source/param_card.inc @@ -2,17 +2,19 @@ MDL_WW = 2.085000D+00 MDL_WH = 4.070000D-03 MDL_WT = 1.330000D+00 + MDL_MD = 4.670000D-03 MDL_ME = 5.110000D-04 MDL_MMU = 1.056600D-01 MDL_MTA = 1.777000D+00 - MDL_MD = 4.670000D-03 + MDL_MU = 2.160000D-03 MDL_MZ = 9.118760D+01 MDL_MH = 1.250900D+02 - MDL_MU = 2.160000D-03 MDL_MS = 9.300000D-02 MDL_MC = 1.270000D+00 MDL_MB = 4.180000D+00 MDL_MT = 1.727600D+02 + MDL_CG = 0.000000D+00 + MDL_CUHRE = 0.000000D+00 MDL_CEHRE = 0.000000D+00 MDL_CEWRE = 0.000000D+00 MDL_CEBRE = 0.000000D+00 @@ -23,7 +25,7 @@ MDL_CLL1 = 0.000000D+00 MDL_CLJ1 = 0.000000D+00 MDL_CLJ3 = 0.000000D+00 - MDL_CUHRE = 0.000000D+00 + MDL_CTHRE = 0.000000D+00 MDL_CQL1 = 0.000000D+00 MDL_CQL3 = 0.000000D+00 MDL_CEE = 0.000000D+00 @@ -34,7 +36,7 @@ MDL_CJE = 0.000000D+00 MDL_CQE = 0.000000D+00 MDL_CLU = 0.000000D+00 - MDL_CTHRE = 0.000000D+00 + MDL_CDHRE = 0.000000D+00 MDL_CTL = 0.000000D+00 MDL_CLD = 0.000000D+00 MDL_CBL = 0.000000D+00 @@ -45,7 +47,6 @@ MDL_CLEQT1RE = 0.000000D+00 MDL_CLEJU3RE = 0.000000D+00 MDL_CLEQT3RE = 0.000000D+00 - MDL_CDHRE = 0.000000D+00 MDL_CBHRE = 0.000000D+00 MDL_CUGRE = 0.000000D+00 MDL_CTGRE = 0.000000D+00 @@ -53,7 +54,7 @@ MDL_CTWRE = 0.000000D+00 MDL_CUBRE = 0.000000D+00 MDL_CTBRE = 0.000000D+00 - MDL_CG = 0.000000D+00 + MDL_CW = 0.000000D+00 MDL_CDGRE = 0.000000D+00 MDL_CBGRE = 0.000000D+00 MDL_CDWRE = 0.000000D+00 @@ -64,7 +65,7 @@ MDL_CHQ1 = 0.000000D+00 MDL_CHJ3 = 0.000000D+00 MDL_CHQ3 = 0.000000D+00 - MDL_CW = 0.000000D+00 + MDL_CH = 0.000000D+00 MDL_CHU = 0.000000D+00 MDL_CHT = 0.000000D+00 MDL_CHD = 0.000000D+00 @@ -75,7 +76,7 @@ MDL_CJJ18 = 0.000000D+00 MDL_CJJ31 = 0.000000D+00 MDL_CJJ38 = 0.000000D+00 - MDL_CH = 0.000000D+00 + MDL_CHBOX = 0.000000D+00 MDL_CQJ11 = 0.000000D+00 MDL_CQJ18 = 0.000000D+00 MDL_CQJ31 = 0.000000D+00 @@ -86,7 +87,7 @@ MDL_CUU8 = 0.000000D+00 MDL_CTT = 0.000000D+00 MDL_CTU1 = 0.000000D+00 - MDL_CHBOX = 0.000000D+00 + MDL_CHDD = 0.000000D+00 MDL_CTU8 = 0.000000D+00 MDL_CDD1 = 0.000000D+00 MDL_CDD8 = 0.000000D+00 @@ -97,7 +98,7 @@ MDL_CTB1 = 0.000000D+00 MDL_CTD1 = 0.000000D+00 MDL_CBU1 = 0.000000D+00 - MDL_CHDD = 0.000000D+00 + MDL_CHG = 0.000000D+00 MDL_CUD8 = 0.000000D+00 MDL_CTB8 = 0.000000D+00 MDL_CTD8 = 0.000000D+00 @@ -108,7 +109,7 @@ MDL_CQU1 = 0.000000D+00 MDL_CJU8 = 0.000000D+00 MDL_CQU8 = 0.000000D+00 - MDL_CHG = 0.000000D+00 + MDL_CHW = 0.000000D+00 MDL_CTJ1 = 0.000000D+00 MDL_CTJ8 = 0.000000D+00 MDL_CQT1 = 0.000000D+00 @@ -119,7 +120,7 @@ MDL_CQD8 = 0.000000D+00 MDL_CBJ1 = 0.000000D+00 MDL_CBJ8 = 0.000000D+00 - MDL_CHW = 0.000000D+00 + MDL_CHB = 0.000000D+00 MDL_CQB1 = 0.000000D+00 MDL_CQB8 = 0.000000D+00 MDL_CJQTU1RE = 0.000000D+00 @@ -130,7 +131,7 @@ MDL_CJUJD8RE = 0.000000D+00 MDL_CJUJD11RE = 0.000000D+00 MDL_CJUJD81RE = 0.000000D+00 - MDL_CHB = 0.000000D+00 + MDL_CHWB = 0.000000D+00 MDL_CQTJD1RE = 0.000000D+00 MDL_CQTJD8RE = 0.000000D+00 MDL_CJUQB1RE = 0.000000D+00 @@ -141,7 +142,7 @@ MDL_CJTQD8RE = 0.000000D+00 MDL_CQTQB1RE = 0.000000D+00 MDL_CQTQB8RE = 0.000000D+00 - MDL_CHWB = 0.000000D+00 + MDL_CGTIL = 0.000000D+00 MDL_CTWIM = 0.000000D+00 MDL_CUBIM = 0.000000D+00 MDL_CTBIM = 0.000000D+00 @@ -152,7 +153,7 @@ MDL_CDBIM = 0.000000D+00 MDL_CBBIM = 0.000000D+00 MDL_CUHIM = 0.000000D+00 - MDL_CGTIL = 0.000000D+00 + MDL_CWTIL = 0.000000D+00 MDL_CTHIM = 0.000000D+00 MDL_CDHIM = 0.000000D+00 MDL_CBHIM = 0.000000D+00 @@ -163,7 +164,7 @@ MDL_CJQTU1IM = 0.000000D+00 MDL_CJQTU8IM = 0.000000D+00 MDL_CJQBD1IM = 0.000000D+00 - MDL_CWTIL = 0.000000D+00 + MDL_CHGTIL = 0.000000D+00 MDL_CJQBD8IM = 0.000000D+00 MDL_CJUJD1IM = 0.000000D+00 MDL_CJUJD8IM = 0.000000D+00 @@ -174,7 +175,7 @@ MDL_CJUQB1IM = 0.000000D+00 MDL_CJUQB8IM = 0.000000D+00 MDL_CQUJB1IM = 0.000000D+00 - MDL_CHGTIL = 0.000000D+00 + MDL_CHWTIL = 0.000000D+00 MDL_CQUJB8IM = 0.000000D+00 MDL_CJTQD1IM = 0.000000D+00 MDL_CJTQD8IM = 0.000000D+00 @@ -185,12 +186,11 @@ MDL_CEBIM = 0.000000D+00 MDL_CLEDJIM = 0.000000D+00 MDL_CLEBQIM = 0.000000D+00 - MDL_CHWTIL = 0.000000D+00 + MDL_CHBTIL = 0.000000D+00 MDL_CLEJU1IM = 0.000000D+00 MDL_CLEJU3IM = 0.000000D+00 MDL_CLEQT1IM = 0.000000D+00 MDL_CLEQT3IM = 0.000000D+00 - MDL_CHBTIL = 0.000000D+00 MDL_CHWBTIL = 0.000000D+00 MDL_CUGIM = 0.000000D+00 MDL_CTGIM = 0.000000D+00 @@ -200,10 +200,10 @@ MDL_GF = 1.166379D-05 AS = 1.179000D-01 MDL_LINEARPROPCORRECTIONS = 0.000000D+00 + MDL_YMDO = 4.670000D-03 MDL_YME = 5.110000D-04 MDL_YMM = 1.056600D-01 MDL_YMTAU = 1.777000D+00 - MDL_YMDO = 4.670000D-03 MDL_YMUP = 2.160000D-03 MDL_YMS = 9.300000D-02 MDL_YMC = 1.270000D+00 diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/Source/run_card.inc b/epochX/cudacpp/smeft_gg_tttt.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/Source/run_card.inc +++ b/epochX/cudacpp/smeft_gg_tttt.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/Bridge.h b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryBuffers.h index 2f711d8cc1..517396f37e 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_SMEFTsim_topU3l_MwScheme_UFO.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.cc b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.cc index 96d77e5403..6e4cb7748c 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.cc +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -341,8 +405,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[5], w_fp[8], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -357,8 +424,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[9], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -373,8 +443,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VVV5_0( w_fp[6], w_fp[7], w_fp[10], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[2] -= 1. / 2. * amp_sv[0]; @@ -390,8 +463,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 FFV1_0( w_fp[12], w_fp[4], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -406,8 +482,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 FFV1_0( w_fp[3], w_fp[8], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -422,8 +501,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 VVV5_0( w_fp[6], w_fp[11], w_fp[8], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[3] += 1. / 2. * amp_sv[0]; @@ -438,8 +520,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 7 FFV1_0( w_fp[5], w_fp[13], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 7 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[6] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; @@ -454,8 +539,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 8 FFV1_0( w_fp[9], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 8 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[7] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -470,8 +558,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 9 FFV1_0( w_fp[3], w_fp[13], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 9 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[8] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -486,8 +577,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 10 FFV1_0( w_fp[12], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 10 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[9] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 6. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -504,8 +598,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 11 FFV1_0( w_fp[13], w_fp[4], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 11 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[10] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[5] += 1. / 6. * amp_sv[0]; @@ -518,8 +615,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 12 FFV1_0( w_fp[13], w_fp[12], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 12 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[11] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * amp_sv[0]; jamp_sv[5] += 1. / 2. * amp_sv[0]; @@ -533,8 +633,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 13 FFV1_0( w_fp[5], w_fp[6], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 13 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[12] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 6. * amp_sv[0]; jamp_sv[5] += 1. / 2. * amp_sv[0]; @@ -547,8 +650,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 14 FFV1_0( w_fp[3], w_fp[6], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 14 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[13] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * amp_sv[0]; jamp_sv[5] += 1. / 6. * amp_sv[0]; @@ -561,8 +667,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 15 FFV1_0( w_fp[15], w_fp[4], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 15 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[14] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[4] -= 1. / 6. * amp_sv[0]; @@ -575,8 +684,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 16 FFV1_0( w_fp[15], w_fp[12], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 16 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[15] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[4] -= 1. / 2. * amp_sv[0]; @@ -589,8 +701,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 17 FFV1_0( w_fp[5], w_fp[16], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 17 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[16] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[1] += 1. / 6. * amp_sv[0]; @@ -603,8 +718,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 18 VVV5_0( w_fp[1], w_fp[8], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 18 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[17] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -617,8 +735,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 19 FFV1_0( w_fp[3], w_fp[16], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 19 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[18] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * amp_sv[0]; jamp_sv[1] += 1. / 2. * amp_sv[0]; @@ -631,8 +752,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 20 VVV5_0( w_fp[1], w_fp[10], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 20 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[19] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -647,8 +771,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 21 FFV1_0( w_fp[5], w_fp[16], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 21 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[20] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 6. * amp_sv[0]; jamp_sv[8] -= 1. / 2. * amp_sv[0]; @@ -661,8 +788,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 22 FFV1_0( w_fp[14], w_fp[16], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 22 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[21] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 2. * amp_sv[0]; jamp_sv[8] -= 1. / 6. * amp_sv[0]; @@ -675,8 +805,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 23 FFV1_0( w_fp[5], w_fp[6], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 23 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[22] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 6. * amp_sv[0]; jamp_sv[10] += 1. / 2. * amp_sv[0]; @@ -689,8 +822,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 24 FFV1_0( w_fp[14], w_fp[6], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 24 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[23] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * amp_sv[0]; jamp_sv[10] += 1. / 6. * amp_sv[0]; @@ -703,8 +839,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 25 FFV1_0( w_fp[15], w_fp[4], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 25 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[24] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 6. * amp_sv[0]; jamp_sv[6] += 1. / 2. * amp_sv[0]; @@ -717,8 +856,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 26 FFV1_0( w_fp[15], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 26 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[25] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * amp_sv[0]; jamp_sv[6] += 1. / 6. * amp_sv[0]; @@ -731,8 +873,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 27 FFV1_0( w_fp[17], w_fp[4], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 27 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[26] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 2. * amp_sv[0]; jamp_sv[10] += 1. / 6. * amp_sv[0]; @@ -745,8 +890,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 28 VVV5_0( w_fp[1], w_fp[11], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 28 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[27] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -759,8 +907,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 29 FFV1_0( w_fp[17], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 29 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[28] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 6. * amp_sv[0]; jamp_sv[10] += 1. / 2. * amp_sv[0]; @@ -773,8 +924,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 30 VVV5_0( w_fp[1], w_fp[10], w_fp[12], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 30 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[29] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -788,8 +942,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 31 FFV1_0( w_fp[5], w_fp[16], w_fp[17], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 31 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[30] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 6. * amp_sv[0]; jamp_sv[7] -= 1. / 2. * amp_sv[0]; @@ -802,8 +959,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 32 FFV1_0( w_fp[3], w_fp[16], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 32 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[31] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 2. * amp_sv[0]; jamp_sv[7] -= 1. / 6. * amp_sv[0]; @@ -816,8 +976,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 33 FFV1_0( w_fp[13], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 33 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[32] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * amp_sv[0]; jamp_sv[7] -= 1. / 6. * amp_sv[0]; @@ -830,8 +993,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 34 FFV1_0( w_fp[13], w_fp[12], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 34 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[33] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[7] -= 1. / 2. * amp_sv[0]; @@ -844,8 +1010,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 35 FFV1_0( w_fp[15], w_fp[2], w_fp[17], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 35 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[34] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * amp_sv[0]; jamp_sv[6] += 1. / 6. * amp_sv[0]; @@ -858,8 +1027,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 36 FFV1_0( w_fp[15], w_fp[12], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 36 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[35] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 6. * amp_sv[0]; jamp_sv[6] += 1. / 2. * amp_sv[0]; @@ -872,8 +1044,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 37 FFV1_0( w_fp[5], w_fp[14], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 37 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[36] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * amp_sv[0]; jamp_sv[3] -= 1. / 6. * amp_sv[0]; @@ -886,8 +1061,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 38 VVV5_0( w_fp[1], w_fp[7], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 38 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[37] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -900,8 +1078,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 39 FFV1_0( w_fp[3], w_fp[14], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 39 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[38] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -914,8 +1095,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 40 VVV5_0( w_fp[1], w_fp[11], w_fp[17], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 40 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[39] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -929,8 +1113,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 41 FFV1_0( w_fp[3], w_fp[16], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 41 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[40] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= 1. / 6. * amp_sv[0]; jamp_sv[9] += 1. / 2. * amp_sv[0]; @@ -943,8 +1130,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 42 FFV1_0( w_fp[17], w_fp[16], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 42 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[41] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= 1. / 2. * amp_sv[0]; jamp_sv[9] += 1. / 6. * amp_sv[0]; @@ -957,8 +1147,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 43 FFV1_0( w_fp[13], w_fp[4], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 43 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[42] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 6. * amp_sv[0]; jamp_sv[7] -= 1. / 2. * amp_sv[0]; @@ -971,8 +1164,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 44 FFV1_0( w_fp[13], w_fp[2], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 44 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[43] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * amp_sv[0]; jamp_sv[7] -= 1. / 6. * amp_sv[0]; @@ -985,8 +1181,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 45 FFV1_0( w_fp[3], w_fp[6], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 45 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[44] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 6. * amp_sv[0]; jamp_sv[11] -= 1. / 2. * amp_sv[0]; @@ -999,8 +1198,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 46 FFV1_0( w_fp[17], w_fp[6], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 46 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[45] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * amp_sv[0]; jamp_sv[11] -= 1. / 6. * amp_sv[0]; @@ -1013,8 +1215,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 47 FFV1_0( w_fp[12], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 47 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[46] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += 1. / 2. * amp_sv[0]; jamp_sv[11] -= 1. / 6. * amp_sv[0]; @@ -1027,8 +1232,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 48 VVV5_0( w_fp[1], w_fp[7], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 48 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[47] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1041,8 +1249,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 49 FFV1_0( w_fp[12], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 49 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[48] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[9] += 1. / 6. * amp_sv[0]; jamp_sv[11] -= 1. / 2. * amp_sv[0]; @@ -1055,8 +1266,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 50 VVV5_0( w_fp[1], w_fp[8], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 50 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[49] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1069,8 +1283,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 51 FFV1_0( w_fp[5], w_fp[9], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 51 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[50] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 2. * amp_sv[0]; jamp_sv[9] += 1. / 6. * amp_sv[0]; @@ -1083,8 +1300,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 52 FFV1_0( w_fp[5], w_fp[16], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 52 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[51] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[7] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[8] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1097,8 +1317,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 53 FFV1_0( w_fp[3], w_fp[9], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 53 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[52] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[8] -= 1. / 6. * amp_sv[0]; jamp_sv[9] += 1. / 2. * amp_sv[0]; @@ -1111,8 +1334,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 54 FFV1_0( w_fp[3], w_fp[16], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 54 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[53] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[6] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[9] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1125,8 +1351,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 55 FFV1_0( w_fp[16], w_fp[4], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 55 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[54] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[2] += 1. / 6. * amp_sv[0]; @@ -1139,8 +1368,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 56 FFV1_0( w_fp[13], w_fp[4], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 56 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[55] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[7] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1153,8 +1385,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 57 FFV1_0( w_fp[16], w_fp[2], w_fp[10], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 57 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[56] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 6. * amp_sv[0]; jamp_sv[2] += 1. / 2. * amp_sv[0]; @@ -1167,8 +1402,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 58 FFV1_0( w_fp[13], w_fp[2], w_fp[9], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 58 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[57] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[5] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1181,8 +1419,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 59 FFV1_0( w_fp[5], w_fp[13], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 59 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[58] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += 1. / 2. * amp_sv[0]; jamp_sv[11] -= 1. / 6. * amp_sv[0]; @@ -1195,8 +1436,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 60 FFV1_0( w_fp[5], w_fp[6], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 60 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[59] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[5] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[10] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1209,8 +1453,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 61 FFV1_0( w_fp[3], w_fp[13], w_fp[11], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 61 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[60] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[10] += 1. / 6. * amp_sv[0]; jamp_sv[11] -= 1. / 2. * amp_sv[0]; @@ -1223,8 +1470,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 62 FFV1_0( w_fp[3], w_fp[6], w_fp[14], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 62 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[61] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[4] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[11] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1237,8 +1487,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 63 FFV1_0( w_fp[6], w_fp[4], w_fp[7], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 63 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[62] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[3] -= 1. / 6. * amp_sv[0]; @@ -1251,8 +1504,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 64 FFV1_0( w_fp[15], w_fp[4], w_fp[16], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 64 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[63] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[6] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1265,8 +1521,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 65 FFV1_0( w_fp[6], w_fp[2], w_fp[8], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 65 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[64] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 6. * amp_sv[0]; jamp_sv[3] -= 1. / 2. * amp_sv[0]; @@ -1279,8 +1538,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 66 FFV1_0( w_fp[15], w_fp[2], w_fp[12], COUPs[1], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 66 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[65] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[4] += 1. / 2. * cxtype( 0, 1 ) * amp_sv[0]; @@ -1315,8 +1577,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 68 VVV5_0( w_fp[1], w_fp[10], w_fp[16], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 68 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[67] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -1331,8 +1596,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 69 VVV5_0( w_fp[1], w_fp[7], w_fp[9], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 69 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[68] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[2] += 1. / 2. * amp_sv[0]; jamp_sv[5] -= 1. / 2. * amp_sv[0]; @@ -1369,8 +1637,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 71 VVV5_0( w_fp[1], w_fp[8], w_fp[14], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 71 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[70] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= 1. / 2. * amp_sv[0]; jamp_sv[4] += 1. / 2. * amp_sv[0]; @@ -1385,8 +1656,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 72 VVV5_0( w_fp[1], w_fp[11], w_fp[12], COUPs[0], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 72 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[71] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[3] -= 1. / 2. * amp_sv[0]; jamp_sv[4] += 1. / 2. * amp_sv[0]; @@ -1639,7 +1913,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -2011,9 +2287,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -2021,7 +2294,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -2046,11 +2318,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -2063,17 +2336,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -2188,38 +2451,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -2392,11 +2624,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.h b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.h index d207c3303f..9672910a40 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig.f b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig.f index ef1e17705f..f26b24a4db 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig.f +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig1.f b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig1.f index 2086a21e98..e3b8a0e311 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig1.f +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix1.f b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix1.f index 45032ad41c..05f315f1e7 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix1.f +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -355,7 +355,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -398,7 +398,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(34) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -441,101 +442,30 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 6) /1.600000000000000D+01 - $ ,5.333333333333333D+00,5.333333333333333D+00,2.000000000000000D - $ +00,0.000000000000000D+00,5.333333333333333D+00/ - DATA (CF(I, 1),I= 7, 12) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 12) /48,32,32,12,0,32,-4,0,-12,-4,-4,12/ C 1 T(1,2,3,4) T(5,6) - DATA (CF(I, 2),I= 1, 6) /5.333333333333333D+00 - $ ,1.600000000000000D+01,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,0.000000000000000D+00/ - DATA (CF(I, 2),I= 7, 12) /0.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 13, 23) /48,12,32,32,0,0,-4,-4,-12,12,-4/ C 1 T(1,2,3,6) T(5,4) - DATA (CF(I, 3),I= 1, 6) /5.333333333333333D+00 - $ ,2.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ - DATA (CF(I, 3),I= 7, 12) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,2.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01/ + DATA (CF(I),I= 24, 33) /48,32,-4,0,0,32,-4,12,-12,-4/ C 1 T(1,2,5,4) T(3,6) - DATA (CF(I, 4),I= 1, 6) /2.000000000000000D+00 - $ ,5.333333333333333D+00,5.333333333333333D+00,1.600000000000000D - $ +01,0.000000000000000D+00,-6.666666666666666D-01/ - DATA (CF(I, 4),I= 7, 12) /5.333333333333333D+00 - $ ,0.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00/ + DATA (CF(I),I= 34, 42) /48,0,-4,32,0,12,-4,-4,-12/ C 1 T(1,2,5,6) T(3,4) - DATA (CF(I, 5),I= 1, 6) /0.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00/ - DATA (CF(I, 5),I= 7, 12) /5.333333333333333D+00 - $ ,2.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ + DATA (CF(I),I= 43, 50) /48,32,32,12,0,-4,32,0/ C 1 T(1,3,4) T(2,5,6) - DATA (CF(I, 6),I= 1, 6) /5.333333333333333D+00 - $ ,0.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,1.600000000000000D - $ +01/ - DATA (CF(I, 6),I= 7, 12) /2.000000000000000D+00 - $ ,5.333333333333333D+00,-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ + DATA (CF(I),I= 51, 57) /48,12,32,-4,0,0,32/ C 1 T(1,3,6) T(2,5,4) - DATA (CF(I, 7),I= 1, 6) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ - DATA (CF(I, 7),I= 7, 12) /1.600000000000000D+01 - $ ,5.333333333333333D+00,5.333333333333333D+00,0.000000000000000D - $ +00,0.000000000000000D+00,-6.666666666666666D-01/ + DATA (CF(I),I= 58, 63) /48,32,32,0,0,-4/ C 1 T(1,5,4) T(2,3,6) - DATA (CF(I, 8),I= 1, 6) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00,2.000000000000000D+00,5.333333333333333D+00/ - DATA (CF(I, 8),I= 7, 12) /5.333333333333333D+00 - $ ,1.600000000000000D+01,0.000000000000000D+00,5.333333333333333D - $ +00,-6.666666666666666D-01,0.000000000000000D+00/ + DATA (CF(I),I= 64, 68) /48,0,32,-4,0/ C 1 T(1,5,6) T(2,3,4) - DATA (CF(I, 9),I= 1, 6) /-2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,2.000000000000000D+00,0.000000000000000D+00, - $ -6.666666666666666D-01/ - DATA (CF(I, 9),I= 7, 12) /5.333333333333333D+00 - $ ,0.000000000000000D+00,1.600000000000000D+01,5.333333333333333D - $ +00,5.333333333333333D+00,2.000000000000000D+00/ + DATA (CF(I),I= 69, 72) /48,32,32,12/ C 1 T(2,1,3,4) T(5,6) - DATA (CF(I, 10),I= 1, 6) /-6.666666666666666D-01, - $ -2.000000000000000D+00,2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01 - $ ,0.000000000000000D+00/ - DATA (CF(I, 10),I= 7, 12) /0.000000000000000D+00 - $ ,5.333333333333333D+00,5.333333333333333D+00,1.600000000000000D - $ +01,2.000000000000000D+00,5.333333333333333D+00/ + DATA (CF(I),I= 73, 75) /48,12,32/ C 1 T(2,1,3,6) T(5,4) - DATA (CF(I, 11),I= 1, 6) /-6.666666666666666D-01 - $ ,2.000000000000000D+00,-2.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,0.000000000000000D - $ +00/ - DATA (CF(I, 11),I= 7, 12) /0.000000000000000D+00, - $ -6.666666666666666D-01,5.333333333333333D+00,2.000000000000000D - $ +00,1.600000000000000D+01,5.333333333333333D+00/ + DATA (CF(I),I= 76, 77) /48,32/ C 1 T(2,1,5,4) T(3,6) - DATA (CF(I, 12),I= 1, 6) /2.000000000000000D+00, - $ -6.666666666666666D-01,-6.666666666666666D-01, - $ -2.000000000000000D+00,0.000000000000000D+00,5.333333333333333D - $ +00/ - DATA (CF(I, 12),I= 7, 12) /-6.666666666666666D-01 - $ ,0.000000000000000D+00,2.000000000000000D+00,5.333333333333333D - $ +00,5.333333333333333D+00,1.600000000000000D+01/ + DATA (CF(I),I= 78, 78) /48/ C 1 T(2,1,5,6) T(3,4) C ---------- C BEGIN CODE @@ -910,10 +840,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -922,6 +854,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/cuts.f b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/genps.f b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/myamp.f b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/banner.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/banner.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/check_param_card.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/file_writers.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/files.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/files.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/histograms.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/restore_data b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/restore_data +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/sum_html.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/ufomodel/write_param_card.py b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/ufomodel/write_param_card.py index 57a85b0614..33a89259f8 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/ufomodel/write_param_card.py +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/internal/ufomodel/write_param_card.py @@ -116,9 +116,10 @@ def write_param(self, param, lhablock): def write_dep_param_block(self, lhablock): import cmath from parameters import all_parameters + param_values = {'cmath':cmath} for parameter in all_parameters: try: - exec("%s = %s" % (parameter.name, parameter.value)) + exec("%s = %s" % (parameter.name, parameter.value), globals(), param_values) except Exception: pass text = "## Not dependent paramater.\n" @@ -134,7 +135,7 @@ def write_dep_param_block(self, lhablock): prefix = "DECAY " for part, param in data: if isinstance(param.value, str): - value = complex(eval(param.value)).real + value = complex(eval(param.value, globals(), param_values)).real else: value = param.value diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/bin/madevent b/epochX/cudacpp/smeft_gg_tttt.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/smeft_gg_tttt.mad/bin/madevent +++ b/epochX/cudacpp/smeft_gg_tttt.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h b/epochX/cudacpp/smeft_gg_tttt.mad/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h index 98fc59d3ea..5d28898a46 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc b/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc index e394058ac8..9508cf2675 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc +++ b/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h b/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h index 6d053c0d16..42aa13c6b6 100644 --- a/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h +++ b/epochX/cudacpp/smeft_gg_tttt.mad/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/CODEGEN_cudacpp_smeft_gg_tttt_log.txt b/epochX/cudacpp/smeft_gg_tttt.sa/CODEGEN_cudacpp_smeft_gg_tttt_log.txt index 5444229389..595d436617 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/CODEGEN_cudacpp_smeft_gg_tttt_log.txt +++ b/epochX/cudacpp/smeft_gg_tttt.sa/CODEGEN_cudacpp_smeft_gg_tttt_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,17 +49,16 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 set zerowidth_tchannel F set auto_convert_model T save options auto_convert_model -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt import model SMEFTsim_topU3l_MwScheme_UFO -massless_4t INFO: load particles INFO: load vertices @@ -73,7 +75,7 @@ INFO: load vertices DEBUG: MG5 converter defines FFFF26 to Gamma(-2,-4,-3)*Gamma(-2,2,-6)*Gamma(-1,-6,-5)*Gamma(-1,4,-4)*ProjP(-5,1)*ProjP(-3,3) + Gamma(-2,-4,-3)*Gamma(-2,4,-6)*Gamma(-1,-6,-5)*Gamma(-1,2,-4)*ProjP(-5,3)*ProjP(-3,1) + Gamma(-2,-4,-3)*Gamma(-2,2,-6)*Gamma(-1,-6,-5)*Gamma(-1,4,-4)*ProjM(-5,1)*ProjM(-3,3) + Gamma(-2,-4,-3)*Gamma(-2,4,-6)*Gamma(-1,-6,-5)*Gamma(-1,2,-4)*ProjM(-5,3)*ProjM(-3,1)  DEBUG: MG5 converter defines FFFF27 to ProjP(2,1)*ProjP(4,3) + ProjM(2,1)*ProjM(4,3)  DEBUG: MG5 converter defines FFFF112 to ProjM(2,3)*ProjM(4,1) + ProjP(2,3)*ProjP(4,1)  -DEBUG: model prefixing takes 0.12831377983093262  +DEBUG: model prefixing takes 0.034125328063964844  INFO: Change particles name to pass to MG5 convention Defined multiparticle p = g u c d s u~ c~ d~ s~ Defined multiparticle j = g u c d s u~ c~ d~ s~ @@ -88,13 +90,13 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=4: WEIGTHED IS QCD+2*QED+99*SMHLOOP+99*NP+99*NPshifts+99*NPprop+99*NPcpv+NPcbb+NPcbB+NPcbBB+NPcbd1+NPcbd8+NPcbe+NPcbG+NPcbH+NPcbj1+NPcbj8+NPcbl+NPcbu1+NPcbu8+NPcbW+NPcdB+NPcdd1+NPcdd8+NPcdG+NPcdH+NPcdW+NPceB+NPced+NPcee+NPceH+NPceu+NPceW+NPcG+NPcGtil+NPcH+NPcHB+NPcHbox+NPcHbq+NPcHBtil+NPcHd+NPcHDD+NPcHe+NPcHG+NPcHGtil+NPcHj1+NPcHj3+NPcHl1+NPcHl3+NPcHQ1+NPcHQ3+NPcHt+NPcHtb+NPcHu+NPcHud+NPcHW+NPcHWB+NPcHWBtil+NPcHWtil+NPcjd1+NPcjd8+NPcje+NPcjj11+NPcjj18+NPcjj31+NPcjj38+NPcjQbd1+NPcjQbd8+NPcjQtu1+NPcjQtu8+NPcjtQd1+NPcjtQd8+NPcju1+NPcju8+NPcjujd1+NPcjujd11+NPcjujd8+NPcjujd81+NPcjuQb1+NPcjuQb8+NPcld+NPcle+NPclebQ+NPcledj+NPcleju1+NPcleju3+NPcleQt1+NPcleQt3+NPclj1+NPclj3+NPcll+NPcll1+NPclu+NPcQb1+NPcQb8+NPcQd1+NPcQd8+NPcQe+NPcQj11+NPcQj18+NPcQj31+NPcQj38+NPcQl1+NPcQl3+NPcQQ1+NPcQQ8+NPcQt1+NPcQt8+NPcQtjd1+NPcQtjd8+NPcQtQb1+NPcQtQb8+NPcQu1+NPcQu8+NPcQujb1+NPcQujb8+NPctB+NPctb1+NPctb8+NPctd1+NPctd8+NPcte+NPctG+NPctH+NPctj1+NPctj8+NPctl+NPctt+NPctu1+NPctu8+NPctW+NPcuB+NPcud1+NPcud8+NPcuG+NPcuH+NPcutbd1+NPcutbd8+NPcuu1+NPcuu8+NPcuW+NPcW+NPcWtil+NPQjujb8 INFO: Trying process: g g > t t~ t t~ WEIGHTED<=4 @1 INFO: Process has 72 diagrams -1 processes with 72 diagrams generated in 3.671 s +1 processes with 72 diagrams generated in 1.407 s Total: 1 processes with 72 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ t t~ WEIGHTED<=4 @1 INFO: Processing color information for process: g g > t t~ t t~ @1 @@ -103,18 +105,18 @@ INFO: Processing color information for process: g g > t t~ t t~ @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/. -Generated helas calls for 1 subprocesses (72 diagrams) in 0.186 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/. +Generated helas calls for 1 subprocesses (72 diagrams) in 0.094 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV5 routines ALOHA: aloha creates FFV1 routines ALOHA: aloha creates VVVV1 routines ALOHA: aloha creates VVVV9 routines ALOHA: aloha creates VVVV10 routines -ALOHA: aloha creates 5 routines in 0.316 s +ALOHA: aloha creates 5 routines in 0.141 s VVV5 VVV5 FFV1 @@ -124,17 +126,17 @@ ALOHA: aloha creates 5 routines in 0.316 s VVVV1 VVVV9 VVVV10 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/./HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h -INFO: Created file HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/./HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h +INFO: Created file HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/./Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc INFO: Created files Parameters_SMEFTsim_topU3l_MwScheme_UFO.h and Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_smeft_gg_tttt/src/. quit -real 0m5.073s -user 0m4.975s -sys 0m0.073s -Code generation completed in 5 seconds +real 0m3.197s +user 0m2.112s +sys 0m0.129s +Code generation completed in 3 seconds diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/Bridge.h b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryBuffers.h index 2f711d8cc1..517396f37e 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_SMEFTsim_topU3l_MwScheme_UFO.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.cc b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.cc index 6a64c39915..83d82d86f0 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.cc +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -1587,7 +1651,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -1959,9 +2025,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -1969,7 +2032,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -1994,11 +2056,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -2011,17 +2074,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -2136,38 +2189,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -2340,11 +2362,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.h b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.h index d207c3303f..9672910a40 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h b/epochX/cudacpp/smeft_gg_tttt.sa/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h index 98fc59d3ea..5d28898a46 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/src/HelAmps_SMEFTsim_topU3l_MwScheme_UFO.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc b/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc index e394058ac8..9508cf2675 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc +++ b/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h b/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h index 6d053c0d16..42aa13c6b6 100644 --- a/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h +++ b/epochX/cudacpp/smeft_gg_tttt.sa/src/Parameters_SMEFTsim_topU3l_MwScheme_UFO.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/CODEGEN_mad_susy_gg_t1t1_log.txt b/epochX/cudacpp/susy_gg_t1t1.mad/CODEGEN_mad_susy_gg_t1t1_log.txt index 1690ef1273..ad4ffdb55f 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/CODEGEN_mad_susy_gg_t1t1_log.txt +++ b/epochX/cudacpp/susy_gg_t1t1.mad/CODEGEN_mad_susy_gg_t1t1_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -550,21 +552,21 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=2: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t1 t1~ WEIGHTED<=2 @1 INFO: Process has 6 diagrams -1 processes with 6 diagrams generated in 0.124 s +1 processes with 6 diagrams generated in 0.069 s Total: 1 processes with 6 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_susy_gg_t1t1 --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_susy_gg_t1t1 INFO: remove old information in CODEGEN_mad_susy_gg_t1t1 DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1 -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1 +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t1 t1~ WEIGHTED<=2 @1 INFO: Processing color information for process: g g > t1 t1~ @1 @@ -576,58 +578,60 @@ FileWriter t1 t1~ WEIGHTED<=2 @1 INFO: Finding symmetric diagrams for subprocess group gg_t1t1x -DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 2, 2: 3, 3: 4, 4: 5, 5: 6} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {2: 1, 3: 2, 4: 3, 5: 4, 6: 5} [model_handling.py at line 1552]  -Generated helas calls for 1 subprocesses (6 diagrams) in 0.009 s -Wrote files for 16 helas calls in 0.082 s +DEBUG: len(subproc_diagrams_for_config) =  5 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 2, 2: 3, 3: 4, 4: 5, 5: 6} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {2: 1, 3: 2, 4: 3, 5: 4, 6: 5} [model_handling.py at line 1563]  +Generated helas calls for 1 subprocesses (6 diagrams) in 0.006 s +Wrote files for 16 helas calls in 0.746 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates VSS1 routines ALOHA: aloha creates VVSS1 routines -ALOHA: aloha creates 3 routines in 0.186 s +ALOHA: aloha creates 3 routines in 0.086 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates VSS1 routines ALOHA: aloha creates VVSS1 routines -ALOHA: aloha creates 6 routines in 0.184 s +ALOHA: aloha creates 6 routines in 0.077 s VVV1 VSS1 VSS1 VSS1 VVSS1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/./HelAmps_MSSM_SLHA2.h -INFO: Created file HelAmps_MSSM_SLHA2.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/./HelAmps_MSSM_SLHA2.h +INFO: Created file HelAmps_MSSM_SLHA2.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.cc INFO: Created files Parameters_MSSM_SLHA2.h and Parameters_MSSM_SLHA2.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/SubProcesses/P1_gg_t1t1x; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/SubProcesses/P1_gg_t1t1x; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f Hunk #2 succeeded at 215 (offset -12 lines). DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1 done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1 done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/README Run "open index.html" to see more information about this process. quit -real 0m2.996s -user 0m2.690s -sys 0m0.299s -Code generation completed in 3 seconds +real 0m7.114s +user 0m1.722s +sys 0m0.685s +Code generation completed in 8 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -640,7 +644,7 @@ Code generation completed in 3 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -648,10 +652,9 @@ Code generation completed in 3 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -670,7 +673,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -678,10 +681,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_t1t1/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/ident_card.dat b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/ident_card.dat index 9cfb7ac1a2..0c5a1bdd83 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/ident_card.dat +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/ident_card.dat @@ -232,9 +232,9 @@ mse2 3 3 mdl_RmE23x3 msl2 1 1 mdl_RmL21x1 msl2 3 3 mdl_RmL23x3 msoft 1 mdl_RMx1 +msoft 2 mdl_RMx2 msoft 21 mdl_mHd2 msoft 22 mdl_mHu2 -msoft 2 mdl_RMx2 msoft 3 mdl_RMx3 msq2 1 1 mdl_RmQ21x1 msq2 3 3 mdl_RmQ23x3 diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/me5_configuration.txt b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/proc_card_mg5.dat index 9025117612..34ff9bfe0b 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card.dat b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card.dat index 6b82577032..000832aacd 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card.dat +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card_default.dat b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card_default.dat index b8db871c35..85e1d39035 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/MGMEVersion.txt b/epochX/cudacpp/susy_gg_t1t1.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/MGMEVersion.txt +++ b/epochX/cudacpp/susy_gg_t1t1.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Source/alfas_functions.f b/epochX/cudacpp/susy_gg_t1t1.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Source/cuts.inc b/epochX/cudacpp/susy_gg_t1t1.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Source/cuts.inc +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Source/make_opts b/epochX/cudacpp/susy_gg_t1t1.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Source/make_opts +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Source/makefile b/epochX/cudacpp/susy_gg_t1t1.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Source/makefile +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Source/param_card.inc b/epochX/cudacpp/susy_gg_t1t1.mad/Source/param_card.inc index 6acb037f00..a3d72e8ed8 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Source/param_card.inc +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Source/param_card.inc @@ -81,9 +81,9 @@ MDL_RML21X1 = 3.815567D+04 MDL_RML23X3 = 3.782868D+04 MDL_RMX1 = 1.013965D+02 + MDL_RMX2 = 1.915042D+02 MDL_MHD2 = 3.233749D+04 MDL_MHU2 = -1.288001D+05 - MDL_RMX2 = 1.915042D+02 MDL_RMX3 = 5.882630D+02 MDL_RMQ21X1 = 2.998367D+05 MDL_RMQ23X3 = 2.487654D+05 diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/Source/run_card.inc b/epochX/cudacpp/susy_gg_t1t1.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/Source/run_card.inc +++ b/epochX/cudacpp/susy_gg_t1t1.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/Bridge.h b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryBuffers.h index 5bd3053393..ac5f50dc7e 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_MSSM_SLHA2.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.cc b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.cc index 1b3601c86b..565ed216a5 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.cc +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -344,8 +408,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 VSS1_0( w_fp[4], w_fp[3], w_fp[2], COUPs[2], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] += cxtype( 0, 1 ) * amp_sv[0]; @@ -358,8 +425,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 VSS1_0( w_fp[1], w_fp[3], w_fp[4], COUPs[2], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; @@ -371,8 +441,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 4 VSS1_0( w_fp[1], w_fp[3], w_fp[4], COUPs[3], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 4 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[3] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += amp_sv[0]; @@ -384,8 +457,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 5 VSS1_0( w_fp[1], w_fp[4], w_fp[2], COUPs[2], 1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 5 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[4] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; @@ -397,8 +473,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 6 VSS1_0( w_fp[1], w_fp[2], w_fp[4], COUPs[3], -1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 6 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[5] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] += amp_sv[0]; @@ -578,7 +657,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -946,9 +1027,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -956,7 +1034,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -981,11 +1058,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -998,17 +1076,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1123,38 +1191,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1327,11 +1364,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.h b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.h index d48c729c48..07a31771d8 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig.f b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig.f index 28f44ab169..9e2acdc418 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig.f +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig1.f b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig1.f index 40fbb596f2..ad9ea5451b 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig1.f +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/matrix1.f b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/matrix1.f index 1a1830b77a..b0d0f941da 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/matrix1.f +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -295,7 +295,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -338,7 +338,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -383,11 +384,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /5.333333333333333D+00, - $ -6.666666666666666D-01/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 2) /16,-4/ C 1 T(1,2,3,4) - DATA (CF(I, 2),I= 1, 2) /-6.666666666666666D-01 - $ ,5.333333333333333D+00/ + DATA (CF(I),I= 3, 3) /16/ C 1 T(2,1,3,4) C ---------- C BEGIN CODE @@ -451,10 +451,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -463,6 +465,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(2)=AMP2(2)+AMP(3)*DCONJG(AMP(3)) diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/cuts.f b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/genps.f b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/myamp.f b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/banner.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/banner.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/check_param_card.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/file_writers.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/files.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/files.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/histograms.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/restore_data b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/restore_data +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/sum_html.py b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/bin/madevent b/epochX/cudacpp/susy_gg_t1t1.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/susy_gg_t1t1.mad/bin/madevent +++ b/epochX/cudacpp/susy_gg_t1t1.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/src/HelAmps_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_t1t1.mad/src/HelAmps_MSSM_SLHA2.h index ec627d7759..f05906d14b 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/src/HelAmps_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/src/HelAmps_MSSM_SLHA2.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.cc b/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.cc index d596fdf1ec..5ca089b9f5 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.cc +++ b/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.h index 26a532156c..07fc1620c5 100644 --- a/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_t1t1.mad/src/Parameters_MSSM_SLHA2.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/CODEGEN_cudacpp_susy_gg_t1t1_log.txt b/epochX/cudacpp/susy_gg_t1t1.sa/CODEGEN_cudacpp_susy_gg_t1t1_log.txt index 45c009959b..e5467cdc87 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/CODEGEN_cudacpp_susy_gg_t1t1_log.txt +++ b/epochX/cudacpp/susy_gg_t1t1.sa/CODEGEN_cudacpp_susy_gg_t1t1_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -550,13 +552,13 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=2: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t1 t1~ WEIGHTED<=2 @1 INFO: Process has 6 diagrams -1 processes with 6 diagrams generated in 0.122 s +1 processes with 6 diagrams generated in 0.072 s Total: 1 processes with 6 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1 Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1 +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1 INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t1 t1~ WEIGHTED<=2 @1 INFO: Processing color information for process: g g > t1 t1~ @1 @@ -565,32 +567,32 @@ INFO: Processing color information for process: g g > t1 t1~ @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/. -Generated helas calls for 1 subprocesses (6 diagrams) in 0.008 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/. +Generated helas calls for 1 subprocesses (6 diagrams) in 0.005 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates VSS1 routines ALOHA: aloha creates VVSS1 routines -ALOHA: aloha creates 3 routines in 0.182 s +ALOHA: aloha creates 3 routines in 0.090 s VVV1 VSS1 VSS1 VSS1 VVSS1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/./HelAmps_MSSM_SLHA2.h -INFO: Created file HelAmps_MSSM_SLHA2.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/./HelAmps_MSSM_SLHA2.h +INFO: Created file HelAmps_MSSM_SLHA2.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/./Parameters_MSSM_SLHA2.cc INFO: Created files Parameters_MSSM_SLHA2.h and Parameters_MSSM_SLHA2.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_t1t1/src/. quit -real 0m1.324s -user 0m1.250s -sys 0m0.065s -Code generation completed in 1 seconds +real 0m2.636s +user 0m0.809s +sys 0m0.145s +Code generation completed in 3 seconds diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/Bridge.h b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryBuffers.h index 5bd3053393..ac5f50dc7e 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_MSSM_SLHA2.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.cc b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.cc index 1d53b4a535..ed1f554d68 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.cc +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -579,7 +643,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -947,9 +1013,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -957,7 +1020,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -982,11 +1044,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -999,17 +1062,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1124,38 +1177,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1328,11 +1350,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.h b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.h index d48c729c48..07a31771d8 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/src/HelAmps_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_t1t1.sa/src/HelAmps_MSSM_SLHA2.h index ec627d7759..f05906d14b 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/src/HelAmps_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/src/HelAmps_MSSM_SLHA2.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.cc b/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.cc index d596fdf1ec..5ca089b9f5 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.cc +++ b/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.h index 26a532156c..07fc1620c5 100644 --- a/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_t1t1.sa/src/Parameters_MSSM_SLHA2.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.mad/CODEGEN_mad_susy_gg_tt_log.txt b/epochX/cudacpp/susy_gg_tt.mad/CODEGEN_mad_susy_gg_tt_log.txt index 9e7dad46ce..80f5b82746 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/CODEGEN_mad_susy_gg_tt_log.txt +++ b/epochX/cudacpp/susy_gg_tt.mad/CODEGEN_mad_susy_gg_tt_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,10 +49,9 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 @@ -550,21 +552,21 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=2: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ WEIGHTED<=2 @1 INFO: Process has 3 diagrams -1 processes with 3 diagrams generated in 0.118 s +1 processes with 3 diagrams generated in 0.052 s Total: 1 processes with 3 diagrams output madevent_simd ../TMPOUT/CODEGEN_mad_susy_gg_tt --hel_recycling=False --vector_size=32 Output will be done with PLUGIN: CUDACPP_OUTPUT Addition matrix-element will be done with PLUGIN: CUDACPP_OUTPUT -DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4334]  +DEBUG: opt['output_options']['vector_size'] =  32 [export_v4.py at line 4166]  Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  INFO: initialize a new directory: CODEGEN_mad_susy_gg_tt INFO: remove old information in CODEGEN_mad_susy_gg_tt DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards  -WARNING: File exists /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/SubProcesses  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt  +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards  +WARNING: File exists /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/SubProcesses  INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ WEIGHTED<=2 @1 INFO: Processing color information for process: g g > t t~ @1 @@ -576,54 +578,56 @@ FileWriter t t~ WEIGHTED<=2 @1 INFO: Finding symmetric diagrams for subprocess group gg_ttx -DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1527]  -DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1551]  -DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1552]  +DEBUG: len(subproc_diagrams_for_config) =  3 [model_handling.py at line 1538]  +DEBUG: iconfig_to_diag =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1562]  +DEBUG: diag_to_iconfig =  {1: 1, 2: 2, 3: 3} [model_handling.py at line 1563]  Generated helas calls for 1 subprocesses (3 diagrams) in 0.007 s -Wrote files for 10 helas calls in 0.076 s +Wrote files for 10 helas calls in 2.134 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines -ALOHA: aloha creates 2 routines in 0.137 s +ALOHA: aloha creates 2 routines in 0.070 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines -ALOHA: aloha creates 4 routines in 0.133 s +ALOHA: aloha creates 4 routines in 0.060 s VVV1 FFV1 FFV1 FFV1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/./HelAmps_MSSM_SLHA2.h -INFO: Created file HelAmps_MSSM_SLHA2.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/./HelAmps_MSSM_SLHA2.h +INFO: Created file HelAmps_MSSM_SLHA2.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/./Parameters_MSSM_SLHA2.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/./Parameters_MSSM_SLHA2.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/./Parameters_MSSM_SLHA2.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/./Parameters_MSSM_SLHA2.cc INFO: Created files Parameters_MSSM_SLHA2.h and Parameters_MSSM_SLHA2.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/src/. The option zerowidth_tchannel is modified [True] but will not be written in the configuration files. If you want to make this value the default for future session, you can run 'save options --all' -save configuration file to /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt +save configuration file to /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt INFO: Use Fortran compiler gfortran INFO: Use c++ compiler g++ INFO: Generate jpeg diagrams INFO: Generate web pages -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt; patch -p4 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt; patch -p4 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.common patching file SubProcesses/makefile -DEBUG: cd /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/SubProcesses/P1_gg_ttx; patch -p6 -i /data/avalassi/GPU2023/madgraph4gpuX/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 +DEBUG: cd /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/SubProcesses/P1_gg_ttx; patch -p6 -i /shared/roiser/sw/madgraph4gpu/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/MG5aMC_patches/PROD/patch.P1 patching file driver.f patching file matrix1.f DEBUG: p.returncode =  0 [output.py at line 263]  -Output to directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt done. +Output to directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt done. Type "launch" to generate events from this process, or see -/data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/README +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/README Run "open index.html" to see more information about this process. quit -real 0m2.854s -user 0m2.558s -sys 0m0.284s -Code generation completed in 3 seconds +real 0m9.583s +user 0m1.731s +sys 0m0.761s +Code generation completed in 10 seconds +/shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/bin/internal/banner.py:3309: SyntaxWarning: invalid escape sequence '\s' + function_pat = re.compile('^\s+(?:SUBROUTINE|(?:%(type)s)\s+function)\s+([a-zA-Z]\w*)' \ ************************************************************ * * * W E L C O M E to * @@ -636,7 +640,7 @@ Code generation completed in 3 seconds * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -644,10 +648,9 @@ Code generation completed in 3 seconds * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards run @@ -666,7 +669,7 @@ launch in debug mode * * * * * * * * * * * * -* VERSION 3.6.0 * +* VERSION 3.6.2 * * * * The MadGraph5_aMC@NLO Development Team - Find us at * * https://server06.fynu.ucl.ac.be/projects/madgraph * @@ -674,10 +677,9 @@ launch in debug mode * Type 'help' for in-line help. * * * ************************************************************ -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo/input/mg5_configuration.txt -INFO: load configuration from /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo/input/mg5_configuration.txt +INFO: load configuration from /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_mad_susy_gg_tt/Cards/me5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt treatcards param diff --git a/epochX/cudacpp/susy_gg_tt.mad/Cards/ident_card.dat b/epochX/cudacpp/susy_gg_tt.mad/Cards/ident_card.dat index 9cfb7ac1a2..0c5a1bdd83 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Cards/ident_card.dat +++ b/epochX/cudacpp/susy_gg_tt.mad/Cards/ident_card.dat @@ -232,9 +232,9 @@ mse2 3 3 mdl_RmE23x3 msl2 1 1 mdl_RmL21x1 msl2 3 3 mdl_RmL23x3 msoft 1 mdl_RMx1 +msoft 2 mdl_RMx2 msoft 21 mdl_mHd2 msoft 22 mdl_mHu2 -msoft 2 mdl_RMx2 msoft 3 mdl_RMx3 msq2 1 1 mdl_RmQ21x1 msq2 3 3 mdl_RmQ23x3 diff --git a/epochX/cudacpp/susy_gg_tt.mad/Cards/me5_configuration.txt b/epochX/cudacpp/susy_gg_tt.mad/Cards/me5_configuration.txt index 68b4c46295..a0212bfb62 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Cards/me5_configuration.txt +++ b/epochX/cudacpp/susy_gg_tt.mad/Cards/me5_configuration.txt @@ -235,7 +235,7 @@ # pineappl = pineappl -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo # MG5 MAIN DIRECTORY -#mg5_path = /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/mg5amcnlo +#mg5_path = /shared/roiser/sw/madgraph4gpu/MG5aMC/mg5amcnlo diff --git a/epochX/cudacpp/susy_gg_tt.mad/Cards/proc_card_mg5.dat b/epochX/cudacpp/susy_gg_tt.mad/Cards/proc_card_mg5.dat index 25f63a3016..012955821d 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Cards/proc_card_mg5.dat +++ b/epochX/cudacpp/susy_gg_tt.mad/Cards/proc_card_mg5.dat @@ -8,7 +8,7 @@ #* * * * #* * #* * -#* VERSION 3.6.0 2024-09-30 * +#* VERSION 3.6.2 2025-03-19 * #* * #* WARNING: UNKNOWN DEVELOPMENT VERSION. * #* WARNING: DO NOT USE FOR PRODUCTION * diff --git a/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card.dat b/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card.dat index 6b82577032..000832aacd 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card.dat +++ b/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card_default.dat b/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card_default.dat index b8db871c35..85e1d39035 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card_default.dat +++ b/epochX/cudacpp/susy_gg_tt.mad/Cards/run_card_default.dat @@ -107,6 +107,7 @@ # Parton level cuts definition * #******************************* 0.0 = dsqrt_shat ! minimal shat for full process + -1 = dsqrt_shatmax ! maximum shat for full process # # #********************************************************************* diff --git a/epochX/cudacpp/susy_gg_tt.mad/MGMEVersion.txt b/epochX/cudacpp/susy_gg_tt.mad/MGMEVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/MGMEVersion.txt +++ b/epochX/cudacpp/susy_gg_tt.mad/MGMEVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/susy_gg_tt.mad/Source/alfas_functions.f b/epochX/cudacpp/susy_gg_tt.mad/Source/alfas_functions.f index bb69a6384e..84aeff369c 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Source/alfas_functions.f +++ b/epochX/cudacpp/susy_gg_tt.mad/Source/alfas_functions.f @@ -188,6 +188,10 @@ SUBROUTINE NEWTON1(T,A_IN,A_OUT,NLOOP,NF) A_OUT=A_IN/(1D0+A_IN*B0(NF)*T) IF (NLOOP .EQ. 1) RETURN + if (1D0+A_IN*B0(NF)*T.le.0d0)THEN + A_OUT = 9d98 + RETURN + ENDIF A_OUT=A_IN/(1D0+B0(NF)*A_IN*T+C1(NF)*A_IN*LOG(1D0+A_IN*B0(NF)*T)) IF (A_OUT .LT. 0D0) AS=0.3D0 30 AS=A_OUT diff --git a/epochX/cudacpp/susy_gg_tt.mad/Source/cuts.inc b/epochX/cudacpp/susy_gg_tt.mad/Source/cuts.inc index 23d099e5f7..a8ccc7420d 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Source/cuts.inc +++ b/epochX/cudacpp/susy_gg_tt.mad/Source/cuts.inc @@ -37,7 +37,7 @@ C REAL*8 misset,missetmax,ptheavy REAL*8 ptllmin,ptllmax integer maxjetflavor - REAl*8 dsqrt_shat + REAl*8 dsqrt_shat,dsqrt_shatmax COMMON /to_min_max_cuts/ & PTJmax,PTBmax,PTAmax,PTLmax, @@ -60,7 +60,7 @@ C & ht2max,ht3max,ht4max, & htjmin,htjmax,ihtmin,ihtmax, & misset,missetmax,ptheavy, - & ptllmin,ptllmax,dsqrt_shat, + & ptllmin,ptllmax,dsqrt_shat,dsqrt_shatmax, & maxjetflavor C diff --git a/epochX/cudacpp/susy_gg_tt.mad/Source/make_opts b/epochX/cudacpp/susy_gg_tt.mad/Source/make_opts index e4b87ee6ad..f9f7b64bb5 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Source/make_opts +++ b/epochX/cudacpp/susy_gg_tt.mad/Source/make_opts @@ -5,8 +5,8 @@ GLOBAL_FLAG=-O3 -ffast-math -fbounds-check MACFLAG= MG5AMC_VERSION=SpecifiedByMG5aMCAtRunTime PYTHIA8_PATH=NotInstalled -STDLIB_FLAG= STDLIB=-lstdc++ +STDLIB_FLAG= #end_of_make_opts_variables BIASLIBDIR=../../../lib/ diff --git a/epochX/cudacpp/susy_gg_tt.mad/Source/makefile b/epochX/cudacpp/susy_gg_tt.mad/Source/makefile index 291ca907ee..f9321e7a94 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Source/makefile +++ b/epochX/cudacpp/susy_gg_tt.mad/Source/makefile @@ -73,6 +73,7 @@ $(BINDIR)gensudgrid: $(GENSUDGRID) $(LIBDIR)libpdf.$(libext) $(LIBDIR)libgammaUP # Dependencies dsample.o: DiscreteSampler.o dsample.f genps.inc StringCast.o vector.inc +pawgraph.o: vector.inc DiscreteSampler.o: StringCast.o invarients.o: invarients.f genps.inc gen_ximprove.o: gen_ximprove.f run_config.inc run_card.inc diff --git a/epochX/cudacpp/susy_gg_tt.mad/Source/param_card.inc b/epochX/cudacpp/susy_gg_tt.mad/Source/param_card.inc index 6acb037f00..a3d72e8ed8 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Source/param_card.inc +++ b/epochX/cudacpp/susy_gg_tt.mad/Source/param_card.inc @@ -81,9 +81,9 @@ MDL_RML21X1 = 3.815567D+04 MDL_RML23X3 = 3.782868D+04 MDL_RMX1 = 1.013965D+02 + MDL_RMX2 = 1.915042D+02 MDL_MHD2 = 3.233749D+04 MDL_MHU2 = -1.288001D+05 - MDL_RMX2 = 1.915042D+02 MDL_RMX3 = 5.882630D+02 MDL_RMQ21X1 = 2.998367D+05 MDL_RMQ23X3 = 2.487654D+05 diff --git a/epochX/cudacpp/susy_gg_tt.mad/Source/run_card.inc b/epochX/cudacpp/susy_gg_tt.mad/Source/run_card.inc index 1a1bc782bd..8bd5f73840 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/Source/run_card.inc +++ b/epochX/cudacpp/susy_gg_tt.mad/Source/run_card.inc @@ -88,6 +88,8 @@ DSQRT_SHAT = 0.000000000000000D+00 + DSQRT_SHATMAX = -1 + LIMHEL = 0.000000000000000D+00 PTJ = 2.000000000000000D+01 diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/Bridge.h b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/Bridge.h +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/GpuRuntime.h b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MGVersion.txt b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MGVersion.txt index 084e244cea..77a069e39b 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MGVersion.txt +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MGVersion.txt @@ -1 +1 @@ -3.6.0 \ No newline at end of file +3.6.2 \ No newline at end of file diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryBuffers.h index 5bd3053393..ac5f50dc7e 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_MSSM_SLHA2.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc index 5c62f1bfad..53ccffcff2 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -335,8 +399,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 1 FFV1_0( w_fp[3], w_fp[2], w_fp[4], COUPs[1], -1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 1 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[0] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] += cxtype( 0, 1 ) * amp_sv[0]; jamp_sv[1] -= cxtype( 0, 1 ) * amp_sv[0]; @@ -349,8 +416,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 2 FFV1_0( w_fp[3], w_fp[4], w_fp[1], COUPs[1], -1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 2 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[1] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[0] -= amp_sv[0]; @@ -362,8 +432,11 @@ namespace mg5amcCpu // Amplitude(s) for diagram number 3 FFV1_0( w_fp[4], w_fp[2], w_fp[1], COUPs[1], -1.0, &_fp[0] ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - if( channelId == 3 ) numerators_sv += cxabs2( amp_sv[0] ); - if( channelId != 0 ) denominators_sv += cxabs2( amp_sv[0] ); + if( channelId != 0 ) + { + numerators_sv[2] += cxabs2( amp_sv[0] ); + denominators_sv += cxabs2( amp_sv[0] ); + } #endif jamp_sv[1] -= amp_sv[0]; @@ -555,7 +628,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -923,9 +998,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -933,7 +1005,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -958,11 +1029,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -975,17 +1047,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1100,38 +1162,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1304,11 +1335,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h index 24c27005b8..7a900b2e53 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f index bc9bcfeb9b..5d6ef2ba62 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig.f @@ -376,7 +376,7 @@ SUBROUTINE DSIG_VEC(ALL_P,ALL_WGT,ALL_XBK,ALL_Q2FACT,ALL_CM_RAP DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f index db3c284caa..f46e9bfaf0 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/auto_dsig1.f @@ -1,7 +1,7 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -137,14 +137,14 @@ DOUBLE PRECISION FUNCTION DSIG1(PP,WGT,IMODE) ENDDO QSCALE=QSCALE/2D0 ELSE - QSCALE=DSQRT(Q2FACT(IB(1))) + QSCALE=DSQRT(Q2FACT(1)) ENDIF G1=PDG2PDF(LPP(IB(1)),0, IB(1),XBK(IB(1)), QSCALE) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) IF (DSQRT(Q2FACT(IB(2))).NE.0D0) THEN - QSCALE=DSQRT(Q2FACT(IB(2))) + QSCALE=DSQRT(Q2FACT(2)) ENDIF G2=PDG2PDF(LPP(IB(2)),0, IB(2),XBK(IB(2)), QSCALE) ENDIF @@ -219,7 +219,7 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, $ ICONF_VEC, IMIRROR_VEC, VECSIZE_USED) C **************************************************** C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -290,6 +290,10 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, INTEGER I_EE C +C STUFF FOR UPC +C + DOUBLE PRECISION PHOTONPDFSQUARE +C C EXTERNAL FUNCTIONS C LOGICAL PASSCUTS @@ -373,12 +377,12 @@ DOUBLE PRECISION FUNCTION DSIG1_VEC(ALL_PP, ALL_XBK, ALL_Q2FACT, IF (ABS(LPP(IB(1))).GE.1) THEN C LP=SIGN(1,LPP(IB(1))) G1(IVEC)=PDG2PDF(LPP(IB(1)),0, IB(1),ALL_XBK(IB(1),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(1), IVEC))) + $ ,DSQRT(ALL_Q2FACT(1, IVEC))) ENDIF IF (ABS(LPP(IB(2))).GE.1) THEN C LP=SIGN(1,LPP(IB(2))) G2(IVEC)=PDG2PDF(LPP(IB(2)),0, IB(2),ALL_XBK(IB(2),IVEC) - $ ,DSQRT(ALL_Q2FACT(IB(2), IVEC))) + $ ,DSQRT(ALL_Q2FACT(2, IVEC))) ENDIF ENDDO ! IWARP LOOP ENDDO ! CURRWARP LOOP diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f index c9610a83ed..830fa90006 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/matrix1.f @@ -1,7 +1,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, $ ICOL) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -307,7 +307,7 @@ SUBROUTINE SMATRIX1(P, RHEL, RCOL, CHANNEL, IVEC, ANS, IHEL, REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C -C Generated by MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +C Generated by MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 C By the MadGraph5_aMC@NLO Development Team C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch C @@ -350,7 +350,8 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C INTEGER I,J,M,N COMPLEX*16 ZTEMP, TMP_JAMP(0) - REAL*8 CF(NCOLOR,NCOLOR) + INTEGER CF(NCOLOR*(NCOLOR+1)/2) + INTEGER DENOM, CF_INDEX COMPLEX*16 AMP(NGRAPHS), JAMP(NCOLOR,NAMPSO) COMPLEX*16 W(6,NWAVEFUNCS) C Needed for v4 models @@ -393,11 +394,10 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) C C COLOR DATA C - DATA (CF(I, 1),I= 1, 2) /5.333333333333333D+00, - $ -6.666666666666666D-01/ + DATA DENOM/3/ + DATA (CF(I),I= 1, 2) /16,-4/ C 1 T(1,2,3,4) - DATA (CF(I, 2),I= 1, 2) /-6.666666666666666D-01 - $ ,5.333333333333333D+00/ + DATA (CF(I),I= 3, 3) /16/ C 1 T(2,1,3,4) C ---------- C BEGIN CODE @@ -446,10 +446,12 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) MATRIX1 = 0.D0 DO M = 1, NAMPSO + CF_INDEX = 0 DO I = 1, NCOLOR ZTEMP = (0.D0,0.D0) - DO J = 1, NCOLOR - ZTEMP = ZTEMP + CF(J,I)*JAMP(J,M) + DO J = I, NCOLOR + CF_INDEX = CF_INDEX + 1 + ZTEMP = ZTEMP + CF(CF_INDEX)*JAMP(J,M) ENDDO DO N = 1, NAMPSO @@ -458,6 +460,7 @@ REAL*8 FUNCTION MATRIX1(P,NHEL,IC, IHEL,AMP2, JAMP2, IVEC) ENDDO ENDDO ENDDO + MATRIX1 = MATRIX1/DENOM IF(SDE_STRAT.EQ.1)THEN AMP2(1)=AMP2(1)+AMP(1)*DCONJG(AMP(1)) diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/cuts.f b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/cuts.f index 7898714201..bd50ab1357 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/cuts.f +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/cuts.f @@ -307,12 +307,18 @@ LOGICAL FUNCTION PASSCUTS(P, VECSIZE_USED) c c Limit S_hat c - if (dsqrt_shat.ne.0d0)then - if (nincoming.eq.2.and.sumdot(p(0,1),p(0,2),1d0) .lt. dsqrt_shat**2) then - passcuts=.false. - return - endif - endif + if(nincoming.eq.2) then + if (dsqrt_shat.ne.0d0.or.dsqrt_shatmax.ne.-1d0)then + xvar = sumdot(p(0,1),p(0,2),1d0) + if (xvar .lt. dsqrt_shat**2)then + passcuts=.false. + return + else if (dsqrt_shatmax.ne.-1d0 .and. xvar .gt. dsqrt_shatmax**2)then + passcuts = .false. + return + endif + endif + endif C $B$ DESACTIVATE_CUT $E$ !This is a tag for MadWeight if(debug) write (*,*) '=============================' diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/genps.f b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/genps.f index 1c32e93f5d..8503bdbec8 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/genps.f +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/genps.f @@ -1373,6 +1373,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) double precision smin,smax,spole,swidth,s,jac double precision x logical pass + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' c c Local c @@ -1384,6 +1388,10 @@ subroutine gen_s(x,smin,smax,spole,swidth,s,jac,pass) c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1d0)then + smax = min(smax, dsqrt_shatmax**2) + endif + pass=.true. if (jac .eq. 0 .and. .not. warned0) then print*,'Input jacobian 0 in genps' @@ -1628,7 +1636,10 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) DOUBLE PRECISION ETA,ETAMIN,ETAMAX logical warned data warned/.false./ - + include 'maxparticles.inc' + include '../../Source/vector.inc' + include 'run.inc' + include 'cuts.inc' C------------ C BEGIN CODE C------------ @@ -1645,7 +1656,11 @@ SUBROUTINE GENCMS(S,X1,X2,X,SMIN,SJACOBI) C IF THERE IS NO S CHANNEL POLE USE BELOW: TAUMIN = 0d0 !SMIN/S !keep scale fix - TAUMAX = 1D0 + if (dsqrt_shatmax.ne.-1d0)then + TAUMAX=dsqrt_shatmax**2/S + else + TAUMAX = 1D0 + endif TAU = (TAUMAX-TAUMIN)*X(1)+TAUMIN SJACOBI= sjacobi*(TAUMAX-TAUMIN) @@ -1915,7 +1930,7 @@ double precision function get_channel_cut(p, config) if(sde_strat.eq.2)then t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) - get_channel_cut = get_channel_cut / ((t-Mass)*(t+Mass)+stot*1d-10)**2 + get_channel_cut = get_channel_cut / (t-Mass**2+stot*1d-10)**2 endif c write(*,*) i, "t, Mass, fact", t, Mass, ((t-Mass)*(t+Mass))**2,get_channel_cut t = t/stot @@ -1930,9 +1945,9 @@ double precision function get_channel_cut(p, config) t = dot(ptemp(0,-i), ptemp(0,-i)) Mass = prmass(-i, config) Width = prwidth(-i, config) - tmp = (t-Mass)*(t+Mass) + tmp = (t-Mass**2) tmp2 = Mass*Width - get_channel_cut = get_channel_cut* (tmp**2 - tmp2**2)/(tmp**2 + tmp2**2)**2 + get_channel_cut = get_channel_cut/(tmp**2 + tmp2**2) endif c write(*,*) i, "s, Mass, Width, fact", t, Mass, Width, (((t-Mass)*(t+Mass) )**2 + Width**2*Mass**2), get_channel_cut endif diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/myamp.f b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/myamp.f index 9e5f8d44dd..5360566ef4 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/myamp.f +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/myamp.f @@ -231,6 +231,7 @@ subroutine set_peaks double precision x1,x2,xk(nexternal) double precision dr,mtot,etot,xqfact double precision spmass + double precision stot ! technically the min with dsqrt_shatmax**2 with the physical one integer i, iconfig, l1, l2, j, nt, nbw, iproc, k integer iden_part(-nexternal+1:nexternal) @@ -285,8 +286,8 @@ subroutine set_peaks integer lbw(0:nexternal) !Use of B.W. common /to_BW/ lbw - double precision stot,m1,m2 - common/to_stot/stot,m1,m2 + double precision real_stot,m1,m2 + common/to_stot/real_stot,m1,m2 include 'coupl.inc' ! needs VECSIZE_MEMMAX (defined in vector.inc) include 'cuts.inc' @@ -309,6 +310,12 @@ subroutine set_peaks c----- c Begin Code c----- + if (dsqrt_shatmax.ne.-1)then + stot = min(real_stot, dsqrt_shatmax**2) + else + stot = real_stot + endif + iconfig = this_config c needs to be initialise to avoid segfault do i = -nexternal,-1 diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/gridrun b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/gridrun index 8c8f7d3940..01d4ab53f5 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/gridrun +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/gridrun @@ -91,7 +91,7 @@ import internal.madevent_interface as cmd_interface try: - cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2]) + cmd_line = cmd_interface.GridPackCmd(me_dir=root_path, nb_event=args[0], seed=args[1], gran=args[2], nprocs=args[3], maxevts=args[4]) except KeyboardInterrupt: print('Quit on KeyboardInterrupt') diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/run.sh b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/run.sh index 20adf572c2..2d149f96be 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/run.sh +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/Gridpack/run.sh @@ -14,6 +14,18 @@ # USAGE : run [num_events] [iseed] ## ############################################################################# +function usage() { + local retcode="${1:-1}" # default return code is 1 + echo "Usage:" + echo " run.sh [options] [num events] [seed]" + echo " run.sh [options] [num events] [seed] [granularity]" + echo "Options:" + echo " -h, --help print this message and exit" + echo " -p, --parallel [num procs] number of processes to run in parallel" + echo " -m, --maxevts [num events] maximum number of unweighted events per job" + exit $retcode +} + if [[ -d ./madevent ]]; then DIR='./madevent' else @@ -32,23 +44,46 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib # For Mac OS X export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${PWD}/madevent/lib:${PWD}/HELAS/lib +pos_args=() +nprocs=1 +maxevts=2500 -if [[ ($1 != "") && ("$2" != "") && ("$3" == "") ]]; then - num_events=$1 - seed=$2 - gran=1 -elif [[ ($1 != "") && ("$2" != "") && ("$3" != "") ]]; then - num_events=$1 - seed=$2 - gran=$3 -else - echo "Warning: input is not correct. script requires two arguments: NB_EVENT SEED" -fi +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage 0 ;; + -p|--parallel) + nprocs="$2" && shift && shift ;; + -m|--maxevts) + maxevts="$2" && shift && shift ;; + -*) + echo "Error: Unknown option $1" && usage ;; + *) + pos_args+=("$1") && shift ;; + esac +done + +case `echo "${pos_args[@]}" | wc -w | tr -d " "` in + "2") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=1 + ;; + "3") + num_events=${pos_args[0]} + seed=${pos_args[1]} + gran=${pos_args[2]} + ;; + *) + echo "Error: number of arguments is not correct" + usage + ;; +esac -echo "Now generating $num_events events with random seed $seed and granularity $gran" +echo "Now generating $num_events events with random seed $seed and granularity $gran using $nprocs processes" ############ RUN THE PYTHON CODE ##################### -${DIR}/bin/gridrun $num_events $seed $gran +${DIR}/bin/gridrun $num_events $seed $gran $nprocs $maxevts ######################################################## ########### POSTPROCESSING ##################### diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/banner.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/banner.py index 42d82818d0..022861fc31 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/banner.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/banner.py @@ -353,7 +353,7 @@ def modify_init_cross(self, cross, allow_zero=False): assert "init" in self cross = dict(cross) - for key in cross.keys(): + for key in list(cross.keys()): if isinstance(key, str) and key.isdigit() and int(key) not in cross: cross[int(key)] = cross[key] @@ -3318,7 +3318,6 @@ def retro_compatible_custom_fct(lines, mode=None): for i,line in enumerate(lines[:]): if search and re.search(include_pat, line): name = re.findall(include_pat, line)[0] - misc.sprint('DETECTED INCLUDE', name) if 'vector.inc' in name: search = False if 'run.inc' in name: @@ -3326,7 +3325,6 @@ def retro_compatible_custom_fct(lines, mode=None): search = False sol.append(line) if re.search(function_pat, line): - misc.sprint("DETECTED FCT") search = True return sol @@ -4201,6 +4199,7 @@ def default_setup(self): self.add_param("bwcutoff", 15.0) self.add_param("cut_decays", False, cut='d') self.add_param('dsqrt_shat',0., cut=True) + self.add_param('dsqrt_shatmax', -1, cut=True) self.add_param("nhel", 0, include=False) self.add_param("limhel", 1e-8, hidden=True, comment="threshold to determine if an helicity contributes when not MC over helicity.") #pt cut @@ -5577,6 +5576,9 @@ def default_setup(self): #technical self.add_param('folding', [1,1,1], include=False) + + #bias + self.add_param('flavour_bias',[5,1], hidden=True, comment="Example: '5,100' means that the probability to generate an event with a bottom (or anti-bottom) quark is increased by a factor 100, but the weight of those events is reduced by a factor 100. Requires that the 'event_norm' is set to 'bias'.") #merging self.add_param('ickkw', 0, allowed=[-1,0,3,4], comment=" - 0: No merging\n - 3: FxFx Merging : http://amcatnlo.cern.ch/FxFx_merging.htm\n - 4: UNLOPS merging (No interface within MG5aMC)\n - -1: NNLL+NLO jet-veto computation. See arxiv:1412.8408 [hep-ph]") @@ -5790,6 +5792,17 @@ def check_validity(self): if self['mcatnlo_delta'] and not self['parton_shower'].lower() == 'pythia8': raise InvalidRunCard("MC@NLO-DELTA only possible with matching to Pythia8") + # check that the flavour_bias is consistent + if len(self['flavour_bias']) != 2: + raise InvalidRunCard("'flavour_bias' should contain exactly two numbers: the abs(PDG) of the flavour to enhance, and the enhancement multiplication factor.") + for i in self['flavour_bias']: + if i < 0: + raise InvalidRunCard("flavour and multiplication factor should be positive in the flavour_bias parameter") + if self['flavour_bias'][1] != 1 and self['event_norm'] != 'bias': + logger.warning('Non-trivial flavour enhancement factor: setting event normalisation to "bias"') + self['event_norm']='bias' + + # check that ebeam is bigger than the proton mass. for i in [1,2]: # do not for proton mass if not proton PDF (or when scan initialization) diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/check_param_card.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/check_param_card.py index bc785b5de6..a34705f6bc 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/check_param_card.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/check_param_card.py @@ -1092,11 +1092,11 @@ def write_summary(self, path, order=None, lastline=False, nbcol=20): to_print = self.cross[-1:] for info in to_print: name = info['run_name'] - bench = info['bench'] + bench = [float(x) for x in info['bench']] data = [] for k in keys: if k in info: - data.append(info[k]) + data.append(float(info[k])) else: data.append(0.) ff.write(formatting % tuple([name] + bench + data)) diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/common_run_interface.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/common_run_interface.py index 9ff7390cf5..541cd6294b 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/common_run_interface.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/common_run_interface.py @@ -750,8 +750,8 @@ def __init__(self, me_dir, options, *args, **opts): else: self.ninitial = self.proc_characteristics['ninitial'] - def make_make_all_html_results(self, folder_names = [], jobs=[]): - return sum_html.make_all_html_results(self, folder_names, jobs) + def make_make_all_html_results(self, folder_names = [], jobs=[], get_attr=None): + return sum_html.make_all_html_results(self, folder_names, jobs, get_attr) def write_RunWeb(self, me_dir): @@ -3831,7 +3831,7 @@ def store_scan_result(self): """return the information that need to be kept for the scan summary. Auto-width are automatically added.""" - return {'cross': self.results.current['cross']} + return {'cross': self.results.current['cross'], 'error': self.results.current['error']} def add_error_log_in_html(self, errortype=None): @@ -5135,10 +5135,10 @@ def init_run(self, cards): self.special_shortcut.update( {'ebeam':([float],['run_card ebeam1 %(0)s', 'run_card ebeam2 %(0)s']), 'lpp': ([int],['run_card lpp1 %(0)s', 'run_card lpp2 %(0)s' ]), - 'lhc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lhc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'lep': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), 'ilc': ([int],['run_card lpp1 0', 'run_card lpp2 0', 'run_card ebeam1 %(0)s/2', 'run_card ebeam2 %(0)s/2']), - 'lcc': ([int],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), + 'lcc': ([float],['run_card lpp1 1', 'run_card lpp2 1', 'run_card ebeam1 %(0)s*1000/2', 'run_card ebeam2 %(0)s*1000/2']), 'fixed_scale': ([float],['run_card fixed_fac_scale T', 'run_card fixed_ren_scale T', 'run_card scale %(0)s', 'run_card dsqrt_q2fact1 %(0)s' ,'run_card dsqrt_q2fact2 %(0)s']), 'no_parton_cut':([],['run_card nocut T']), 'cm_velocity':([float], [lambda self :self.set_CM_velocity]), @@ -6740,7 +6740,15 @@ def postcmd(self, stop, line): return ending_question - + def help_update(self): + logger.info(""" syntax: update dependent: Change the mass/width of particles which are not free parameter for the model. + update missing: add to the current param_card missing blocks/parameters. + update to_slha1: pass SLHA2 card to SLHA1 convention. (beta) + update to_slha2: pass SLHA1 card to SLHA2 convention. (beta) + update to_full [run_card] + update XXX [where XXX correspond to a hidden block of the run_card]: + supported block are %s + """, ', '.join(self.update_block)) def do_update(self, line, timer=0): @@ -6756,6 +6764,8 @@ def do_update(self, line, timer=0): logger.warning('miss an argument (dependent or missing). Please retry') return + args[0] = args[0].lower() + if args[0] == 'dependent': if not self.mother_interface: logger.warning('Failed to update dependent parameter. This might create trouble for external program (like MadSpin/shower/...)') @@ -6805,10 +6815,11 @@ def do_update(self, line, timer=0): self.modified_card.add('run') # delay writting of the run_card logger.info('add optional block %s to the run_card', args[0]) else: - self.help_update() + self.do_help('update') logger.warning('unvalid options for update command. Please retry') + def update_to_full(self, line): """ trigger via update to_full LINE""" diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/extended_cmd.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/extended_cmd.py index 789976beee..c321fd88e5 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/extended_cmd.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/extended_cmd.py @@ -1317,6 +1317,8 @@ def nice_error_handling(self, error, line): debug_file = open(self.debug_output, 'a') traceback.print_exc(file=debug_file) + if __debug__: + traceback.print_exc() if hasattr(error, 'filename'): debug_file.write("Related File: %s\n" % error.filename) # Create a nice error output @@ -1928,7 +1930,8 @@ def do_display(self, line, output=sys.stdout): for i, name in enumerate(split): try: __import__('.'.join(split[:i+1])) - exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1]))) + tmp = {} + exec('%s=sys.modules[\'%s\']' % (split[i], '.'.join(split[:i+1])), globals(),tmp) except ImportError: try: var = eval(args[1]) @@ -1939,7 +1942,7 @@ def do_display(self, line, output=sys.stdout): outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) else: - var = eval(args[1]) + var = eval(args[1], globals(), tmp) outstr += 'EXTERNAL:\n' outstr += misc.nice_representation(var, nb_space=4) diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/file_writers.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/file_writers.py index 526756129f..74ba0d195c 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/file_writers.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/file_writers.py @@ -140,10 +140,6 @@ def preprocess_template(self, input_lines, context={}): else: raise self.FileWriterError("%s not string" % repr(input_lines)) - # Setup the contextual environment - for contextual_variable, value in context.items(): - exec('%s=%s'%(str(contextual_variable),repr(value))) - res = [] # The variable below tracks the conditional statements structure if_stack = [] @@ -166,7 +162,7 @@ def preprocess_template(self, input_lines, context={}): # Treat an if statement elif preproc_command.group('command')=='if': try: - if_stack.append(eval(preproc_command.group('body'))==True) + if_stack.append(eval(preproc_command.group('body'), globals(), context)==True) except Exception as e: raise self.FilePreProcessingError('Could not evaluate'+\ "python expression '%s' given the context %s provided."%\ diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/files.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/files.py index 551b71ddb6..3061b007e7 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/files.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/files.py @@ -147,9 +147,14 @@ def cp(path1, path2, log=True, error=False): path2 = format_path(path2) try: shutil.copy(path1, path2) + except shutil.Error as why: + logger.debug('no cp since identical: %s', why) + return except IOError as why: import madgraph.various.misc as misc try: + if 'same file' in str(why): + return if os.path.exists(path2): path2 = os.path.join(path2, os.path.split(path1)[1]) misc.copytree(path1, path2) @@ -157,12 +162,10 @@ def cp(path1, path2, log=True, error=False): if error: raise if log: - logger.warning(why) + logger.warning("fail to cp", path1, path2, why) else: - misc.sprint("fail to cp", why) - except shutil.Error: - # idetical file - pass + misc.sprint("fail to cp",path1,path2, why) + def rm(path, log=True): """removes path, that can be a single element or a list""" diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_cardhtml-pl b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_cardhtml-pl index 1810c6c082..6e0e06533d 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_cardhtml-pl +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_cardhtml-pl @@ -137,7 +137,7 @@ until($listpos>$#incard){ print PAGE " Model: $model \n"; print PAGE " \n \n
\n"; print PAGE " \n"; - print PAGE "\"\" \n"; + print PAGE "\"\" \n"; print PAGE "
\n"; print PAGE " \n \n \n"; print PAGE " \n"; diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_crossxhtml.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_crossxhtml.py index 681bf9d09b..3114a4350c 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_crossxhtml.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_crossxhtml.py @@ -133,7 +133,7 @@ class AllResults(dict): web = False - _run_entries = ['cross', 'error','nb_event_pythia','run_mode','run_statistics', + _run_entries = ['cross', 'error','axsec','nb_event_pythia','run_mode','run_statistics', 'nb_event','cross_pythia','error_pythia', 'nb_event_pythia8','cross_pythia8','error_pythia8', 'shower_dir'] diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_jpeg-pl b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_jpeg-pl index 87d03da394..31b7e9fe55 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_jpeg-pl +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_jpeg-pl @@ -1,16 +1,16 @@ #!/usr/bin/perl -w #--------------------------------------------------------------------- -# Run GS to create jpeg files defined as $gs +# Run GS to create PNG files defined as $gs #--------------------------------------------------------------------- -system("/bin/bash -c \"rm -f matrix*.jpg\" "); +system("/bin/bash -c \"rm -f matrix*.png\" "); $imatrix = ""; if (! -e "matrix.ps") {$imatrix = 1;} -$max_jpg = 2; -if ($imatrix eq "") {$max_jpg = 5;} -# add 1 to max_jpg, to get max_jpg pages -$max_jpg += 1; +$max_png = 2; +if ($imatrix eq "") {$max_png = 5;} +# add 1 to max_png, to get max_png pages +$max_png += 1; open(PAGE,"> diagrams.html") || die "Error creating diagrams.html"; print PAGE "\ \n"; print PAGE "\ \n"; @@ -21,22 +21,22 @@ while ( -e "matrix$imatrix.ps"){ open(IN, "< matrix$imatrix.ps") || die "No file matrix$imatrix.ps"; open(OUT, "> matrix-1.ps") || die "Could not open file matrix-1.ps"; while () { - if ($_ =~ m/^%%Page: $max_jpg $max_jpg/) {last;} + if ($_ =~ m/^%%Page: $max_png $max_png/) {last;} else {print OUT $_, "\n";} } close(OUT); close(IN); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=matrix$imatrix\%00d.jpg \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-r150 \-sOutputFile\=matrix$imatrix\%00d.png \-q \-dNOPAUSE \-dBATCH matrix-1.ps > /dev/null\""; system "rm -f matrix-1.ps"; -# Determine how many jpg files we have +# Determine how many png files we have $pages=1; - while(-e "matrix$imatrix$pages.jpg"){ + while(-e "matrix$imatrix$pages.png"){ $pages++; }#end of while #reduce it by one - if ($pages > $max_jpg){ + if ($pages > $max_png){ $pages -= 1; } # Find name of process @@ -45,24 +45,24 @@ while ( -e "matrix$imatrix.ps"){ if ($proc =~ /Process: (.+?)(\s\w+=\d+)*$/) { $proc = $1; } print PAGE "

To save bandwidth not all diagrams were converted to jpeg."; + if (-e "matrix$imatrix$max_png.png" ) { + print PAGE "

To save bandwidth not all diagrams were converted to PNG."; print PAGE "

To view all diagrams click on "; print PAGE "\ postscript. \<\/A\> \ \n"; # # Delete files which aren't included in diagrams.html # - system ("/bin/bash -c \"rm -f matrix$max_jpg.jpg\" "); + system ("/bin/bash -c \"rm -f matrix$max_png.png\" "); } # -# Now create jpeg file for card +# Now create PNG file for card # - if (! -e "../../HTML/card.jpg") { + if (! -e "../../HTML/card.png") { system ("/bin/bash -c \"head -352 matrix$imatrix.ps >& junk.ps\" "); open(JUNK,">> junk.ps") || die "Error opening junk.ps"; @@ -72,7 +72,7 @@ while ( -e "matrix$imatrix.ps"){ system ("/bin/bash -c \"cat matrix$imatrix.ps | sed 1,352d >> junk.ps\" "); - system "/bin/bash -c \"nice gs \-sDEVICE\=jpeg \-sOutputFile\=card.jpg \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.jpg ../../HTML/card.jpg > /dev/null\" "; + system "/bin/bash -c \"nice gs \-sDEVICE\=pngmono \-sOutputFile\=card.png \-q \-dNOPAUSE \-dBATCH \-g180x150 ./junk.ps; rm -f junk.ps; cp -p card.png ../../HTML/card.png > /dev/null\" "; } if ($imatrix eq "") {$imatrix = 0;} $imatrix = $imatrix + 1; @@ -82,3 +82,4 @@ print PAGE "\n"; print PAGE "\<\/BODY\> \n"; print PAGE "\<\/HTML\> \n"; close(PAGE); + diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_ximprove.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_ximprove.py index 415ecc9de0..d5d7fc8faf 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_ximprove.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/gen_ximprove.py @@ -30,6 +30,7 @@ import stat import sys import six +import time from six.moves import range from six.moves import zip @@ -304,6 +305,7 @@ def get_helicity(self, to_submit=True, clean=True): logger.debug('(%s) nb_hel: %s zero amp: %s bad_amps_hel: %s/%s', split_file[-1], len(good_hels),len(bad_amps),len(bad_amps_perhel), len(good_hels)*nb_amp ) if len(good_hels) == 1: files.cp(matrix_file, matrix_file.replace('orig','optim')) + files.cp(matrix_file.replace('.f','.o'), matrix_file.replace('orig','optim').replace('.f','.o')) continue # avoid optimization if onlye one helicity gauge = self.cmd.proc_characteristics['gauge'] @@ -1059,6 +1061,7 @@ def __init__(self, cmd, opt=None): # parameter for the gridpack run self.nreq = 2000 self.iseed = 4321 + self.maxevts = 2500 # placeholder for information self.results = 0 #updated in launch/update_html @@ -1200,6 +1203,10 @@ def reset_multijob(self): def write_multijob(self, Channel, nb_split): """ """ if nb_split <=1: + try: + os.remove(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat')) + except OSError: + pass return f = open(pjoin(self.me_dir, 'SubProcesses', Channel.get('name'), 'multijob.dat'), 'w') f.write('%i\n' % nb_split) @@ -1828,17 +1835,17 @@ class gen_ximprove_gridpack(gen_ximprove_v4): max_request_event = 1e12 # split jobs if a channel if it needs more than that max_event_in_iter = 4000 min_event_in_iter = 500 - combining_job = sys.maxsize gen_events_security = 1.00 - def __new__(cls, *args, **opts): + def __new__(cls, cmd, opts): cls.force_class = 'gridpack' - return super(gen_ximprove_gridpack, cls).__new__(cls, *args, **opts) + return super(gen_ximprove_gridpack, cls).__new__(cls, cmd, opts) - def __init__(self, *args, **opts): + def __init__(self, cmd, opts): self.ngran = -1 + self.nprocs = 1 self.gscalefact = {} self.readonly = False if 'ngran' in opts: @@ -1846,9 +1853,18 @@ def __init__(self, *args, **opts): # del opts['ngran'] if 'readonly' in opts: self.readonly = opts['readonly'] - super(gen_ximprove_gridpack,self).__init__(*args, **opts) + if 'nprocs' in opts: + self.nprocs = int(opts['nprocs']) + if 'maxevts' in opts and self.nprocs > 1: + self.max_request_event = int(opts['maxevts']) + super(gen_ximprove_gridpack,self).__init__(cmd, opts) if self.ngran == -1: self.ngran = 1 + + if self.nprocs > 1: + self.combining_job = 0 + else: + self.combining_job = sys.maxsize def find_job_for_event(self): """return the list of channel that need to be improved""" @@ -1876,8 +1892,8 @@ def find_job_for_event(self): continue # no event to generate events self.gscalefact[tag] = max(1, 1/(goal_lum * C.get('axsec')/ self.ngran)) #need to generate events - logger.debug('request events for ', C.get('name'), 'cross=', - C.get('axsec'), 'needed events = ', goal_lum * C.get('axsec')) + logger.debug('request events for %s cross=%d needed events = %d', + C.get('name'), C.get('axsec'), goal_lum * C.get('axsec')) to_refine.append(C) logger.info('need to improve %s channels' % len(to_refine)) @@ -1897,8 +1913,13 @@ def get_job_for_event(self): for C in to_refine: #1. Compute the number of points are needed to reach target needed_event = max(goal_lum*C.get('axsec'), self.ngran) - nb_split = 1 - + nb_split = int(max(1,((needed_event-1)// self.max_request_event) +1)) + if not self.split_channels: + nb_split = 1 + if nb_split > self.max_splitting: + nb_split = self.max_splitting + nb_split=max(1, nb_split) + #2. estimate how many points we need in each iteration if C.get('nunwgt') > 0: nevents = needed_event / nb_split * (C.get('nevents') / C.get('nunwgt')) @@ -1908,13 +1929,16 @@ def get_job_for_event(self): nevents = self.max_event_in_iter if nevents < self.min_event_in_iter: + nb_split = int(nb_split * nevents / self.min_event_in_iter) + 1 # sr dangerous? nevents = self.min_event_in_iter # # forbid too low/too large value nevents = max(self.min_event_in_iter, min(self.max_event_in_iter, nevents)) logger.debug("%s : need %s event. Need %s split job of %s points", C.name, needed_event, nb_split, nevents) - + # write the multi-job information + self.write_multijob(C, nb_split) + #create the info dict assume no splitting for the default info = {'name': self.cmd.results.current['run_name'], 'script_name': 'unknown', @@ -1925,7 +1949,7 @@ def get_job_for_event(self): 'nevents': nevents, #int(nevents*self.gen_events_security)+1, 'maxiter': self.max_iter, 'miniter': self.min_iter, - 'precision': -1*int(needed_event)/C.get('axsec'), + 'precision': -goal_lum/nb_split, # -1*int(needed_event)/C.get('axsec'), 'requested_event': needed_event, 'nhel': self.run_card['nhel'], 'channel': C.name.replace('G',''), @@ -1938,27 +1962,59 @@ def get_job_for_event(self): basedir = pjoin(os.path.dirname(__file__), '..','..','SubProcesses', info['P_dir'], info['directory']) info['base_directory'] = basedir - jobs.append(info) - + if nb_split == 1: + jobs.append(info) + else: + for i in range(nb_split): + new_info = dict(info) + new_info['offset'] = i+1 + new_info['directory'] += self.alphabet[i % 26] + str((i+1)//26) + new_info['base_directory'] = info['directory'] + jobs.append(new_info) write_dir = '.' if self.readonly else None self.create_ajob(pjoin(self.me_dir, 'SubProcesses', 'refine.sh'), jobs, write_dir) + if self.nprocs > 1: + nprocs_cluster = cluster.MultiCore(nb_core=self.nprocs) + gridpack_start = time.time() + def gridpack_wait_monitoring(Idle, Running, Done): + if Idle+Running+Done == 0: + return + logger.info("Gridpack event generation: %s Idle, %s Running, %s Done [%s]" + % (Idle, Running, Done, misc.format_time(time.time()-gridpack_start))) + done = [] for j in jobs: - if j['P_dir'] in done: - continue - done.append(j['P_dir']) + if self.nprocs == 1: + if j['P_dir'] in done: + continue + done.append(j['P_dir']) + # Give a little status. Sometimes these jobs run very long, and having hours without any + # console output can be a bit frightening and make users think we are looping. + if len(done)%5==0: + logger.info(f"Working on job {len(done)} of {len(jobs)}") + # set the working directory path. pwd = pjoin(os.getcwd(),j['P_dir']) if self.readonly else pjoin(self.me_dir, 'SubProcesses', j['P_dir']) - exe = pjoin(pwd, 'ajob1') + exe = pjoin(pwd, j['script_name']) st = os.stat(exe) os.chmod(exe, st.st_mode | stat.S_IEXEC) # run the code\ - cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + if self.nprocs == 1: + cluster.onecore.launch_and_wait(exe, cwd=pwd, packet_member=j['packet']) + else: + nprocs_cluster.cluster_submit(exe, cwd=pwd, packet_member=j['packet']) write_dir = '.' if self.readonly else pjoin(self.me_dir, 'SubProcesses') + if self.nprocs > 1: + nprocs_cluster.wait(self.me_dir, gridpack_wait_monitoring) + + if self.readonly: + combine_runs.CombineRuns(write_dir) + else: + combine_runs.CombineRuns(self.me_dir) self.check_events(goal_lum, to_refine, jobs, write_dir) def check_events(self, goal_lum, to_refine, jobs, Sdir): diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/hel_recycle.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/hel_recycle.py index 1471de4bcb..978ba6575e 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/hel_recycle.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/hel_recycle.py @@ -550,7 +550,7 @@ def get_jamp_lines(self, line): def get_amp2_lines(self, line): if line.startswith(' DO I = 1, NCOLOR'): self.in_amp2 = False - elif not line.isspace(): + elif not line.isspace() and 'DENOM' not in line: self.template_dict['amp2_lines'] += f'{line[0:6]} {self.add_indices(line[6:])}' def prepare_bools(self): diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/histograms.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/histograms.py index 51ae2914fc..d68c560806 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/histograms.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/histograms.py @@ -1149,11 +1149,8 @@ def parse_one_histo_from_stream(self, stream, all_weight_header, boundaries = [0.0,0.0] for j, weight in \ enumerate(HwU.histo_bin_weight_re.finditer(line_bin)): - if (j == len(weight_header)): - continue - if j == len(all_weight_header): - raise HwU.ParseError("There is more bin weights"+\ - " specified than expected (%i)"%len(weight_header)) + #if (j == len(weight_header)): + # continue if selected_central_weight == all_weight_header[j]: bin_weights['central'] = float(weight.group('weight')) if all_weight_header[j] == 'boundary_xmin': @@ -2480,14 +2477,14 @@ def get_main_central_plot_lines(HwU_name, block_position, color_index, # return [template_no_stat%rep_dic]+\ # ([template%rep_dic] if show_mc_uncertainties else []) - # The use of sqrt(-1) is just a trick to prevent the line to display + # The use of 1/0 is just a trick to prevent the line to display res = [] - rep_dic['data'] = '($3 < 0 ? sqrt(-1) : $3)' + rep_dic['data'] = '($3 < 0 ? 1/0 : $3)' res.append(template_no_stat%rep_dic) rep_dic['title'] = " title ''" if show_mc_uncertainties: res.append(template%rep_dic) - rep_dic['data'] = '($3 >= 0 ? sqrt(-1) : abs($3))' + rep_dic['data'] = '($3 >= 0 ? 1/0 : abs($3))' rep_dic['ls'] = ' ls %d'%(100+color_index) res.append(template_no_stat%rep_dic) if show_mc_uncertainties: @@ -2739,13 +2736,13 @@ def ratio_no_correlations(wgtsA, wgtsB): """#-- rendering subhistograms '%(subhistogram_type)s' %(unset label)s %(set_format_y)s +%(set_yscale)s set yrange [%(ymin).4e:%(ymax).4e] set origin %(origin_x).4e, %(origin_y).4e set size %(size_x).4e, %(size_y).4e set mytics %(mytics)d %(set_ytics)s %(set_format_x)s -%(set_yscale)s %(set_ylabel)s %(set_histo_label)s plot \\""" @@ -2878,7 +2875,7 @@ def ratio_no_correlations(wgtsA, wgtsB): # We decide to show uncertainties in the main plot only if they # are part of a monocolor band. Otherwise, they will only be - # shown in the first subplot. Notice that plotting 'sqrt(-1)' + # shown in the first subplot. Notice that plotting '1/0' # is just a trick so as to have only the key printed with no # line @@ -2890,7 +2887,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, scale variation'%title, band='scale' in use_band) else: uncertainty_plot_lines[-1]['scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+10,'%s, scale variation'%title)] # And now PDF_variation if available if not PDF_var_pos is None and len(PDF_var_pos)>0: if 'pdf' in use_band: @@ -2899,7 +2896,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, PDF variation'%title, band='pdf' in use_band) else: uncertainty_plot_lines[-1]['pdf'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+20,'%s, PDF variation'%title)] # And now merging variation if available if not merging_var_pos is None and len(merging_var_pos)>0: if 'merging_scale' in use_band: @@ -2908,7 +2905,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, merging scale variation'%title, band='merging_scale' in use_band) else: uncertainty_plot_lines[-1]['merging_scale'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+30,'%s, merging scale variation'%title)] # And now alpsfact variation if available if not alpsfact_var_pos is None and len(alpsfact_var_pos)>0: if 'alpsfact' in use_band: @@ -2917,7 +2914,7 @@ def ratio_no_correlations(wgtsA, wgtsB): '%s, alpsfact variation'%title, band='alpsfact' in use_band) else: uncertainty_plot_lines[-1]['alpsfact'] = \ - ["sqrt(-1) ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] + ["1/0 ls %d title '%s'"%(color_index+40,'%s, alpsfact variation'%title)] # plot_lines.append( # "'%s' index %d using (($1+$2)/2):3 ls %d title '%s'"\ diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/launch_plugin.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/launch_plugin.py index 0924927785..ba08c10340 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/launch_plugin.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/launch_plugin.py @@ -33,7 +33,7 @@ def compile(self, *args, **opts): if 'cwd' in opts and os.path.basename(opts['cwd']) == 'Source': path = pjoin(opts['cwd'], 'make_opts') common_run_interface.CommonRunCmd.update_make_opts_full(path, - {'FPTYPE': self.run_card['floating_type'] }) + {'override FPTYPE': self.run_card['floating_type'] }) misc.sprint('FPTYPE checked') cudacpp_supported_backends = [ 'fortran', 'cuda', 'hip', 'cpp', 'cppnone', 'cppsse4', 'cppavx2', 'cpp512y', 'cpp512z', 'cppauto' ] if args and args[0][0] == 'madevent' and hasattr(self, 'run_card'): @@ -76,7 +76,7 @@ def reset_makeopts(self, old_value, new_value, name): if not hasattr(self, 'path'): raise Exception if name == 'floating_type': - common_run_interface.CommonRunCmd.update_make_opts_full({'FPTYPE': new_value}) + common_run_interface.CommonRunCmd.update_make_opts_full({'override FPTYPE': new_value}) else: raise Exception Sourcedir = pjoin(os.path.dirname(os.path.dirname(self.path)), 'Source') diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/lhe_parser.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/lhe_parser.py index f6e47956cd..76ded329c0 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/lhe_parser.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/lhe_parser.py @@ -2953,8 +2953,8 @@ def pt(self): @property def pseudorapidity(self): - norm = math.sqrt(self.px**2 + self.py**2+self.pz**2) - return 0.5* math.log((norm - self.pz) / (norm + self.pz)) + norm = math.sqrt(self.px**2 + self.py**2 + self.pz**2) + return 0.5* math.log((norm + self.pz) / (norm - self.pz)) @property def rapidity(self): diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/madevent_interface.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/madevent_interface.py index 85e5bcf5e3..2852f1d4d8 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/madevent_interface.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/madevent_interface.py @@ -1171,10 +1171,10 @@ def check_survey(self, args, cmd='survey'): for opt,value in self._survey_options.items(): if arg.startswith('--%s=' % opt): exec('self.opts[\'%s\'] = %s(arg.split(\'=\')[-1])' % \ - (opt, value[0])) + (opt, value[0]), globals(), {'self':self, 'arg':arg}) arg = "" if arg != "": raise Exception - except Exception: + except Exception as error: self.help_survey() raise self.InvalidCmd('invalid %s argument'% arg) @@ -3656,9 +3656,11 @@ def do_refine(self, line): else: self.refine_mode = "new" - cross, error = self.make_make_all_html_results() + cross, error, across = self.make_make_all_html_results(get_attr=('xsec','xerru','axsec')) + self.results.add_detail('cross', cross) self.results.add_detail('error', error) + self.results.add_detail('axsec', across) self.results.add_detail('run_statistics', dict(self.results.get_detail('run_statistics'))) @@ -3786,7 +3788,7 @@ def split(a, n): for i, local_G in enumerate(split(Gdirs, nb_chunk)): line = [pjoin(self.me_dir, "Events", self.run_name, "partials%d.lhe.gz" % i)] line.append(pjoin(self.me_dir, 'Events', self.run_name, '%s_%s_banner.txt' % (self.run_name, tag))) - line.append(str(self.results.current['cross'])) + line.append(str(self.results.current.get('axsec'))) line += local_G partials_info.append(self.do_combine_events_partial(' '.join(line), preprocess_only=True)) mycluster.submit(sys.executable, @@ -6749,7 +6751,7 @@ def get_subP_ids(path): class GridPackCmd(MadEventCmd): """The command for the gridpack --Those are not suppose to be use interactively--""" - def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **stdin): + def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, nprocs=1, maxevts=2500, *completekey, **stdin): """Initialize the command and directly run""" # Initialize properly @@ -6759,6 +6761,8 @@ def __init__(self, me_dir = None, nb_event=0, seed=0, gran=-1, *completekey, **s self.random = seed self.random_orig = self.random self.granularity = gran + self.nprocs = nprocs + self.maxevts = maxevts self.options['automatic_html_opening'] = False #write the grid_card.dat on disk @@ -6874,7 +6878,7 @@ def launch(self, nb_event, seed): #misc.call([pjoin(self.me_dir,'bin','refine4grid'), # str(nb_event), '0', 'Madevent','1','GridRun_%s' % seed], # cwd=self.me_dir) - self.refine4grid(nb_event) + self.gridpack_cross = self.refine4grid(nb_event) # 3) Combine the events/pythia/... self.exec_cmd('combine_events') @@ -6902,6 +6906,8 @@ def refine4grid(self, nb_event): precision = nb_event + across= self.make_make_all_html_results(get_attr='axsec') + self.opts = dict([(key,value[1]) for (key,value) in \ self._survey_options.items()]) @@ -6915,8 +6921,9 @@ def refine4grid(self, nb_event): self.update_status('Refine results to %s' % precision, level=None) logger.info("Using random number seed offset = %s" % self.random) - refine_opt = {'err_goal': nb_event, 'split_channels': False, - 'ngran':self.granularity, 'readonly': self.readonly} + refine_opt = {'err_goal': nb_event, 'split_channels': True, + 'ngran':self.granularity, 'readonly': self.readonly, + 'nprocs': self.nprocs, 'maxevts': self.maxevts} x_improve = gen_ximprove.gen_ximprove_gridpack(self, refine_opt) x_improve.launch() # create the ajob for the refinment and run those! self.gscalefact = x_improve.gscalefact #store jacobian associate to the gridpack @@ -6926,7 +6933,7 @@ def refine4grid(self, nb_event): #print 'run combine!!!' #combine_runs.CombineRuns(self.me_dir) - return + return across #update html output Presults = sum_html.collect_result(self) cross, error = Presults.xsec, Presults.xerru @@ -7051,10 +7058,14 @@ def do_combine_events(self, line): sum_axsec += result.get('axsec')*gscalefact[Gdir] if len(AllEvent) >= 80: #perform a partial unweighting - if self.results.current['cross'] == 0 and self.run_card['gridpack']: - nb_event= self.nb_event + if not self.results.current.get('axsec'): + if self.run_card['gridpack'] and self.gridpack_cross: + nb_event = min(abs(1.05*self.nb_event*sum_axsec/self.gridpack_cross),self.nb_event) + else: + nb_event= self.nb_event else: - nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current['cross']),self.run_card['nevents']) + nb_event = min(abs(1.01*self.nb_event*sum_axsec/self.results.current.get('axsec')),self.run_card['nevents'], self.nb_event, self.gridpack_cross, sum_axsec) + misc.sprint(nb_event, self.results.current.get('axsec'), self.gridpack_cross) AllEvent.unweight(pjoin(outdir, self.run_name, "partials%s.lhe.gz" % partials), get_wgt, log_level=5, trunc_error=1e-2, event_target=nb_event) AllEvent = lhe_parser.MultiEventFile() @@ -7068,6 +7079,7 @@ def do_combine_events(self, line): for data in partials_info: AllEvent.add(*data) + sum_xsec += data[1] if not hasattr(self,'proc_characteristic'): self.proc_characteristic = self.get_characteristics() diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/restore_data b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/restore_data index 6205bb9567..407ed7aa91 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/restore_data +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/restore_data @@ -48,8 +48,17 @@ for i in `cat subproc.mg` ; do cd ../ done +# check if we are on a Mac, otherwise assume Linux +if [[ "$OSTYPE" == "darwin"* ]]; then + # no nproc on Mac, so use sysctl instead + # use -S1024 because there is a limit on the length of the command + xargs_opts="-P $(sysctl -n hw.ncpu) -S1024" +else + xargs_opts="-P $(nproc --all)" +fi + find . -mindepth 2 -maxdepth 2 -type d -name 'G*' -print0 \ - | xargs --null -P "$(nproc --all)" -I{} bash -c " + | xargs --null ${xargs_opts} -I{} bash -c " cd {} for j in $1_results.dat ; do if [[ -e \$j ]] ; then diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/sum_html.py b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/sum_html.py index 9dd5826f71..fb8dd3a74a 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/internal/sum_html.py +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/internal/sum_html.py @@ -770,7 +770,7 @@ def collect_result(cmd, folder_names=[], jobs=None, main_dir=None): return all -def make_all_html_results(cmd, folder_names = [], jobs=[]): +def make_all_html_results(cmd, folder_names = [], jobs=[], get_attr=None): """ folder_names and jobs have been added for the amcatnlo runs """ run = cmd.results.current['run_name'] if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): @@ -794,7 +794,12 @@ def make_all_html_results(cmd, folder_names = [], jobs=[]): fsock.write('%s

' % Presults.get_html(run, unit, cmd.me_dir)) fsock.write('%s
' % P_text) - return Presults.xsec, Presults.xerru + if not get_attr: + return Presults.xsec, Presults.xerru + else: + if isinstance(get_attr, tuple): + return [getattr(Presults, _) for _ in get_attr] + return getattr(Presults, get_attr) diff --git a/epochX/cudacpp/susy_gg_tt.mad/bin/madevent b/epochX/cudacpp/susy_gg_tt.mad/bin/madevent index dff9711b73..9c5363e682 100755 --- a/epochX/cudacpp/susy_gg_tt.mad/bin/madevent +++ b/epochX/cudacpp/susy_gg_tt.mad/bin/madevent @@ -178,6 +178,17 @@ force_run = False if (args and args[0] == 'treatcards'): force_run=True + +# check that madgraph is not in PYTHONPATH +try: + import madgraph +except ImportError: + pass +else: + logger.getLogger('madgraph').error('Looks like you do have madgraph in your PYTHONPATH (or you run this executable from the main MG5aMC directory). This executable will likely not work in such case.') + + + # Call the cmd interface main loop try: if '-h' in args or '--help' in args: diff --git a/epochX/cudacpp/susy_gg_tt.mad/src/HelAmps_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_tt.mad/src/HelAmps_MSSM_SLHA2.h index 9ed58e24f1..460544122c 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/src/HelAmps_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_tt.mad/src/HelAmps_MSSM_SLHA2.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.cc b/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.cc index aa00d6a9e4..aa7f4d3b2e 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.cc +++ b/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.h index 3e29f2ccbe..6cb2039b6b 100644 --- a/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_tt.mad/src/Parameters_MSSM_SLHA2.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.sa/CODEGEN_cudacpp_susy_gg_tt_log.txt b/epochX/cudacpp/susy_gg_tt.sa/CODEGEN_cudacpp_susy_gg_tt_log.txt index 420090461f..64dc5c4851 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/CODEGEN_cudacpp_susy_gg_tt_log.txt +++ b/epochX/cudacpp/susy_gg_tt.sa/CODEGEN_cudacpp_susy_gg_tt_log.txt @@ -1,8 +1,11 @@ +WARNING:root:python3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment. +Running MG5 in debug mode +Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT +Plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT has marked as NOT being validated with this version: 3.6.2. +It has been validated for the last time with version: 3.6.0 Note that this is a development version. This version is intended for development/beta testing and NOT for production. This version has not been fully tested (if at all) and might have limited user support (if at all) -Running MG5 in debug mode -Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT ************************************************************ * * * W E L C O M E to * @@ -15,7 +18,7 @@ Loading plugin MG5aMC_PLUGIN.CUDACPP_OUTPUT * * * * * * * * * * * * -* VERSION 3.6.0 2024-09-30 * +* VERSION 3.6.2 2025-03-19 * * * * WARNING: UNKNOWN DEVELOPMENT VERSION. * * WARNING: DO NOT USE FOR PRODUCTION * @@ -46,15 +49,18 @@ Please set the 'lhapdf' variable to the (absolute) /PATH/TO/lhapdf-config (inclu Note that you can still compile and run aMC@NLO with the built-in PDFs MG5_aMC> set lhapdf /PATH/TO/lhapdf-config -Using default text editor "vi". Set another one in ./input/mg5_configuration.txt Using default eps viewer "evince". Set another one in ./input/mg5_configuration.txt Using default web browser "firefox". Set another one in ./input/mg5_configuration.txt -import /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt.mg +import /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt.mg The import format was not given, so we guess it as command set stdout_level DEBUG set output information to level: 10 set zerowidth_tchannel F import model MSSM_SLHA2 +INFO: reload from .py file +INFO: load particles +INFO: load vertices +DEBUG: model prefixing takes 0.22474145889282227  INFO: Restrict model MSSM_SLHA2 with file models/MSSM_SLHA2/restrict_default.dat . INFO: Detect SLHA2 format. keeping restricted parameter in the param_card DEBUG: Simplifying conditional expressions  @@ -550,13 +556,13 @@ INFO: Please specify coupling orders to bypass this step. INFO: Trying coupling order WEIGHTED<=2: WEIGTHED IS QCD+2*QED INFO: Trying process: g g > t t~ WEIGHTED<=2 @1 INFO: Process has 3 diagrams -1 processes with 3 diagrams generated in 0.118 s +1 processes with 3 diagrams generated in 0.064 s Total: 1 processes with 3 diagrams output standalone_cudacpp ../TMPOUT/CODEGEN_cudacpp_susy_gg_tt Output will be done with PLUGIN: CUDACPP_OUTPUT DEBUG: Entering PLUGIN_ProcessExporter.__init__ (initialise the exporter) [output.py at line 171]  DEBUG: Entering PLUGIN_ProcessExporter.copy_template (initialise the directory) [output.py at line 176]  -INFO: Creating subdirectories in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt +INFO: Creating subdirectories in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt INFO: Organizing processes into subprocess groups INFO: Generating Helas calls for process: g g > t t~ WEIGHTED<=2 @1 INFO: Processing color information for process: g g > t t~ @1 @@ -565,30 +571,30 @@ INFO: Processing color information for process: g g > t t~ @1 DEBUG: type(fortran_model)= [output.py at line 220]  DEBUG: type(me)= me=0 [output.py at line 221]  DEBUG: "need to link", self.to_link_in_P =  need to link ['nvtx.h', 'timer.h', 'timermap.h', 'ompnumthreads.h', 'GpuRuntime.h', 'GpuAbstraction.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h', 'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h', 'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h', 'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h', 'MemoryAccessGs.h', 'MemoryAccessCouplingsFixed.h', 'MemoryAccessNumerators.h', 'MemoryAccessDenominators.h', 'MemoryAccessChannelIds.h', 'EventStatistics.h', 'CommonRandomNumbers.h', 'CrossSectionKernels.cc', 'CrossSectionKernels.h', 'MatrixElementKernels.cc', 'MatrixElementKernels.h', 'RamboSamplingKernels.cc', 'RamboSamplingKernels.h', 'RandomNumberKernels.h', 'CommonRandomNumberKernel.cc', 'CurandRandomNumberKernel.cc', 'HiprandRandomNumberKernel.cc', 'Bridge.h', 'BridgeKernels.cc', 'BridgeKernels.h', 'fbridge.cc', 'fbridge.inc', 'fsampler.cc', 'fsampler.inc', 'MadgraphTest.h', 'runTest.cc', 'testmisc.cc', 'testxxx_cc_ref.txt', 'valgrind.h', 'cudacpp.mk', 'testxxx.cc', 'MemoryBuffers.h', 'MemoryAccessCouplings.h', 'perf.py', 'profile.sh'] [output.py at line 222]  -INFO: Creating files in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/./CPPProcess.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/./CPPProcess.cc -INFO: Created files CPPProcess.h and CPPProcess.cc in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/. -Generated helas calls for 1 subprocesses (3 diagrams) in 0.006 s +INFO: Creating files in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/./CPPProcess.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/./CPPProcess.cc +INFO: Created files CPPProcess.h and CPPProcess.cc in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/. +Generated helas calls for 1 subprocesses (3 diagrams) in 0.007 s ALOHA: aloha starts to compute helicity amplitudes ALOHA: aloha creates VVV1 set of routines with options: P0 ALOHA: aloha creates FFV1 routines -ALOHA: aloha creates 2 routines in 0.136 s +ALOHA: aloha creates 2 routines in 0.061 s VVV1 FFV1 FFV1 FFV1 -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/./HelAmps_MSSM_SLHA2.h -INFO: Created file HelAmps_MSSM_SLHA2.h in directory /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/. +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/./HelAmps_MSSM_SLHA2.h +INFO: Created file HelAmps_MSSM_SLHA2.h in directory /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/. super_write_set_parameters_onlyfixMajorana (hardcoded=False) super_write_set_parameters_onlyfixMajorana (hardcoded=True) -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/./Parameters_MSSM_SLHA2.h -FileWriter for /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/./Parameters_MSSM_SLHA2.cc +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/./Parameters_MSSM_SLHA2.h +FileWriter for /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/./Parameters_MSSM_SLHA2.cc INFO: Created files Parameters_MSSM_SLHA2.h and Parameters_MSSM_SLHA2.cc in directory -INFO: /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/. and /data/avalassi/GPU2023/madgraph4gpuX/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/. +INFO: /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/. and /shared/roiser/sw/madgraph4gpu/MG5aMC/TMPOUT/CODEGEN_cudacpp_susy_gg_tt/src/. quit -real 0m1.291s -user 0m1.202s -sys 0m0.072s +real 0m2.763s +user 0m1.078s +sys 0m0.145s Code generation completed in 2 seconds diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/Bridge.h b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/Bridge.h index 87aa648dd2..49b928db67 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/Bridge.h +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/Bridge.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: S. Roiser (Nov 2021) for the MG5aMC CUDACPP plugin. -// Further modified by: S. Roiser, J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2021-2025) for the MG5aMC CUDACPP plugin. #ifndef BRIDGE_H #define BRIDGE_H 1 @@ -255,11 +255,15 @@ namespace mg5amcCpu throw std::logic_error( "Bridge constructor: FIXME! cannot choose gputhreads" ); // this should never happen! m_gpublocks = m_nevt / m_gputhreads; } +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate device Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelDevice( m_devMomentaC, m_devGs, m_devRndHel, m_devRndCol, m_devChannelIds, m_devMEs, m_devSelHel, m_devSelCol, m_gpublocks, m_gputhreads ) ); #else +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl; +#endif m_pmek.reset( new MatrixElementKernelHost( m_hstMomentaC, m_hstGs, m_hstRndHel, m_hstRndCol, m_hstChannelIds, m_hstMEs, m_hstSelHel, m_hstSelCol, m_nevt ) ); #endif // MGONGPUCPP_GPUIMPL // Create a process object, read param card and set parameters @@ -290,8 +294,10 @@ namespace mg5amcCpu throw std::runtime_error( "Bridge: gpublocks*gputhreads must equal m_nevt in set_gpugrid" ); m_gpublocks = gpublocks; m_gputhreads = gputhreads; +#ifdef MGONGPUCPP_VERBOSE std::cout << "WARNING! Set grid in Bridge (nevt=" << m_nevt << ", gpublocks=" << m_gpublocks << ", gputhreads=" << m_gputhreads << ", gpublocks*gputhreads=" << m_gpublocks * m_gputhreads << ")" << std::endl; +#endif m_pmek->setGrid( m_gpublocks, m_gputhreads ); } #endif @@ -347,7 +353,9 @@ namespace mg5amcCpu if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); copyHostFromDevice( m_hstMEs, m_devMEs ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif copyHostFromDevice( m_hstSelHel, m_devSelHel ); copyHostFromDevice( m_hstSelCol, m_devSelCol ); if constexpr( std::is_same_v ) @@ -400,7 +408,9 @@ namespace mg5amcCpu } if( goodHelOnly ) return; m_pmek->computeMatrixElements( useChannelIds ); +#ifdef MGONGPUCPP_VERBOSE flagAbnormalMEs( m_hstMEs.data(), m_nevt ); +#endif if constexpr( std::is_same_v ) { memcpy( mes, m_hstMEs.data(), m_hstMEs.bytes() ); diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/GpuRuntime.h b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/GpuRuntime.h index 860c7fde16..6a4b946e74 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/GpuRuntime.h +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/GpuRuntime.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: J. Teig (Jun 2023, based on earlier work by S. Roiser) for the MG5aMC CUDACPP plugin. -// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2025) for the MG5aMC CUDACPP plugin. #ifndef MG5AMC_GPURUNTIME_H #define MG5AMC_GPURUNTIME_H 1 @@ -50,7 +50,7 @@ namespace mg5amcGpu // Set up CUDA application // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaSetDevice on startup is useful to properly book-keep the time spent in CUDA initialization - static void setUp( const bool debug = true ) + static void setUp( const bool debug = false ) // ZW: changed debug default to false { // ** NB: it is useful to call cudaSetDevice, or cudaFree, to properly book-keep the time spent in CUDA initialization // ** NB: otherwise, the first CUDA operation (eg a cudaMemcpyToSymbol in CPPProcess ctor) appears to take much longer! @@ -71,7 +71,7 @@ namespace mg5amcGpu // ** NB: strictly speaking this is not needed when using the CUDA runtime API ** // Calling cudaDeviceReset on shutdown is only needed for checking memory leaks in cuda-memcheck // See https://docs.nvidia.com/cuda/cuda-memcheck/index.html#leak-checking - static void tearDown( const bool debug = true ) + static void tearDown( const bool debug = false ) // ZW: changed debug default to false { if( debug ) std::cout << "__GpuRuntime: calling GpuDeviceReset()" << std::endl; checkGpu( gpuDeviceReset() ); diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.cc b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.cc index f463977c1a..703ea3781c 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.cc +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.cc @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #include "MatrixElementKernels.h" @@ -60,7 +60,9 @@ namespace mg5amcCpu #ifdef MGONGPU_CHANNELID_DEBUG MatrixElementKernelBase::dumpNevtProcessedByChannel(); #endif +#ifdef MGONGPUCPP_VERBOSE MatrixElementKernelBase::dumpSignallingFPEs(); +#endif } //-------------------------------------------------------------------------- diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.h b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.h index 7acff4b308..8da04d7945 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.h +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MatrixElementKernels.h @@ -1,7 +1,7 @@ // Copyright (C) 2020-2024 CERN and UCLouvain. // Licensed under the GNU Lesser General Public License (version 3 or later). // Created by: A. Valassi (Jan 2022) for the MG5aMC CUDACPP plugin. -// Further modified by: J. Teig, A. Valassi (2022-2024) for the MG5aMC CUDACPP plugin. +// Further modified by: J. Teig, A. Valassi, Z. Wettersten (2022-2025) for the MG5aMC CUDACPP plugin. #ifndef MATRIXELEMENTKERNELS_H #define MATRIXELEMENTKERNELS_H 1 @@ -134,7 +134,7 @@ namespace mg5amcCpu // Does this host system support the SIMD used in the matrix element calculation? // [NB: this is private, SIMD vectorization in mg5amc C++ code is currently only used in the ME calculations below MatrixElementKernelHost!] - static bool hostSupportsSIMD( const bool verbose = true ); + static bool hostSupportsSIMD( const bool verbose = false ); // ZW: default verbose false private: diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryAccessGs.h b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryAccessGs.h index 63c17a68fa..50a6aaef4d 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryAccessGs.h +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryAccessGs.h @@ -128,6 +128,14 @@ namespace mg5amcCpu #endif } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) + // [Signature (SCALAR OR VECTOR) ===> fptype_sv* kernelAccess( fptype* buffer ) <===] + static __host__ __device__ inline fptype_sv* + kernelAccessP( fptype* buffer ) + { + return reinterpret_cast( buffer ); + } + // Locate a field (output) in a memory buffer (input) from a kernel event-indexing mechanism (internal) and the given field indexes (input) // [Signature (const, SCALAR) ===> const fptype& kernelAccessConst( const fptype* buffer ) <===] static constexpr auto kernelAccessConst_s = diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryBuffers.h b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryBuffers.h index 5bd3053393..ac5f50dc7e 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryBuffers.h +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/MemoryBuffers.h @@ -13,6 +13,7 @@ #include "CPPProcess.h" #include "GpuRuntime.h" #include "Parameters_MSSM_SLHA2.h" +#include "processConfig.h" #include @@ -274,7 +275,8 @@ namespace mg5amcCpu typedef BufferBase BufferNumerators; // The size (number of elements) per event in a memory buffer for numerators - constexpr size_t sizePerEventNumerators = 1; + // (should be equal to the number of diagrams in the process) + constexpr size_t sizePerEventNumerators = processConfig::ndiagrams; #ifndef MGONGPUCPP_GPUIMPL // A class encapsulating a C++ host buffer for gs diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.cc b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.cc index 6867c6d67d..69a253f83b 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.cc +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.cc @@ -7,7 +7,7 @@ // Further modified by: S. Hageboeck, O. Mattelaer, S. Roiser, J. Teig, A. Valassi, Z. Wettersten (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== @@ -25,6 +25,7 @@ #include "MemoryAccessMatrixElements.h" #include "MemoryAccessMomenta.h" #include "MemoryAccessWavefunctions.h" +#include "processConfig.h" #ifdef MGONGPU_SUPPORTS_MULTICHANNEL #include "MemoryAccessDenominators.h" @@ -96,6 +97,69 @@ namespace mg5amcGpu namespace mg5amcCpu #endif { +#ifdef MGONGPU_SUPPORTS_MULTICHANNEL + __device__ INLINE unsigned int getChannelId( const unsigned int* allChannelIds +#ifndef MGONGPUCPP_GPUIMPL + , + const int ievt00, + bool sanityCheckMixedPrecision = true +#endif + ) + { + unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr +#ifdef MGONGPUCPP_GPUIMPL + using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page + if( allChannelIds != nullptr ) + { + const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) + const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) + // NB: channelIds_sv is a scalar in CUDA + channelId = channelIds_sv; + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + } +#else // Cuda or C++ + using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events + // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) + // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + if( allChannelIds != nullptr ) + { + // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) + const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 + uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) +#ifndef MGONGPU_CPPSIMD + // NB: channelIds_sv is a scalar in no-SIMD C++ + channelId = channelIds_sv; +#else + // NB: channelIds_sv is a vector in SIMD C++ + channelId = channelIds_sv[0]; // element[0] + for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] + { + assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId + } +#endif + assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) + if( sanityCheckMixedPrecision ) + { +#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT + // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) + const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 + uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) + // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 + for( int i = 0; i < neppV; ++i ) + { + assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector + } +#endif + } + } +#endif // MGONGPUCPP_GPUIMPL + return channelId; + } +#endif // MGONGPU_SUPPORTS_MULTICHANNEL + constexpr int nw6 = CPPProcess::nw6; // dimensions of each wavefunction (HELAS KEK 91-11): e.g. 6 for e+ e- -> mu+ mu- (fermions and vectors) constexpr int npar = CPPProcess::npar; // #particles in total (external = initial + final): e.g. 4 for e+ e- -> mu+ mu- constexpr int ncomb = CPPProcess::ncomb; // #helicity combinations: e.g. 16 for e+ e- -> mu+ mu- (2**4 = fermion spin up/down ** npar) @@ -305,7 +369,7 @@ namespace mg5amcCpu COUPs[ndcoup + iicoup] = allCOUPs[ndcoup + iicoup]; // independent couplings, fixed for all events fptype* MEs = E_ACCESS::ieventAccessRecord( allMEs, ievt0 ); #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); #endif #endif @@ -315,7 +379,7 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL // Numerators and denominators for the current event (CUDA) or SIMD event page (C++) - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); #endif @@ -552,7 +616,9 @@ namespace mg5amcCpu #else memcpy( cHel, tHel, ncomb * npar * sizeof( short ) ); #endif +#ifdef MGONGPUCPP_DEBUG fpeEnable(); // enable SIGFPE traps for Floating Point Exceptions +#endif } //-------------------------------------------------------------------------- @@ -920,9 +986,6 @@ namespace mg5amcCpu #ifdef MGONGPUCPP_GPUIMPL // Remember: in CUDA this is a kernel for one event, in c++ this processes n events const int ievt = blockDim.x * blockIdx.x + threadIdx.x; // index of event (thread) in grid -#ifdef MGONGPU_SUPPORTS_MULTICHANNEL - using CID_ACCESS = DeviceAccessChannelIds; // non-trivial access: buffer includes all events -#endif #else //assert( (size_t)(allmomenta) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] //assert( (size_t)(allMEs) % mgOnGpu::cppAlign == 0 ); // SANITY CHECK: require SIMD-friendly alignment [COMMENT OUT TO TEST MISALIGNED ACCESS] @@ -930,7 +993,6 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL using NUM_ACCESS = HostAccessNumerators; // non-trivial access: buffer includes all events using DEN_ACCESS = HostAccessDenominators; // non-trivial access: buffer includes all events - using CID_ACCESS = HostAccessChannelIds; // non-trivial access: buffer includes all events #endif #endif @@ -955,11 +1017,12 @@ namespace mg5amcCpu fptype_sv& MEs_sv = E_ACCESS::kernelAccess( MEs ); MEs_sv = fptype_sv{ 0 }; #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - numerators_sv = fptype_sv{ 0 }; + for( int i = 0; i < processConfig::ndiagrams; ++i ) + numerators_sv[i] = fptype_sv{ 0 }; denominators_sv = fptype_sv{ 0 }; #endif } @@ -972,17 +1035,7 @@ namespace mg5amcCpu // *** START OF PART 1a - CUDA (one event per GPU thread) *** #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the current event (CUDA) or for the whole SIMD event page (C++) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a SIMD event page - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - const unsigned int* channelIds = allChannelIds; // fix #899 (distinguish channelIds and allChannelIds) - const uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) - // NB: channelIds_sv is a scalar in CUDA - channelId = channelIds_sv; - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) - } + unsigned int channelId = getChannelId( allChannelIds ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (for the single event processed in calculate_wavefunctions) @@ -1097,38 +1150,7 @@ namespace mg5amcCpu const int ievt00 = ipagV2 * neppV; // loop on one SIMD page (neppV events) at a time #endif #ifdef MGONGPU_SUPPORTS_MULTICHANNEL - // SCALAR channelId for the whole SIMD neppV2 event page (C++), i.e. one or two neppV event page(s) - // The cudacpp implementation ASSUMES (and checks! #898) that all channelIds are the same in a neppV2 SIMD event page - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - unsigned int channelId = 0; // disable multichannel single-diagram enhancement unless allChannelIds != nullptr - if( allChannelIds != nullptr ) - { - // First - and/or only - neppV page of channels (iParity=0 => ievt0 = ievt00 + 0 * neppV) - const unsigned int* channelIds = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 ); // fix bug #899/#911 - uint_sv channelIds_sv = CID_ACCESS::kernelAccessConst( channelIds ); // fix #895 (compute this only once for all diagrams) -#ifndef MGONGPU_CPPSIMD - // NB: channelIds_sv is a scalar in no-SIMD C++ - channelId = channelIds_sv; -#else - // NB: channelIds_sv is a vector in SIMD C++ - channelId = channelIds_sv[0]; // element[0] - for( int i = 1; i < neppV; ++i ) // elements[1...neppV-1] - { - assert( channelId == channelIds_sv[i] ); // SANITY CHECK #898: check that all events in a SIMD vector have the same channelId - } -#endif - assert( channelId > 0 ); // SANITY CHECK: scalar channelId must be > 0 if multichannel is enabled (allChannelIds != nullptr) -#if defined MGONGPU_CPPSIMD and defined MGONGPU_FPTYPE_DOUBLE and defined MGONGPU_FPTYPE2_FLOAT - // Second neppV page of channels (iParity=1 => ievt0 = ievt00 + 1 * neppV) - const unsigned int* channelIds2 = CID_ACCESS::ieventAccessRecordConst( allChannelIds, ievt00 + neppV ); // fix bug #899/#911 - uint_v channelIds2_v = CID_ACCESS::kernelAccessConst( channelIds2 ); // fix #895 (compute this only once for all diagrams) - // **NB! in "mixed" precision, using SIMD, calculate_wavefunctions computes MEs for TWO neppV pages with a single channelId! #924 - for( int i = 0; i < neppV; ++i ) - { - assert( channelId == channelIds2_v[i] ); // SANITY CHECKS #898 #924: all events in the 2nd SIMD vector have the same channelId as that of the 1st SIMD vector - } -#endif - } + unsigned int channelId = getChannelId( allChannelIds, ievt00 ); #endif // Running sum of partial amplitudes squared for event by event color selection (#402) // (jamp2[nParity][ncolor][neppV] for the SIMD vector - or the two SIMD vectors - of events processed in calculate_wavefunctions) @@ -1301,11 +1323,12 @@ namespace mg5amcCpu #ifdef MGONGPU_SUPPORTS_MULTICHANNEL if( allChannelIds != nullptr ) // fix segfault #892 (not 'channelIds[0] != 0') { - fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 ); + const unsigned int channelId = getChannelId( allChannelIds, ievt0, false ); + fptype* numerators = NUM_ACCESS::ieventAccessRecord( allNumerators, ievt0 * processConfig::ndiagrams ); fptype* denominators = DEN_ACCESS::ieventAccessRecord( allDenominators, ievt0 ); - fptype_sv& numerators_sv = NUM_ACCESS::kernelAccess( numerators ); + fptype_sv* numerators_sv = NUM_ACCESS::kernelAccessP( numerators ); fptype_sv& denominators_sv = DEN_ACCESS::kernelAccess( denominators ); - MEs_sv *= numerators_sv / denominators_sv; + MEs_sv *= numerators_sv[channelId - 1] / denominators_sv; } #endif //for( int ieppV = 0; ieppV < neppV; ieppV++ ) diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.h b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.h index 24c27005b8..7a900b2e53 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.h +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/CPPProcess.h @@ -7,7 +7,7 @@ // Further modified by: O. Mattelaer, S. Roiser, J. Teig, A. Valassi (2020-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.sa/src/HelAmps_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_tt.sa/src/HelAmps_MSSM_SLHA2.h index 9ed58e24f1..460544122c 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/src/HelAmps_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_tt.sa/src/HelAmps_MSSM_SLHA2.h @@ -8,7 +8,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.cc b/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.cc index aa00d6a9e4..aa7f4d3b2e 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.cc +++ b/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.cc @@ -7,7 +7,7 @@ // Further modified by: J. Teig, A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== diff --git a/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.h b/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.h index 3e29f2ccbe..6cb2039b6b 100644 --- a/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.h +++ b/epochX/cudacpp/susy_gg_tt.sa/src/Parameters_MSSM_SLHA2.h @@ -7,7 +7,7 @@ // Further modified by: A. Valassi (2021-2024) for the MG5aMC CUDACPP plugin. //========================================================================== // This file has been automatically generated for CUDA/C++ standalone by -// MadGraph5_aMC@NLO v. 3.6.0, 2024-09-30 +// MadGraph5_aMC@NLO v. 3.6.2, 2025-03-19 // By the MadGraph5_aMC@NLO Development Team // Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch //========================================================================== From 975a11336488656e9443cf623254b610ab51677d Mon Sep 17 00:00:00 2001 From: Stefan Roiser Date: Fri, 21 Nov 2025 19:53:53 +0100 Subject: [PATCH 37/37] regenerate all processes --- .../SubProcesses/P1_epem_mupmum/card.png | Bin 0 -> 2922 bytes .../SubProcesses/P1_epem_mupmum/matrix11.png | Bin 0 -> 9651 bytes .../P1_epem_mupmum/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_sm_epem_mupmum/processConfig.h | 16 ++++++++++++++++ .../gg_tt.mad/SubProcesses/P1_gg_ttx/card.png | Bin 0 -> 3052 bytes .../SubProcesses/P1_gg_ttx/matrix11.png | Bin 0 -> 13057 bytes .../SubProcesses/P1_gg_ttx/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_sm_gg_ttx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_ttx/matrix11.png | Bin 0 -> 13057 bytes .../SubProcesses/P1_gg_ttx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_gg_ttxg/card.png | Bin 0 -> 8294 bytes .../SubProcesses/P2_gg_ttxg/matrix11.png | Bin 0 -> 21957 bytes .../SubProcesses/P2_gg_ttxg/matrix12.png | Bin 0 -> 20582 bytes .../SubProcesses/P2_gg_ttxg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_ttxg/card.png | Bin 0 -> 8294 bytes .../SubProcesses/P1_gg_ttxg/matrix11.png | Bin 0 -> 21957 bytes .../SubProcesses/P1_gg_ttxg/matrix12.png | Bin 0 -> 20582 bytes .../SubProcesses/P1_gg_ttxg/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_sm_gg_ttxg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_ttxgg/card.png | Bin 0 -> 33233 bytes .../SubProcesses/P1_gg_ttxgg/matrix11.png | Bin 0 -> 25418 bytes .../SubProcesses/P1_gg_ttxgg/matrix12.png | Bin 0 -> 24929 bytes .../SubProcesses/P1_gg_ttxgg/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_sm_gg_ttxgg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_ttxggg/card.png | Bin 0 -> 242562 bytes .../SubProcesses/P1_gg_ttxggg/matrix11.png | Bin 0 -> 27237 bytes .../SubProcesses/P1_gg_ttxggg/matrix12.png | Bin 0 -> 26722 bytes .../SubProcesses/P1_gg_ttxggg/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_sm_gg_ttxggg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gu_ttxu/card.png | Bin 0 -> 3027 bytes .../SubProcesses/P1_gu_ttxu/matrix11.png | Bin 0 -> 17190 bytes .../SubProcesses/P1_gu_ttxu/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gux_ttxux/matrix11.png | Bin 0 -> 17238 bytes .../SubProcesses/P1_gux_ttxux/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_sm_gu_ttxu/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_sm_gux_ttxux/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_bbx/card.png | Bin 0 -> 3035 bytes .../SubProcesses/P1_gg_bbx/matrix11.png | Bin 0 -> 16018 bytes .../SubProcesses/P1_gg_bbx/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_heft_gg_bbx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P0_dux_ttxwm/matrix11.png | Bin 0 -> 9662 bytes .../SubProcesses/P0_dux_ttxwm/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P0_udx_ttxwp/matrix11.png | Bin 0 -> 9637 bytes .../SubProcesses/P0_udx_ttxwp/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_dux_ttxwmg/matrix11.png | Bin 0 -> 20504 bytes .../SubProcesses/P1_dux_ttxwmg/matrix12.png | Bin 0 -> 20382 bytes .../SubProcesses/P1_dux_ttxwmg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gd_ttxwmu/matrix11.png | Bin 0 -> 20351 bytes .../SubProcesses/P1_gd_ttxwmu/matrix12.png | Bin 0 -> 20152 bytes .../SubProcesses/P1_gd_ttxwmu/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gdx_ttxwpux/matrix11.png | Bin 0 -> 19636 bytes .../SubProcesses/P1_gdx_ttxwpux/matrix12.png | Bin 0 -> 21590 bytes .../P1_gdx_ttxwpux/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gu_ttxwpd/card.png | Bin 0 -> 5708 bytes .../SubProcesses/P1_gu_ttxwpd/matrix11.png | Bin 0 -> 20341 bytes .../SubProcesses/P1_gu_ttxwpd/matrix12.png | Bin 0 -> 20216 bytes .../SubProcesses/P1_gu_ttxwpd/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gux_ttxwmdx/matrix11.png | Bin 0 -> 19688 bytes .../SubProcesses/P1_gux_ttxwmdx/matrix12.png | Bin 0 -> 21566 bytes .../P1_gux_ttxwmdx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_udx_ttxwpg/matrix11.png | Bin 0 -> 20526 bytes .../SubProcesses/P1_udx_ttxwpg/matrix12.png | Bin 0 -> 20438 bytes .../SubProcesses/P1_udx_ttxwpg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P0_gg_ttx/matrix11.png | Bin 0 -> 13057 bytes .../SubProcesses/P0_gg_ttx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P0_uux_ttx/matrix11.png | Bin 0 -> 7672 bytes .../SubProcesses/P0_uux_ttx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_ttxg/matrix11.png | Bin 0 -> 21957 bytes .../SubProcesses/P1_gg_ttxg/matrix12.png | Bin 0 -> 20582 bytes .../SubProcesses/P1_gg_ttxg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gu_ttxu/matrix11.png | Bin 0 -> 17190 bytes .../SubProcesses/P1_gu_ttxu/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gux_ttxux/matrix11.png | Bin 0 -> 17238 bytes .../SubProcesses/P1_gux_ttxux/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_uux_ttxg/matrix11.png | Bin 0 -> 17758 bytes .../SubProcesses/P1_uux_ttxg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_gg_ttxgg/card.png | Bin 0 -> 33233 bytes .../SubProcesses/P2_gg_ttxgg/matrix11.png | Bin 0 -> 25418 bytes .../SubProcesses/P2_gg_ttxgg/matrix12.png | Bin 0 -> 24929 bytes .../SubProcesses/P2_gg_ttxgg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_gg_ttxuux/matrix11.png | Bin 0 -> 23374 bytes .../SubProcesses/P2_gg_ttxuux/matrix12.png | Bin 0 -> 19456 bytes .../SubProcesses/P2_gg_ttxuux/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_gu_ttxgu/matrix11.png | Bin 0 -> 20542 bytes .../SubProcesses/P2_gu_ttxgu/matrix12.png | Bin 0 -> 19781 bytes .../SubProcesses/P2_gu_ttxgu/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_gux_ttxgux/matrix11.png | Bin 0 -> 20567 bytes .../SubProcesses/P2_gux_ttxgux/matrix12.png | Bin 0 -> 19683 bytes .../SubProcesses/P2_gux_ttxgux/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_uc_ttxuc/matrix11.png | Bin 0 -> 18392 bytes .../SubProcesses/P2_uc_ttxuc/matrix12.png | Bin 0 -> 7487 bytes .../SubProcesses/P2_uc_ttxuc/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_ucx_ttxucx/matrix11.png | Bin 0 -> 18274 bytes .../SubProcesses/P2_ucx_ttxucx/matrix12.png | Bin 0 -> 7487 bytes .../SubProcesses/P2_ucx_ttxucx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_uu_ttxuu/matrix11.png | Bin 0 -> 17733 bytes .../SubProcesses/P2_uu_ttxuu/matrix12.png | Bin 0 -> 18562 bytes .../SubProcesses/P2_uu_ttxuu/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_uux_ttxccx/matrix11.png | Bin 0 -> 20883 bytes .../SubProcesses/P2_uux_ttxccx/matrix12.png | Bin 0 -> 7614 bytes .../SubProcesses/P2_uux_ttxccx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_uux_ttxgg/matrix11.png | Bin 0 -> 22040 bytes .../SubProcesses/P2_uux_ttxgg/matrix12.png | Bin 0 -> 21919 bytes .../SubProcesses/P2_uux_ttxgg/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_uux_ttxuux/matrix11.png | Bin 0 -> 20683 bytes .../SubProcesses/P2_uux_ttxuux/matrix12.png | Bin 0 -> 18714 bytes .../SubProcesses/P2_uux_ttxuux/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_uxcx_ttxuxcx/matrix11.png | Bin 0 -> 18057 bytes .../SubProcesses/P2_uxcx_ttxuxcx/matrix12.png | Bin 0 -> 7998 bytes .../P2_uxcx_ttxuxcx/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P2_uxux_ttxuxux/matrix11.png | Bin 0 -> 17830 bytes .../SubProcesses/P2_uxux_ttxuxux/matrix12.png | Bin 0 -> 18910 bytes .../P2_uxux_ttxuxux/processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_ttxttx/card.png | Bin 0 -> 21871 bytes .../SubProcesses/P1_gg_ttxttx/matrix11.png | Bin 0 -> 25904 bytes .../SubProcesses/P1_gg_ttxttx/matrix12.png | Bin 0 -> 24042 bytes .../SubProcesses/P1_gg_ttxttx/processConfig.h | 16 ++++++++++++++++ .../processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_t1t1x/card.png | Bin 0 -> 3043 bytes .../SubProcesses/P1_gg_t1t1x/matrix11.png | Bin 0 -> 19887 bytes .../SubProcesses/P1_gg_t1t1x/processConfig.h | 16 ++++++++++++++++ .../processConfig.h | 16 ++++++++++++++++ .../SubProcesses/P1_gg_ttx/card.png | Bin 0 -> 3052 bytes .../SubProcesses/P1_gg_ttx/matrix11.png | Bin 0 -> 13057 bytes .../SubProcesses/P1_gg_ttx/processConfig.h | 16 ++++++++++++++++ .../P1_Sigma_MSSM_SLHA2_gg_ttx/processConfig.h | 16 ++++++++++++++++ 126 files changed, 800 insertions(+) create mode 100644 epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/card.png create mode 100644 epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/matrix11.png create mode 100644 epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/processConfig.h create mode 100644 epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/processConfig.h create mode 100644 epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/card.png create mode 100644 epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/matrix11.png create mode 100644 epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h create mode 100644 epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/processConfig.h create mode 100644 epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/matrix11.png create mode 100644 epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/processConfig.h create mode 100644 epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/card.png create mode 100644 epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix11.png create mode 100644 epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix12.png create mode 100644 epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/processConfig.h create mode 100644 epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/card.png create mode 100644 epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix11.png create mode 100644 epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix12.png create mode 100644 epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/processConfig.h create mode 100644 epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/processConfig.h create mode 100644 epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/card.png create mode 100644 epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix11.png create mode 100644 epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix12.png create mode 100644 epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/processConfig.h create mode 100644 epochX/cudacpp/gg_ttgg.sa/SubProcesses/P1_Sigma_sm_gg_ttxgg/processConfig.h create mode 100644 epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/card.png create mode 100644 epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/matrix11.png create mode 100644 epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/matrix12.png create mode 100644 epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/processConfig.h create mode 100644 epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/processConfig.h create mode 100644 epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/card.png create mode 100644 epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/matrix11.png create mode 100644 epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/processConfig.h create mode 100644 epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/matrix11.png create mode 100644 epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/processConfig.h create mode 100644 epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/processConfig.h create mode 100644 epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/processConfig.h create mode 100644 epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/card.png create mode 100644 epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/matrix11.png create mode 100644 epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/processConfig.h create mode 100644 epochX/cudacpp/heft_gg_bb.sa/SubProcesses/P1_Sigma_heft_gg_bbx/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix12.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix12.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix12.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/card.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix12.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix12.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/processConfig.h create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix11.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix12.png create mode 100644 epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/card.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/processConfig.h create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix11.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix12.png create mode 100644 epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/processConfig.h create mode 100644 epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/card.png create mode 100644 epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix11.png create mode 100644 epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix12.png create mode 100644 epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/processConfig.h create mode 100644 epochX/cudacpp/smeft_gg_tttt.sa/SubProcesses/P1_Sigma_SMEFTsim_topU3l_MwScheme_UFO_gg_ttxttx/processConfig.h create mode 100644 epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/card.png create mode 100644 epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/matrix11.png create mode 100644 epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/processConfig.h create mode 100644 epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/processConfig.h create mode 100644 epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/card.png create mode 100644 epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/matrix11.png create mode 100644 epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h create mode 100644 epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/processConfig.h diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/card.png b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/card.png new file mode 100644 index 0000000000000000000000000000000000000000..a7a77bb3ae20a511885b727ce903c6746923f2da GIT binary patch literal 2922 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 ORN9*QPfIjjefVF(Vi0%$ literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/processConfig.h b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/processConfig.h new file mode 100644 index 0000000000..65cfee8266 --- /dev/null +++ b/epochX/cudacpp/ee_mumu.mad/SubProcesses/P1_epem_mupmum/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_EPEM_MUPMUM_H +#define MG5_CONFIG_SIGMA_SM_EPEM_MUPMUM_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 2; + +} + +#endif // MG5_CONFIG_SIGMA_SM_EPEM_MUPMUM_H \ No newline at end of file diff --git a/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/processConfig.h b/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/processConfig.h new file mode 100644 index 0000000000..65cfee8266 --- /dev/null +++ b/epochX/cudacpp/ee_mumu.sa/SubProcesses/P1_Sigma_sm_epem_mupmum/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_EPEM_MUPMUM_H +#define MG5_CONFIG_SIGMA_SM_EPEM_MUPMUM_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 2; + +} + +#endif // MG5_CONFIG_SIGMA_SM_EPEM_MUPMUM_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/card.png b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/card.png new file mode 100644 index 0000000000000000000000000000000000000000..03ecfdfe1691d524e4a258a01594bb90244af5b9 GIT binary patch literal 3052 zcmVEBXL4bAE@@+9002mdot1es)cqdEzrWva_Qf(Y#?DyBk~Pa9%NW~OvahLV>|2ao zN=Yh|l4L892t}JEZIV(EQD}cg9-%y?MJkm?-Fwcx=ibw~=iJvhpYwkG@%^0hIq!eI z0N^XZGO!2$v2jU!dk?n1pML-Y{2Rf%#CW!wn=|+=pGE=nGw*Bt{>^VehlD2bma}Vl zHuK{7NdQ1r%dVE16#vsBmYudC`j=<^^k^>+&a&?V07v@g?oX81{G`aR&@_hU#;~N+ zV16hg(Vici&fs!53^)G9u*jIu|Kqy0B1ad$Lr~xgY4~&5sumZNg5x4>`;1AXT9*6+3 zfDckZCfEjYK|a_A4uWz}1!_S9Xa;9NJGca{ft#QY+yf)v2@rru@EXj4Phb&(AS^_N zsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu*Pz?b5cCKd zhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w;1O5=zlP@# zfDjQnqJU^2EQEu&A^}Jk!bi3sc}NLTgES+ZNH2095g@b37Ze6XMKMrXC^M7;${WQ) zC7`yT3Q*;!6R0*+59&T@95sjffhMD6(3)sdG#BlM4o9b=bI~Q}I&>@g26_ZNiT;Ga zVCWbo#u(#(@yA4AHem`dhcPXfF3b>S0yB@rVkNPfSaYl^HW-_P&Bc~sPhziPhq05` z&p0AZ9;c79!v)~taM`#LTqEuZZWuR(Tf~dtRq&>GS9}OQ9bbsA#dqQd@ss#Pf+&GW zFei8sq6pgvrG#d}4Z>5x2O^QENHih36C;URiKWET#9PF1;ujKyq(S140!hiFy`*|l z7wHk{1DQ-#C0mgL$VueAUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83ah^2{Dh+P&F&=I;S zolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyUG9+y!qb2uCwo5*f zLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3)9(=RhGD<^9&8!uZXdtG)` zjxJ{<7bRCLcSUYSo+@u4A1Plfe^ve!LyW;@#4t)3J&ZX883hN0WQA&l0fj|HrlPlE zwqlFoGbMr&ODRmLSgBiSPFY^rMLAQsN%^q~UWKI+p>jy2S7kw!sp_k`Q?*@nnkm8L zGBcP>%%^H(HA}SwwHmbt>KJvFdbIjs^?MqyhM`7;Muo$t#NI-wzGD&cDwc)9c7&Wo&7q!IzMy`bz^jEb)V=_^c?lF^*Z(5 z>uc!q^eglqtR%0rTbZ@8W92&oO@mN_BL)u*sfI3wI}N)HzZ)4F@r{~|W{j1MgN!SU z$5=F$8>@hI%LHv=ZIWej$>fWvk!h0YS<|;>T4vE^jb_uUn5#lp)vlT_S2PbcuQnH0 zFf4*Bj#>yT6)b}-Yb;+_DOrVB)mcrk)!9+(lk7Lvy4HN_R_g_hDQ7dM%LcKrx5={^ zu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk z&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou=cQ^M6_m>`e9+@7!o>b5E zo{gTLysW(ny`Ffhc_({!`w064`ZV|~_}cgu`3n4W{5Jdb`Ahjn`ga6i1AGGN0_NA) zt~t17GSDzEH*j<!!^q8y^Cq86fEqwAxW zVtiv-VsWuSu@~YfanW%-8|5~pZ5)c%jL(f1B$y@~Oqk<4@#_+y#I=bXNwnn;sy|sR zc}MbiibYCA%I8#{)N^T~X>n=&=^E*~)2A}*GLCOTZQ^a}&Q!?UmN~wey}5b|v}MDV z?kuIOoUF;M_FGSEBW#P_b~jr$yD0nPcHixtIkGuhb0&7!?`X;u%H`*d?KIn2wF|W? za@WA_mAlJ!|Huo;yOXb*Uy}c=fLCy5kKUfrJxhDT_6`&p6&~4#*%!BObid{P6Gfs$ z8ATHZTn@AqGm7(yKOS6v@OFtoN!203q2xn?Qs>f+GUc*;W#7sp%10`!D_SaLDtA{d z91b}=e8lQVbCqmWe%05bkw+g^+gG>MsMeGm!yHRF_OjNew)Z&ectf33U4Gs7`nY<* z36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdfx8$D&r;|^=Iumqe^sLj_?sKej z&F59lSGH1H^V*=c^tQS7h;~7Tf5*@T#|zz^W}U4UwJ+9RQn*xcS?qG*6~dLAD@#{1 zuFiMGcgs`aUtpi2_ZG*;x9rsM`bq=i>x-x7zeC@u?{hJTC5Bf${j|`1^k3Jj=91}bY zc{u$j=Fz*yDUTPQY<-G;n)giPS;=#m=QV$*|Is2a5?mg)8Sj7L`Qph0Z{qcziGO~Z z%y~(ESu!O*)iA9;eQCyS=H9C{uO?r|zh0cp{Y&(($~S6n&cC&K+dtWgo{00009a7bBm000XU000XU0RWnu7ytkOA9O`nbW?9;ba!ELWdKJ|Odv;S zZ*z2WV{&P5bRan{H8d_T^V;he0007SNklhT5IpN^>|(i% zpq*7nVR3~*3XA*+TUdyNSVXW8*}_6mP%OmGDHKDHAc7{w!V$%QNnjJA-erG1$?VLV z_ukBcrAV$B?sIdqZP}~nMofS z-&OH?+F_5!CU)Qpafhot{wOTd_`4q87Ot%CW!y9Cb;`JP&uzxc8|QV-ymAibm`~8> zm>1~xg7Q0G@9_=h3VoVU&(O;ksb@2-&i79$?~V8NG4YD{3>jzQ9bS4a3gXX*YvRj2 z{*#oii2urv>x_8m>)D}BR?NQLo!9=AE2+aZ^xw=c`Z}2}qHE?qdi*Q8Vs2*xcD2w; z+s&>P`qU1Ko7v^ez_u0l_PPB&5&h?FTL^c1Nef@;@u_W<@Pifm1~@JBy%b=}PYb=x zjW^Pp1v5?+^j~7r@_GBa#$T`SjX$F_2PH{Jh)zp|}-e_XbT_YE$&d1TCe)+^=> zZZNH=*E#xq>ie1Vg7x1060iET;(o^p#@wGv`|LU4|TF>hX=yqii+9`07 zOF;8**E7q{P2wbP;UjU9&m^u`p2HR5B>&+Ib%kD!scZBmkNcD|Ilo9e13m9HnEUhb z4I2l~Q+iwgIe*~oM%UxUdVapxEmi!RAC)oQEd>3r*SMW*tu)C+-klu~2 u=cIS_==r#R9>!f3Eh2*GDSGdt3!+EwCJ3T4gVAe35M6YJ=)FZ9B}25)g6L&t2r81K#{UFWwR zpC%|&=#(c%>DHmpuG7`^Fjy|)BkO)@y_2u#!Sb0Z-b=%w>eS4~Hxn;Xvzwlsr`cT} z+Vhc()a~BEQ$AnY(Mq1ZEbRaKQ#gDL@wIUBZ4mp5u`f(nBfs3mNC4M}ul?yiZ+^Gl z$m!afj*qT5$7ro7hbuD+TyGKunn_cg8kI183-ZJtyLVH+mh&g^jN^uXvIc~A>;4_u zguCu92}^JB3S7da+`9Av@xX=rK0*|SQ$rp zk%;pTtOYhdGwt<+skb8@D3|0z##q)RJh;vY{O(FeUVrR-yZ(d~@#OdWy}nnLqLxJb z5du8vygwe=-WH1QwPLBwG=@}ii9UgT9PUlE)Uv9vil|MR9Tj`7$ygF!-;Muk*>$e@ z(VG`LM4%^tFknygFM~hDK1KoeWf&|z)%1EV-`h(%RSaRrxz6T8o_`;Czv!cF7ipJX z*S+VTOI3uQwNku@1V$G1O!NSI+?J^yg%!#zC)`#YD1;aK=~8cyZ`{dvZO8)re5YS^ z1-?SC@3{}zw|iEe(DcxV{S~`)e^Ods>)ctwf6gi;iIqWN_8sVLImlNlAoPx4mIZ1wm&>haNWHFF_LC9^!sKC>ya5_7wnAhQcg0n3Scle$cjysCpri+Yh7!{^p# zB3v3tqDiZ&YpOXZLELwS?E8KCofE}bC-{W;xY(Td==gxF{$^f=alCdc)GS8a-ijcl zFPz|KOdJ;6!3Niq3Nf9wJ^X4k(lO%rH2C+z-i0}a-3n7wEY62nHCaV33$cVeQs;PG zW?Tkz&@?fhQxw;0Q9Y|AG7l?yl;^HeWMm_kQiiQ))oV2K%;e}?5fn<-_)+5cPDH)& zZX<2uJ?sWt{p<5KkE=uG`g`P}>N+dBcbvA0)eW~;@UZ3Tbw^8;Kx zcpxtG^T^G@>E6n=Z{|LMf6gIt>rWSR5xL;b>Q0f)1G;89PQZ^nv2P0BW}X>7>wPAa zx0}Ti+}QeRAIH*GU*pAx(-PC5;t~ z4byPdbD#Jz@IC27b1n;OKkZlz%7d-s5R@cobx2Tn*dA6+%w@%xC;*|ynL)Qx=87P`&)ZYEpqOO#zHSzPKyLe(SQz23v-#2unz z@b-%V&yGzpKa@WKNDSTVIkB^PWbU;)1zd&kqDA3>OAj_R{d06IfE|{>n`Yf@RdDHX{px)d<)=T*l6%~+*XLt zRmB8?he!SB@8_0X&NyzTgvaEeXzZZ}w)OC~bhp7%)_(m|*&Yn>fLOabxOzMl=M@p= zfT#p-GF|Umzlphr6n5%;~psS zj?BG$pYT*vrus3%D@CF5R2DtR(^5Q%%CNDzoAB>_q~RK4Pwzd+44hRb@cOarZq4Xr zO@)4`PojPVGPt?kyDkSCdBWI6?OtluZ&qRB&&&MIH((2XLvJUd1srY>u7t~hp8Vh6 z2)KY6qt(^~S~d>$ySAjh2*Td(c-yYUm$?xiGu$k$8gCbl`#Soet}n(4wvRYG{TmK` zm5w;JrHtrJ{62R0^Jm@B6pe~d&T#PbN4nN?WtSB9yR0pNXOmk4k1?SIn;f1Or^BJ! z_qNgvB(yZ*fla2F!y08!h8^cCEsZ2#U?!ULFM!$|$%=@8==(`SQT+c?P4Um|!mGDL zXwL0>dh51LOs{i*Z=0Aj@_YqoP+sfUbYx?G~Tl93m-PZ9S z;jPu|P{BL&rn7##|1gbqUuN8LY@781RbPGjZK&*WUS{z1=pBeV?<96RWYb`tObkT0 z4gRxd?jZZC8U9Mtn9dIY`@GHH0*!R$mpqJ#a4sg(466Syd^bM)i^Lt#39>%YIg&n? zLv(7ALc*{sD*WVov#ShsxHki7_>H0ggnCwUS3(NFe6~X-ttax~&H~Ku`qz|7$sTOL z&6>N8vb=qaI4b>7~wlsBtCZr9?wC&Xx2 zr^xgapuR6(wvCX?Y5}Ezhsm?&PwRWV@(zhXp{aCyg|}hUge;4t+MF<=B9@)~R66gH zl|EtWU9OhG7f<^eh*)+2QJP>1fWiTKb(zJ&1fDj>E2I#fG=*(TOfv8_(#Jmfxi1Y%r zL+L8idvv%@9tdjk`aCuL#-e6?xwa_jR<3S>jr{`}i3m&lW5IRV`ogsuq1s*^WX8v> z)Pp4c*qi@0`$}xUh%z|Xt*n(3^<|x%vXx=Pm{wO~r3^N{#nP(!9q0D(2b8_Y|?QKDCXlPksEE zExPZ5M#_UiCd3VN&4utI3JS{~Zs!Y(084ej-ERXwFBUM%sP%%Dr9JK&U}H;n`2Ofs zZb2LSUG!wnuvxm2{=j~>P)@GLibP07;BOW>`|S+PrM_>BEG8;pARr5HjU_`98|xYs zL10In>Xmx`1g7PZo%T+m4A2GlPFV8jPLzX*NnNOC%KD3>omjJ4?x_L-*16b>% z3Ov>pkQPqN=X;Z;{jCxjATp}!e^#_4uX^pNx$dO^IKvh$JPck6^8Kov7@@z#dVWbK z&vqpGDx8?5x5eT!P}_JaKm$ESVkuB3pzY4yo=3b0JM+)1DQmMJm<#j2Vj_)7h(ePL z3t0J;0hTd8Ugi}_Wb=6p>AO@JO{&9(XU@m07U@c`9^|dk6H+v#8GdxUmICATItD7e zpbuCQbK>Diy1m1%t_5r{gXFYUu#g2!M(g)K+hAc#CwC3z;#oZo)JI=k?F8BvFAz*E zTeeV;+NiLAdZl$b{Fz$I0QoiAx@4{7ZD@&Nwb3GD;@~Pt}KY$ zi6rjgn;v_a0;k&$ZBsZj2p7(SYKHEKvyzn;izMdY~rx z#*ltCRo^6LP_3JUnRw%;6(s=proh3MqBxJY8u*AHX53CNDFJ-rz=m1AbV(QTH4|Y87Ko{lY_-*}P zeNNnkoE#gITQHL#0X;CJ?F?CLs4#b(ss}%6tJMR4gjxtS(yE~XY|{F9-OuhGP$_v6 zCw=0v@TG3qV&+bs)~E^>1Q?}+nYVo&C$lV;;uZPc zfKMHUfkfFq2&-TwGGzRHwLN6wT6J=%mE~|#sK=AZOC-Hspqj2ZC zRB0x`iMFIne;mSzCP1GpR4Ap}^h`PyxewhxDJRzj%lDO?&R_inpyfzUB^7vNOQbwN z9;?wm%opi(hGXc0PF|H+eVl|QLtU-1{~>h!BdN+j{1;^W8o-U`(Z(T0BZgDouOU`D z!d?d80D!;T5X2_>Q9#=Iyy;kuSXWuojqQ>rq3O`K%m|!>0E}DqEDk3isR_9RlN1y# z6rw_;ItElAn;E86lXiCgY}4Y6$ap0+oKZ)bm5_HZrr2b^Bpln=t`8(j%Yhryt7VaN zG0p2@Or;FaagBK_&`gx7uz)9)^z9?u0O~Q$?$pPTGSM4vs(H) zA9?t?@}T(YZNucnj>VUC;R!b(Nl7C%NKC5VCezjRJ=$T9I6cj@e*3bM{kD!9(}Ij} zXdlkvhRIEvo3s%#0uQAbH`Xp1o+H0Gifmg6&;=$VX0Q8?UE_g}DfS2w*}^dLB=mJG zvhy;5PNKO|l|L;V=-IxtFks*xtRzVl($d|7in8&3Hgi588l;r9J&z0j@6}6JThC{7 zR{;y>9Gm6=eBb{Py=;C|@>K$Yrt@p{Ksi_!vyTh&rXY31d>1-nL`z2U;9bwWpa5Xke2(zsX5Fsw$U5FQiEV9_Hk-a~ z_A(=NSMUdyjg&uVw7ykVZ=Zqx2e`i5f5v`b=C5)D)X+}ioW4smOY3-Jy~47Sgzfzo zN_AU2+?J*WwHq{$WmnI=iHHHyp&+MnWV}q7(e7 z@6W`qo3{tzJ3sNNtdz_R#G8>@ycRzbkkyI5b91JXScChgZXZKBw~CUOtP!)TA;W<| z`_>0fpxI06F^K^hRfdiLy`S&)t>sJ-IEblU2axa_kmz_{6!tNmWarVp9k*^O7)a*n zOjM2cBqRM;KN_F#x04#|%0&I^yYU%A{$qKu+<@ho!mnvvErd!c?YQV4`M57-)g-kO zM4ch5$MRJzBw4ey?7C)90sy`R&GY~*50`Uta6NSj)LAAQuG$8F2wwB(0$n5$-!}6} zqxj1~ez7J@3mZ6jHB-!li{-xGcmGsZlk|W_gfEG;W20`fDi}=1YEk9J*sUTuAKIlM z!DRI>?u$8lGETrogHcQ54tS@1>p}D=E7q%p4T6N0BFkPxZ*06mXZhC+H@|ku>f^7A z_0ln8PVH!>-68LrG zo5A|HATb9@Fj#-cPts`t5oz!EZ?kB7$h@0LhQ1lTxi9$MlCX~{l2h@zWg+JN^z z^s5-y2Tt>G4$l8pWhklKaY3cj1PYYxz7JY2rtKp>{yTHtf!09gNA2$e|N1d^Eox+- z`RiYt!kp>xj4s-Lamt{1Bs7L+j>nvXs1TaHcOpDr2WMuWKqIW7_CoaCiU9cMUAOO- zl$Z`O>;Y+vLDf_t$a`{EIx#@nT7j!n5TNB6>BFb8?@6Nm_ZOROL)~m4T<2dj8_ka3L1A-9%kpxhotm?E}*F+6<8LF4#unM)h5sp zgT(N^7|WeDSN1H6C!~NE+;Tq_N}zI-E-$wXcQj$o6}iqtQ6Xf4$fEY?f22QxKDcQ$ zXv&%nz?KZnzoE0cijMZj7I7xFIvktWvo7}YaK}f5*4p0{X@WZA8Ocfv03@hdF*<2V z+AbqRL->Dc@_v&BuN4kKmw>Z{0nYhuGkt=Wv3rnY_qfPN*+*l0uzk^5?ZC13HZ zi&n#+wtBYGQK{52>Jeh-w9E4&=pwG{AoDffnbMk7Y!^+5mC(*?e#%FX4F;`+{5!G~ zXZ*ByNiO}KazQ^2e?$Agt99nZw{Iw8u~O z8G7=;OS;17%rN%I1;qMzk=l6O%ScqEoGE*SE=8G-3uW{usEE9!rQ{rha|!2T2%$?D zQ=B}YigAurVgQzf-rn|ze>$>XP^}QyKnRL>^|0H4$zE)giU#ee7dBvg?iadxg`95UN=gfB;F){v@$Mz+9e%N)s5 zloR`jLpa^r7_1xe1^-Scvkk(h*93Pfd`^~Q3iW#zh1BfEDeNwBsvhH}rVa~EyJ_07 z(?KYwD+I9I%#jE_P2uU_Wx($yEB`(`(6`a5%WMIFaJGbL-jyxA4RZ$>DVHmnwa*G@ z!XDdMwa8I6$BGG<%T6&>?+q33qH_1qw-p55b3Fhxnd(!DpmK>&M6;fRZ_4M^LiS5% zx|gN;TsG3Cl|`_+57ZwP(eahu24L{2<*Iw5>kyq$Wu`gQ`X7+;ZvcCFreC1JPGx}a zgq(}REi@;S1wJ>zt3(pgzF9aW<+XaB{xl!QzOkIr1;3}zZwHDW$9COlHsrP@@YoNF ziPP)1L-Xjri}Z7K9(>p+h`6C8f7uGkHa@|p!+zAWei9?}z zcA0@jJC|LVtNlB9I2FPKu16FkYYE{%eMYp*3=*NOEe>KmD1u32THXAvXggxm6@4e` zyM9GK01I8(KF^e4O9d7<%?Rv(9oGsvbKR{uGi8)Ro)%AG$Md{snMgQis{FW$Gx~>z zuUkuRY~1-v-vGuA#UGu5rnWi*VzfFw@gMi!4ohB1+{LDSyYjyxlBgbVd2tx>%jbMo-pqr-gGBphcU zDn||L#lM*OPL^cu_3R7qv3?8G=R8a7RL3_tUVOvzv3?mesmGGGm4?g7?ItB|;CB7h zJ#dXIrDhIAe4Q8JcxU}%kmvB{XPno->-OoddFI@{uW8yWm*l0JeMgvU9eL-;nn9*_ znkV0Y5ZCkM`=U5a1# zwtQU>@oq`n4S0e3TC#otttovv=ec5gwiVr9^=M+);^q`HUSAX%Pk>r5Q(n`04m&Xg z*)cIl&!5}38E<~^j6}`u5L$b6Z$EDb2A-XcjTFq2`Jr(O4`sIZd=*`MAP?+dMv^QJ z+ZWHkt=Sd$AXP*wX_&$UX3B1+L6i6Gg1fwKAG_ zkyD-#JC_Nx=S}%5U`TbbMQzL;H0~ zL6X5&xU**OJmBcPi4?k3SlH_@{G4zQFr)cwSQfa@-T~=Ybm=p7gZzLy?+#1!B>o*ySAdGIYWBt-*>=Y7C>$h5XCJTk@)u3(I59JPmEom1q)wy28 zjFD99Y9i!8TSPY>XhGfGQb1zikA9^_cZro;>9!x#nk|oV9-Qgk|shZ;&Q^D0b=f+z?SyTUv#CrCj2+S4%m7Cd=5Cm+R^8f*pAnH z=o$bYpYoi#qFCQ{MkFcxZ4X)!PGw@dAPU8Lu@H4GGar%hpZKwkA;JsJ)lde1p|Y*} zQUFXWCL$7`*vk3_HVb)wFY*Vi%>B{fDR`iJgh!mq&NY=?&=o=1$K*|~)+YzC>THE? zU{{J)P=u%ohZzJ-wT#;PTtul`jYP`x8Ybuxam-Yip1O&QPC5U`V3bAR-L}g&mW{dhv8o5b8)5ph zi%yp+2JG3wK_yRgYk|fw>Ej|=v>g+dqFnC&e#Z7_CNvrYvk!7De1bdjJCieJHyJCC zHNK=`8>U8xBbK7w69hvijQ zQyo=U)?#>b>~IHJKX}kGY_(7*m`Y6$rjI)|JJ>&=3rk!vRsj?~0tDMs>98{ZFEMOo z-Y?YDRAeP7DAnS6EdtWLR4|}3f1RJ)I-$u5oDgF7u&F-*hOr{(nwq!;3Terv+}it4`z1t^DeC*1)eg3G*26l7 ztS+p=((3BW-IKbS%*c3ex>uN{uZF9lgz@8QL=u7QsLK>j>r=$Ovy`2QLF7~JMXTU4hOc)5_2xQ2dC4G5%DFwZWBkddP>Hw%#~3={g#{X-U&iv~OR00* zq?BsEX^8W@{F_YZIg=5ObhB%7N2B@f#f9&E)bFcmJse*T{*4g+rr77=;-9NctEJ+J z%BrurmUnplY>L)DKth{6)~P2k4hl5hzTUA9iB)U4?~79ZIR zT)ahWx4Zo&D*FOuqI|I}i=figfX(SP;tXte3-hyh-;ouJZi!f{BTa2_;bB7^gT zM)zv7J}aYCn|AX(C=mAb$v~V);W-HR5~DxnFNl?Qu&uN{Jd#X?L-7Htr&HvSzYX0H zwBt`e*Uq(>ekTwn0nJBud-qSqDV84g@zjeqg1GBN;Gh-`FKbMhG*vOO$}csQAk7$5 zqPKQF)G@E38mi6>dy7`XeM`aW(aFNi0nu1kGWY3!wmJB>&i?`m@JDIt)%~J? zRJLWu;pe1VqkFvxG(Q-F;y#}TI{QarY||%v7m29Q%r=^?p-7KUzgHLg-FCw=soYR8 zDcsP(i=mHTXsvr%tWc={O3KQ`#?h)U(Q6S{y`SQUtYI*)=*N-s*8V*J(}Z z-v1PAYPk%u^ljjn-5g3EUpB<+hao5SueE(ASye8C40dpiI~Du54a%jor9gzT_Dk(t zBvsS$s)ncta0Oa=BEbfM!Hy^tJ^z)3beyz&a@hD=l^F3CM{S$GwiLRmi|^U1nA1NSwV- zIg%79cdcs6FA^Q_J#lYlOmJlpw?kVIrM}#2+|x3@sZ>{!!?c|t5XdJ5rMg78vQ0$o zLg4lkiQ_Uv^#Gj(467Hj1JTJnPc4;jE?xXNk@%s@mU6a`-Y9s{(*+Cxtt&ce9;35sYVBTO z`n?!IF%e>Y2TGencUUV;1xu$MDKUH*-Tyj*rLOb>Sy8UZtuRoi0MBA=rT`D0)_P!DEAQ1x`F{4#?Z6!5Nliu{>$eVghq+8U?k#cd%(jL{ zRyg<_CLq7h;p$?k_Tdh=(+7 z5PWRQBB64CpB9ww#-#TPu^jtaEkSlIGa&K*NM88=gZ{T<|NlZJ{(mgu2-pG-aQA96 zQy{uFZ3)8Wzm)TVLHew2$E4aoyh+;W8;D?Zo7+QZtAE(xawC1JC9SVX2w)ClJN}A{ z{<(ePO$(ytKCd^dpl=szB6IrfSh)TO*y$-3BGo+5Z13i9Y?H7VZYmxecwKxwtO!5;RoZS{lLf2^ zYCEV0RGMF$lEs&M{aK#^b6ubHBU`=8XUyZ}Oo!&KWLJs9S4^kp5^_*k6e*%HkBB&7M-~(064ZUpXkNFgVwFI`IoG%^iK6*DU>&Jge&1-irWsg^r z_=20P`Emj-gJmnW35>upWeiu{9o5e9(j7EpYHLi{e3KnzVY|rbxmx(IT0s2b<&QTe zGQ3yMq^LqJz>GP&lWUwv#M#hZs|^<8&(v~uzMFrwy&7R~{32&ts+#I%V!}c^Y;Keu zN+TJM{&T0&-MM+y2mPEgFc`io)rysIK%m~~g4R;nWoyLZji;hu!#${T3mBCBIe-o6 zvyMR7>Vm4#Cu=5aW0aw1(=#g^|ATiAZ%7{hLgHg-s||2hH}O;zHD6WBzYY0c6Q}g~ literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h new file mode 100644 index 0000000000..8f6a27f796 --- /dev/null +++ b/epochX/cudacpp/gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTX_H +#define MG5_CONFIG_SIGMA_SM_GG_TTX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 3; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTX_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/processConfig.h b/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/processConfig.h new file mode 100644 index 0000000000..8f6a27f796 --- /dev/null +++ b/epochX/cudacpp/gg_tt.sa/SubProcesses/P1_Sigma_sm_gg_ttx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTX_H +#define MG5_CONFIG_SIGMA_SM_GG_TTX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 3; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTX_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/matrix11.png b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..9017b25979386db577e894d7cce56d620de1b198 GIT binary patch literal 13057 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/processConfig.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/processConfig.h new file mode 100644 index 0000000000..8f6a27f796 --- /dev/null +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P1_gg_ttx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTX_H +#define MG5_CONFIG_SIGMA_SM_GG_TTX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 3; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTX_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/card.png b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/card.png new file mode 100644 index 0000000000000000000000000000000000000000..004a8b90c68f0447ea00c53b0d2d773e04909060 GIT binary patch literal 8294 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix11.png b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8168c79a04aed044a572ddecb196a29a4eb38a GIT binary patch literal 21957 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ⅇduu?;>^x4nS=c)Jdki1(3N{U-`-|H1w-k>v{=g)WN-@jNCfBo` z@d*=ow)*82^Zivz4QNoX6qIhfW}S+i49N=Kcq^l7Mt~+&TM)TdH_t1Q6Hz>+O>8x#*i{L$@kAfAdjU zw(_t-4ss66AueYlN`gnHuC*;JXbh@84a8~OzerKRfi?5!=S7-u=0;K2Wl#odSAK38|KL zz5yV`OFY7tAtiv2jNf2`pK{P-GhL-17h}n<`5j;G<6sZtoH~BRWs!`OQ5@2432L)6 zG{m^HNT;jK@-GnTfM?E<8P^7VMREIwq9#hnUVTtTlhZ8T96etK6pIC5!ChH?8Y17W zb%8I$G8WblqRtxl1fQM+7$sW^W11L_nr)e;29QHcL(r;od2=-?C~92uNiRU^Th2qg zueqiU(0b=){}S2}ls1-1Ecw8)&tx(MzTLg-Mngva6VR_kUand-Kk}Oo zO*IB9cBIp||F-Ikiyc+?n!_eHsO;KgS`v)b7JJ}@6933xQ4xB--S_mJGzLi~W`+J0 z4fiV~OuR88`}O3xsm#_g=dR1OfA;w5q!zfAK?uS_txtnALYL@PwD1KZ4Z@DQ+i8~R zu-tvMW67mLCUPohanvM}&Ca`H|Gj@ja~Tt)06Z`!NmQulKTd zBFf=idZb@#HXfcMdaYAF?BCM~|Kv;5?L^Ea%H{&Yiyqp@R3mN|rs{(AXaMSYF?HFg zp&2?c&z`F&H$-W*OSSgqnC$!(sk-g$nV6Tl6f_Wu-5(~7{TPOE6O0SyP~+hS!3C(= ze{1HvqMBN_J?>Tz*r=d;OF$4r+#n)FktS_#kS5*Gq&JC@&?7}iq7;!XB2q%s4I2;< zl7NI3KtPIwB0VAW4go?42|c;-oN>pv=iK{n?#mfxjPK!F-<)I2wI0@5WB%uFPW$8@ zDd59~D@-#w26j_H@P=x2qqQJ1Dk6kJzz&9N(-_0rx2&90}q)C^Cqh!B^ z=Cm4(PsEHX!UkF>-C$q9WyR-2tIM4 zaMs#<0+&uh{nqt9kgT_@>)pYxH%Gr2R`mPjKIUtDmpFTc%dAi1GhmWZIfyCjs;K>Z z;3gw#bLAm{w;b)l`@3o`r8C~g6g{0v(bpY(I_t-1CcVT~8;_1uCv#y_s^4@j-=?@K z)!AD$?Z7bBIA#qlEXUX#Ixbv}O^e0MR8e`Vfp^#Ch%%rjZb0q|2H0(R?S6CUvlW>6 zd1vQHZUr^6VH_pO-$uy^&Eyol-sHTkvuTDji~(}R1R;P)o*&1k04C|coif}A2q96T z*IObzl9Fd;r$A_a?Bl-4c=>JLDa3JU8W%xy@F4eEto%n9KL%K|qhibJWOJ|xDxD`! z9H(5%j{D3{EyNpC1)PQWdA!e7!eN+k@N@D3bxKxd!lDB^N1L#}j02~3Zg^Fy53Ix@z5oQkq`9;^yT4gGUDiXf~nuIl~}sc_P% zj@i>cqOVVe-XIQetXpry#~Ocj@Wd2?r^H|cXoOdQNjHaj;kF2bOS0s9+Wl`iNZzXo zc(&g1)&cr^$(UM46fAe0noa8yCXbEb@IDQ|qhmwwOisebUEQN+|1H;l$b#a%$*5=rZeKS4v2%eb>Jex9GhqZxj)d z;#~*9k<+Gxw=Y>g0}C|Ghi74dO%-JBtzBKwWKChLve4I6HPKBwYH3SbyH>f>Cs+r$ zH>rwWgJdR+1XNT_oe*^buX$N)f64GRy~W+48O2ktWrTrppcV}du%SnsyPqD#0aLn~ zrQu4vqoq4!<|gp%&J&lb{?fPeX*#{X+*(xnex=d`$DjCjdPYiCwRSntT%pc0BdMG? zpD*|Sx#X|F!hZkI-xe*0^MGQfqd90X@J55BDtisxcF%I9p+X+fo*h_BY0w!&9EpHi zP#<@?3>!VoYk&+_QaAc5$LFZRJn*8Yxe|GUs}fb`SyH^MSS@k+O?dCWc2n>&$m^p( zNf$X$=*N==qg{qvMrE;jOJ4K}9tiL;3S!qIM8x1<96NSO>Bn4v+oEf?N!^JuuY))r zi7wB21!pOw+mTkF>=Ks`GzBu*@`}j3I@&p+*+#gC3hQtk4M~9<0r7_Q-_6gFr+-xh zg?A))Qr^v~j9pG^z*F{#&x^xPQ>IM1)ItIiM=>naB^*uGHD*67n%K^gV+}ME~4B3eCgB;L+ z_?G>wU<9nyIX%^4e0r)85#4_rqVUMp`>yjtemmKo#gJrOUW~?H zRU*dTVNigh<>`ACf= z+q$O}w3oa>PThMhE6h+#S`U1Awd6H!!zL0^kUS?Jz_Q^RuZC%{E_EQj#03px%|7ES{l8t0q>a2Y-RW_`~~Ur$niD$}H`KMaD}JFcIASicJG;GFc#eO3ZoS z@YQ*}cr}O@w$>wK6ZDw;G(WgOLp_1h>tcN**Xr{N=t<5~^7kBP5fB^K<(YJ*<4t%G z#}iX`>g1NGvq*KMYO9#biva+L9~p}obBTd(LEoNR%IqaF+;<&9V@WNEv+;XSj?CEI zs~&$nXt>|+gz?)8Qjl{@L^k?HHg)q*LG`+~YKgIApx!mc zSK(mCwdBY~w^89gHpxIZCra=U>$tq1U3={U%n@4m5Hk1|?LFMB*Z}k(&*e!OpYmw~ z4}K@)>cDpXA8D3->Pb&!5@`u7LaKbjzqL3pzIN8A96#kx``H~VK)owou9(x!g-NF8 zBd#&dySz$n=lIbnzZIz+&kZ_@1eU_(Q%+(Z#YDb=?}ooCX#09o;o2!7t(vxy>&RjT zOPSz}cr%II;3w2PeDpct)Fm2UWRXtE%NWwnmQL#3HAA1gw#@=w?lc<~buoB8OM86s zXfNDS_ojn#qsvRQAmTr?ebEbU7qqXjO`iAUfN5*c>z#(iUM0;=Dh%Z_?#lhmWn!Fn zl2bAW8y+I4KTR<+2lV-5WFiH6Y$xyRi;S9A?x_(xf$z2cR-Ve{_Iqf5dgWZkS{4P-2K@+7>dV`lSK2Zy?b zmtfV46N+A!PqjD(D^5j33nIgcbGNdm?@4EjJKH5A6HQO=W$uvSaCwC3W>50QDbPUVIzN7>a{?HF;%ixmm8YX~#Bj;7n?=jhM*) z)Nu_tiNO}vBsL#VBc<@;;08iMc6~XbR zMaK=lD&#g=F+QcrF0d;clAcjc>5;lW=IC&~CgeF#vdj^maA)DL+t+rYL`mycM8Kku(UJxhd;B6ht8@Ons>ZGn0B$k?MV zKm7_UPC0xTBj2eJsr9-vseM;}BLiW~X%+alts{XxJB#be_@9q!^SZ{4TIBm(Junq< zgE~+2lZ~D~b&8OLaCvI-lk!hEMzwChs#Hpuvz?edH8r`|^_=tvEXOmGkxMJCMF&uMjRd7zQc7Xk0eOV zs5vI$Fms(nZKm2c=0*rsXtUFreA$D(OJu2n)2Lv&4vDo2K!Kqjl!EGPG0`K^5u27qFMq)M; z5hQrn;R-?E3)7z27Uo(&XD_4XK0`neC2Qt9n%!7k9&V{4L<4>$ru!{njBGV z3~>#G11Vx?R=`;@LaFh9GRju))?BYVTCQ*MXJ^f!b-2hAaY-NWsJ!@v^#F8ebR@f& z_D(1A{33Z`P8`Xe*M*I+*s0=Gpk$`XsAS)Ujy8K^_Q4WWAJ-9&!Ua*AcocOHSWD>S zdYN}D`e=tHd}jgF5zpQX7$c9mHl-Vt(Vdo3dXaNVQ@GyLdoE-a^j!v129%7I(_^+@t>s D>YRq( literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix12.png b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..b912383fa490ad326bb1a93f6dc0bedb461f58e2 GIT binary patch literal 20582 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/processConfig.h b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/processConfig.h new file mode 100644 index 0000000000..47044dbe6a --- /dev/null +++ b/epochX/cudacpp/gg_tt01g.mad/SubProcesses/P2_gg_ttxg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTXG_H +#define MG5_CONFIG_SIGMA_SM_GG_TTXG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 16; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTXG_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/card.png b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/card.png new file mode 100644 index 0000000000000000000000000000000000000000..004a8b90c68f0447ea00c53b0d2d773e04909060 GIT binary patch literal 8294 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix11.png b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8168c79a04aed044a572ddecb196a29a4eb38a GIT binary patch literal 21957 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ⅇ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 D>YRq( literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix12.png b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..b912383fa490ad326bb1a93f6dc0bedb461f58e2 GIT binary patch literal 20582 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/processConfig.h b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/processConfig.h new file mode 100644 index 0000000000..47044dbe6a --- /dev/null +++ b/epochX/cudacpp/gg_ttg.mad/SubProcesses/P1_gg_ttxg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTXG_H +#define MG5_CONFIG_SIGMA_SM_GG_TTXG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 16; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTXG_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/processConfig.h b/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/processConfig.h new file mode 100644 index 0000000000..47044dbe6a --- /dev/null +++ b/epochX/cudacpp/gg_ttg.sa/SubProcesses/P1_Sigma_sm_gg_ttxg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTXG_H +#define MG5_CONFIG_SIGMA_SM_GG_TTXG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 16; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTXG_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/card.png b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/card.png new file mode 100644 index 0000000000000000000000000000000000000000..31ddc02e8176b9fcbe19eccdb3ff507d7f93fd83 GIT binary patch literal 33233 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix12.png b/epochX/cudacpp/gg_ttgg.mad/SubProcesses/P1_gg_ttxgg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..db89ede876ce39b43c0b3d7f0ee9831a69c54b92 GIT binary patch literal 24929 zcmdq|bx>SS^zaShZoxIU2A9DtxVyUz0S31Og1ZIR!GZ@117RS+32q_5W-_>IaJS|A zd*0ou_t~x5_n)_FYpeR!^f`Ub>F%k%x6bX)?F3zI6?`0O93&(pd^J@?eIz6_7!nf3 zU*s1Bl5D~CIT8}qjf;YUuA>vs&L8Aws0SQSpp(y)<@a*I3;hvrq&#OT} zp`j_$;S7;+hH*-SY4g`F?+z`Jt<=@HvN9asq+=<8S=}@AU+KLIQ-1wfs#1w7TV*MD zs%vL?=KId#f_TY!=;P^Q;ko#6SU1w@n?AuNEF_4x+Q(o*XirHP66ym@U+2JkC>Shs z!&9P+d?9q~_V_gEDIXWjc9zrP_5pCdeyfHgXFT4RQ$YGW!<y4d zjEbakxARXY3-(Yk(ljj`yED{OF>4#j!Th_JzHn;QM+{H&X{c!=Z~A%T$FsctJM%xk zHbKccJ1Vg%ECNplI3ZTjdUjiFnr`?V3-7vKDy|x@~H1HoaH6k(HbMb zrG$&9%&XW$;c6$;6A?PLuOb<^6=Q4CSXcSd37eg+F{|;Gj*6%J{7L zPBM#-OnysOWEQC?f>&;#6fsS7fkhn$EWMsKp^Q-D$Ipo|vZKpGZ?R*C;acOy{lxad zC`3Ju(O9FtVOhkmiMn5XWs1}jyYniX=#@lS_&Y}K=%{ukWL3(36)3|8Rc!qzVdf%L zJ|Fs53@sxRq!>y{0=niLLRqL|G=mDPrO;9w-K`pu8h|0;zKkoaNZefnTe;J8!8-$C zilaCJmFhCz->kb5esAtDg3zQBo}&9~cPZJ1C^y1ShZXGrb~yZT0z7%V6GT81q0~Wp zR!D)VZ~YqpB{+I=Fvm{E{;Pc)Bop>aj7j@-b!y8`^wo7QcssEr^FJI9O3@gLfuvQV zldAV7AF*WUY~sHT2CieCX5J`8a=c8P{r#&lECg0%G_W7P-=H6pDZNHjnDGY*bAm-e z<-p8<#enxZ1#wJ;{CXOS+Gs^rMUXzl-m5*-d`)9ki*(cxwauN6BS-Q^IysCC zb!Lr(jlao#)4PD~3ZrZ2Rl@Y&a)@U+WF2H-bGA4{+tV#PH9E{Vd>OX->*h z5|9Xx1Cx};Q^nuLS0)(6TalAYzxu&dq>=iW;?J)?Dtk7APJ{6E&+8q7;K8^-3YH4i zdX~4WXDsF{$}HXLf-LT=<*e5lPz{;Pw`wk`-!&@L>C%5NioDUv1Y~Zj?WmPxhjOEi zzZ-c!0?H6)o8c4Ud&BO=N5f~q7Hkz@{E63@m4elTJ5b3(xtPn7k)G3rJIv^bOd+`s zIKZz?C7mpePKAyc;~3)_gB+uzR8`hy54BHP7h;Vh*5K6qV*16xMcd38t|V^oUF{Zv zV;xgT{Mkpf(!@zV`^$da4}(@K{{qgwO+leNt%+(^M-h!yv{vd?%zaA#oS<)ac9+4_ zO|hSqqm^TZO4;gNDyY7EF!g(Ip}4hwty;=jLCst9Lo<%1)@Fw-NmQ*U-6&=Z zLi{hWys?t_9r!&oR5Yh41u4Mf?3AeFHz~uW!Z|c`;r`=j?)L5(PClcXNng@kGWN`7 z+JNT3-@p{$OkG~xTa&rQ0)7)=Lcmu5g(*LGB=;wCEN(LHC>}R%8&giR7}Gg3Eyx^P z?=bUFbpFTu#{=U7^iQ15Le=9K5J=l-3sqAkEC`WIg=0yg-2D|~!rj;n6NxUB=lr11cG z!P!Hz4XrKdA7!BEHO_VJ>!8>9ue*v3e_a-*6qj_?cj0suzpwki9vpa&b&qx@e8YY7 z_lEoy=fUp*aDRELajS9{h-QoW5oI4`djZxc-VPL;=I0mn^5gM!|N9qlP%%GP-_dFP zKIG)iSALgarF5v&v#+sFr0<-jorX(v;#90tp>u)Jm~oI%==1hxrOyU-+jdHJGi%#x znElR7+|24sKxXmut@PtE+Opa*@-nOPgYsPaj}GSc-Vk{R#X5)gZ*OUuEkKn!ZQ?@m zuM`TFJT_X*yba0I1LDsEtqF8$-?j*AWzBd#sGPk|R8m(O+c7Me^>rz8@pgIKqu%S7 zsTMpG{N(x8ecgS3%5Y>cN4z_~>w6IHH>aOD|F|pb3+qQ4t}Jvw%%G&@08tCk4vzbc zfR&>n@n&%gU$y|)@w+jyv8|m?N5TlRR@~M%J`277vOC5Do=0#;J2Jn5Z8Dx4!cDxK zQvuQtcn z|9Mj(Qh(>qC&8`e5T}(f<}nqn`ZwlWPF#T|ytD-3QXdEQReiHTMxk>H<>@N)#t4(P zxtjSb+Ml!<;#bY{)zE9PgZBzWhE}0V*LUqfeb}ia()dI8_$h)ZF*J~I=ey_whA z@WTCf^RA5^pW8M|Fsd_kdL&5vfEV>M@PEGbzLPsfQzlS-i}Syw&?cfqU8;c&humh`~9Sx|;sP0iiQFPau|NIFW zsDB88#6KQ&PdLE@acN1U@IHt=a%}(Z80Ji+C;^2eh8A3FZkmny z=I@Av)ja=Z;wQFz-9~jBwsyNdisrd~S&|SI3ZD3&7HTHQDm%yDARFQ`(;_H~GtLIctYY;+qM^yCo)3e83NFU}X;Uzu3Ou(;>N!e%8dlzrUIRdCk(!2&(-}T&)%0*2-{25%ohoXg807+ z*}3G;OQwWG@26zyXW$9+3$*ibLQ>JyWKenM>Fej~;N#-u#~{utBFxKw{`Y_q35fwo zO;O(Pec@4;4u}?Bv_oaa$?rm%tL8wMiB5z!cV)+mkB3fI*s3IC*w6>KS{J7=?VZKy zkRfQ5i2s{GCU3xY&!8G7p-EP6_xidMF}%lvF&GI8pIf)%wb+fM5|-Y!>zpiY`JG6M zvElwOnH+z8-xZebI^J=N+o3pALP4+GxpMq?-*t_5_B3|mfXZJ1pZ))ja?uUJpTcw= z{B=xaF)L0FBJb&R2CY5%`a*8DLL53CrYw0vKX}5*Q28EAioE=!Ok2+tjtLRZr*~^D z9h+zGiOAxX>7j8Q*EWQsUYPt($%0Bc+n*0Z-=#&^?fe%IiYPhm ztOfxXRpu0qNf0L?KpI2Bm!%M4Bz>{mg!~8O`u{tnfXTuwNX@B$2`t@JA?N}S(MsjH z8~?(Z?Uo2S`d>eU)j5WZoZD?_VF`u8;DV~Wl~6!yh0kLGJhC#+a565LG&4UQh})4u zqO}FrGAM;d3atvF)0zKQRrUl|VkuWXmTmY|Ae7sfCRErKTbIm(L%BX>xUXZ zuOUd#oeM^?n1C5lBtXlHRpbyS($l0z;k#OcCstZyP|D22tP}!8ro#Ir!cDFhS{ANB ztwjfLhLi!2UHEooqoC@ogp<5~1xbt_LAb+zf>x3{uGsvyx2O;+q~Z5}kw10e0%Ejt ziTD|w>6&72F8%1+heI$y5q4_q8z~g);E}zN4MQ{t5BSgM;WcOpR2fNx58k;Iqq6_}PkQ-|yiv(${bn~*iFHoZM%h@7^9AGj)2{!BV&hUrJ z2qb8H5@468X@q;P$5;#U_IS9Q)-f&wVt2ch!g=;JXr4no@x}IGf-ch`NoggQmADuq znrdh_Qn9;Fr16uPyp#+=DdQBY3<`!ZH1%;KA$S9tYA~TK{V(+4Fak%ooDl2UkHQjC zhp28Mjne!KTdl;De-_cO#Sa>6dJ~#IbFxZEzs0Z`u;~qGZdh{cun&G5N#xAt09CQ< ztKOf~$^|mQKSoV{yH&*>VKaLZJt-{nqzxM&NqIsCR-K;4mUl5AI^UPAF#@Xuz~w`R zSdJDCrZ-Q&seo197B=&73uw)gi3>Pb7QL}HVWHFBqIV(-E!|6yaZ^toI>N6+ zLPu8yq;?iNLMfC>0VzOQ4jljgxY|p26=3>BKrVn&rZ_C3dT(5cqZQ|R2UP4+h(DD&B z*z@Aw+Z`fk3E19IQ;7A6I+WLB3<|*f`}#~vvY(alr{+ez-I+(KJELonD#Tw2ZVFU? z$YnczYJW{a$&RpHi@hN-_$Da(f!-9;M)^l#WVYi6VH`kz#J_ z;2zvgAjjhtO2M_@wJ2QqyTbkRD}|k}lEp7>Au=i)TDsdJ6ICN}J4qs*Z>B)%o=}f@ zEUh;GcC_jUep(!Ib4{TXn;yA&FT9C@S5S9bOG4rq%?&=@G?Bl!ZJIZDIV*YacT83J zLpFsaA`c#fZ>0I5WSe&ddH;oa(k-1avus;4$Rm7J9}nVT+S?}FcE&H4jWVBk#jQ%M`WN%ihv%TwH9~&qbkhw;N=QpG#1yp5x!7;t zfBzIOu$veRovr ze>yr(9xjwn^r*U|`}pQ8SF^M8kbBX7DXFE%tFHcgzTk?*jSz|S&U!^RRp`D3#Qllshwz792!SEI`@N^MG=wSeTSAI@AVa?garpa_|eD%-e+W z1@v!drC@a^?-#!GUV}=QBFT@qVfd$T$9Ddig};Sj7-*qbx7a7Rc!xXuYtVxD^>EBh zPG+|l0KrX-vEliVUP^{q2c;kWKE#>Vdp?t5c+~T{N$9m;nXuGO%jw+|z~RTupjC4e z6)nAFODZHKtRD^)2aUR2;wK3e9U$RH!QXD@#y3ejTo*YRq^1Da(b(V8PbaKMv8-&i zh$pKvs!a%MjhI66b7M@&_?{3_Cj&9zJYt94LMvnco_igeKa*Ilb43!$$PJKN2CSI< z1Ao+3v1;<@XSe5X#}J}5ne+l^D^-keV<6^ANh~{?bF-Z`&@{>jcrHLfWwonbvb zi#;Zd3C%Eqy)u5C{>ap*$n~CKvbNQphS%5QkZ;`3T$mRbwFokH?bQ1bHHAEU+&rAh z?LX+fb3Av|EW6UecV)NuV0IP(tF-X(z^uX<7!9lZal~&Dr=Lu1R3R(6Tz;Bul8ltj zsVuuo&uzYCGH4b>ENS)~rMUMAgawL)?8twXT^2~46t+KW2aPEDy&c}ud1@cML&8RE zyHuh%H&6CbX?U1_)gdg)>NgpNv*nw@BwjfyNUVzTobV4B-)d7$+dgcxN2{`v8#`~d zz*h-w2rFPHK}1er{QzDwmC=EICvSiQodoq1LJ%Y;ikOdfw`8WGBfbWQZt0^#ZAWwD znf;D!ojuQd^)hiKH&=}=)!7hiFzkO{)j$89f9iVZbgoo4Kp|z$ zPPHU$C>QGSw>55bXjZa4Ff025PAu@Zb|ED-%5Xfho)i~=zvXAq3s9CFG~WA*bEXnq zbD zS64!f*^b4kr~I`Gj}w4Kc)?&^bJV4%;Z7j2ZMXFxoeTs8^s>2C%?i0vK}SLe$jp1M z80mW1Dk+w0t_9{}Avkr9y)}gTkPtrIgz^4S`ZBDciXRR(BvkX(N4}pyeK2 z>*rqTx7O;48eMlOQUI`oqgq6|uwTnru)8o@pjRK+{jLi;j2MUu{QFwmNkbTOT=kJ-W53Zjv&oT zuQ!n)8#n+y2&D*h7y!#L!IFEOR4z~^TUQV+*SP7{W65`(X;jnG^ioXHC0eL`^BTuB zqdE-(t>a^fGw_ba$|_~WvB_JG@Y)wv%mbq`D7LrdYT7zrak7%?wV~LN<3n zI?QyFTPsxL%#PN}i z4@@-Y?)?3J1_>!*?i)^?+xIKnzd{Zd1;}#K16vdqw{BDA4dPS`-h?mhQyB zN#&_&_AVnrhxP8>`#qCz0prI5>ZI?R+qzC1Z}*17{Htm5xIk-{2p6W6frMTSGEi;P ztv4XxUZ_EgrmaxKprMKIYa9O8Tvn9aVC*I-FhxgIsHo6$yK#eKO<&M(!lOk2mXu&2 zlEH1vaKKt1;luED4uyG9X1mOP2FmHGhtc{DH9h5h9?$<1R^rhH zWG?P78?W^T{;Rw;02yo_)hU8=G`r@xPjm$%G}^HDu?G_Z!_o>nPH=S zjfYdRm_TgZ%*H}%VdA>O6hC8yf*U8_+C z@LavXJtlFpwet7K$4gG#GTH= zRLaUtEcdRJV_2}DRPRHgE}{ovy5+dajHZ-QN` zuT1*@s9$?>W$0;K{XG8UuAhCGGyB|567=tNTmx?5@yNDlkdXz2YR)I3ohJYAbzg&= zqv%9V^jx}1YH<+2tAoX)Amwj8j=PZI0F_%*WaUSTj1+4nq(T-|BYbgh0wN3B#ACv= zu}an65m(ov*Hbr~-za1K=5jxk6ZDBxeMvByFnn|;5lb`-(F@a5Ay7IX_bReH9K&w+ z5Z1p`a;`znRO*wN{UOi<*Y5iy;5d#6k}r7|@w(2OOaKFbK&Ct*a8JfQ3NtE18mhfg zOpch`j!atW)hJV$uH3_}wbn_C;d9H6nZ)>Ni8H)b4r07O{=Hn0AtvyR0lobTb~iKG zH_tlV(cVvCZc(Hsg;`iF=w4q1b>|omxg2!{LQ|7d5 z_X_&Hgpl`&(H2h=YKzZ{a>wRHg1X!nnP=2V4R6El}1 zfDMS3c@{IeZCj^>20S&u3d(ooVtY?16sz|4@Kz9JZ=NY-fwss`l-}xO>%c#%Ypa!K z+TzD;)9C#}$(Hu@Eb%0R|NCi5Zh0t{O{aUIvoBz1c8thE3sX2&S`TWJqH)t= z@S`#0hAAdDBz31iJ_A9>QTR(T2j{PcK+IKNBSTK{Ao%>I3?m$ z3cd(_z(oo^hJ`JYbB63v6(Mej!Mukqx`sX`0bY6PSCi;6Bf29+6gO*Dg!vlCK|xw0 z=j_xJRIiD9aoI6@>x9lc>L%=hL~$NR=T~%2Qn1v${i5orjbV&th#Lq-=@!k*~k5|gf;LR zu9$xBimx{&ZApRA;69tD;}@@)afr^s+8P#%P&;OP0GWeBg#^Fs!46A#G_}q*Nr6T9 z;J%^SklJSS2`xkPQ09OD<_Idv$HCN+ z3$tIJ{-KV?#pC?)WOL44YofV_-qK7tfc=ej3_og2|2TOdpZi&{|6`k)0wMZ-e7mF! zSJ`*a_Fl$W!M1v98Q}rhM@@hYO_7#=Z=Qf3|2+EWyFnKCg(Zkc*OVJDwMp6YIC(}8 zh=SkzIyIgWlpJ7HTY6cW+7K@Jif=(Mx&__#tB2a>QykiJ<7!#@XeCC|5|XtvzTC)cG=gxC$(9M)#txqR zfTHqm7M%bE2gez_@z0mDd7k>4U{Q@1^aD^y_IJLVapcP@UG&NrsKbdk{_?U{KtW&) zVwC$~tmfUSF9MHSCm(4&%7)s-H0Sx9e?}hm|WF4 zr_mJQcvCW}F)$+=Wyeq9M9>kUNsb9mdY&#+$&{eC_X{N2bE3`Eq?a5tBFCg8EhQQi zj0w2k^NRx$vGXQP)vM%jiJTAO$pI4q+`&X??9p1C_i-*Ym)WSB(M<_~&%N@u-=)%H zS-7J6I(Q3^pyS51nQl3>+Dcg9_t%6oq&i?>9RWbXKYC+KM1-mWFqQE2mPu;Bm*BV?0l4FO6s57C_BRqYI{-MRTCN|}SF{&TiSU}XBB71wq z#@=&xMf8@4b8UgOA~n4vdhB0B6Xg6atC^yFA$DN}nMUNGkhN10ePM=zq95v@UJ-%f z71s!lglkvOlDO9NG3PsS^np$~4K!;$Gu<~Q;@D-Ha}$fqvPFfXIb^Q# zrDd$OKB+S%T@)dF{HL;5Hp%~eSGT+@0+2ie7CMjqXmOTkh zW-Vu^QtlkH0C*Qhz{KHJWFO2f@M6k5MfkB!xA#Wm}`JQSw?XqtHgS1eT%+zt>_ z{Q5&Agg&yKvUe`5>=T}0Mt+T5>-T!Ts$9b=&gP{;YyJGHk${qyZTzZXay^-fFI6Le zL7lX{XL^v|_i4idEiHpzECyLXgUtVLWu`|KJ`yU}AE=2k4&#R(gpl0+|7e&hHjsuog9|7v^V$sZ+!?ly1OWqz04`t-BCKUW-!& z7ZXn3%hRY9mhIJ(k#5>g*XO`}vFE_%AXaSUpKHZRD8vn++Mh5tQyRtq1+*;z^s#&NWNzTzvvU3U>(Bsk3pLa%%J#5&BaJ*PfaBr1v zUuxIMFB|U17&ChsW!bJ|_>;g>ZI31lBLlRyq*J^C`*FHo?x8&)5HCr0y8S!AkC0r* zBUGfx5pKMr67`tpe#X=6x&OfMTs5T?aUJl~@Vx3T{Cv{+q}Aj0sCA_kwvrLzSw8-h zsvLE!2a;{qM5!G(NBnN%qwgdLy*PO|+GHIDm5cR==h%mK{OG&|W^K1^5F?TXv`L^s zdXm!50oU>cFOTjuGy7_6M74T=#DhEtS1puAlc14TI@D|56xHXOgN?PADEb2eZep_% z_6PvJd1Pdkz4A%jB744dbSmE}*wlJtBe1xz>zSdZ6hJI*mb!VcF$#4+SJVK-gjzD- zXNNXfiV4F*VZr{!%#YOT7Z#0lCXAaf;*=WZVYqC-C?jtC-Nmiuo`(L@PmT2!B|->E znQs2HJ;fs`I;=^+!VHS+Q-%!wYYh9wA_`*(`|E!uTlK=N{%Jp_4IJ+sB}O%?E;PNn3QDxtivs(BI_yQGTrtP=h(XDwn3}aj z*O=uP9>tmFm{YvC>uK_3bVT`H#m|ST9Puaz8Dw3KH{trBJTxM`nUcs%qD-?HP^Zzj2x~d(lh7uA8&JO z7O_(Myd;bsJ_#xSR+W0=gom}zuotM?tFR~{S!@UkiTr|w6S@=v+0v>0f{?fRv-a)q zDYV)7!HMUUJ*930q<oEL3|s}l0{~B(QkS-dxT7;%F~JhDrskO)wtY8$c?!n$G8*1|-LBA?s#@$lXN&nAp z0aV{jgumbm$3KkzLNPsGW&@NT#c+@1JUKF!k}7~z{NUM~C<1H%L9cSQH)AG&Q&m%u zhiav2Cz6NVHihZie=5g6ni*X}gpzPuGpV8#v#k7nP{^15p$<7H0%v}3M!cC= zs3G7{9wg{8^j8tCJ%HQbkR)i3=dJ}@flQyga3+3OuqruLhyHPcM^#hUfjXqiTsYl;*y@7{xzo$c46j%FA`*(u2HyyK za*w^Z*hKQY@VnyoeXIX77{TD=yP<@HBFS`E{CL>}DNxcoCNp_uvfxD(VxPd~>!=6B zX`xdEC2mU`um$`x?2KDY(aPuSXVZ&-1^sPn@?GxaEJ&sRyDVw--)h;DbQd|_v=+PI zR4afv`=QaYU#m)6Qfz20w0`^T{vkbQth+gPJu~OsFi&`m@>esR67RGaZ^0I#cDSkb z;=s0?32|y#r-Ba9vAS2iWK%lI)x&>9O*_d5@;Lir4Vxoaw17LCLTkoiwlA}LuM@ja z)IwD~Xt5Ta&jeB}CwTuJyjN8ua{w~?PqA2>Z13b&KFGanxrQ8o`A&ri+Dqdx4li@# z0k+C@GNHT#g^nILjl%l}w=}l>%Xq9tG$A*l#Ye$#*(Wak*9IRdN`)dPNbNQV(6>Fu z&Fm!;-sw$K$paIc&^y)jhsddg4japw_(m{Z{*rB*HkgYOsQ9;C&#D&{^)Mz{KIhO7 zVoBOTD48dK=)*g#Ay&B;PwzMs18A?8cZ5l;D@W{2;aFT-?kfQ8rP=2~7b2$8vd@d|qgSaB=J) zlvTg9AD9R^`lfn9V(c?zen*zkFmDEt4&C|iSNfM7>LjT{(wjSl%5z}W!?P`4QEoQF``ej(2ArZMNhdu+?h8kaDK+fz@Sqjo)4XvEFsEyE zDh#yo89YE~3bIc66`RL76!5AU-q~NxHq>kHOD98PU$t9E8Z`+_22bz+5D^aNa9g24 z7}HOC_*>g#=4LAZVy%9%6@5U{8*n}`VBjmc5o-#<;|2sy1^smJ1+HxT)p9lCH@bzoX4M;z z-|;2+d)*u~d#gM(P3E~<->87?OHSYOae73JHA*pl<|Dq3xKC~Zxu%9Ft?MNzu6_p7 z3+b?ztVIc%s5Y(9(Y3N6ZH!$Y*LUwLM*P;Ms}Q3pH~Bh0bqd$wjH1Zess5YhR)2mae(#4A6_96PEe`!9V%m_qC??EzH+UQyt` zc8D~tmiQh=Cg(HR78YQjFkd_8zA~Mxws-13`ym(#uEw8|{8m>L?%f}eDI|-ed7B>u z-R0Zq6LgEq6n*$jf~jXHGpO-3_UOrb#28r6ofP6wbO?&)iid<_PY5L2+1|M0*CY?X zn=p%mmV!731!LQle>x&GpAQt6XwL5@qoKo8q*O7#g|19)SNmvj0f$8sNIp)1IiXxVW0Awem2zkmJffjB z&;P|S_HZzvsqc|dUgA&o$HZUHMtl4}DW?-v`;FZ@s`#{{@n1h-{i{+6ER3PgaueZp zI7uTcZgMyNW`6e^VDOl5A<4!&ip_aG**aU_e@;A z5KoU39s!K{#Q~J6slCq$n}gU*^74}%0Phwg_m#%xLEGKsHpvm8DK}ujdLGkCRFM1 zV;&pn7RM0^;VnuB%c@G7w6EpyG-VKsR;ArdA+pY>1@XK6%&G^sozciEamC(y+=qXy z1%^>g8CG#ZFf92Cn`xFbp-PE7%|-T~Fs-x__yJP3i8CYf(DF$o@Q(1S_->5xw7C7r_#T3Ay{hKq9Wz5Hg!SwYbj+2lz6S;P;c*C>q>|uX*atFnF>k1{-MyqlS|-@^HUH_YGI~l z^m}TbGA0A&7WP`iX!Y3FXt>n!4;wtd4})LFxtRMgJF(GpUe?=ep1+kaXqLY0Ol8x> zHGO6xd-d;;8!#rCV~Le6VCZGd_S_`|tI_VNkr*4I<*FTtDkjeBM3{nPzb?@k85=Xb zZ<4oqElfGy<~uLi5V${QUl94%#j<*OfUG;r5i%!v*}q>vyq>i8S}qFma5#3xcxjf_ zr!Jy{n|rlt%e^vTw&mUxINcDVgu^Fzj2s0)`IkPpJ?{}HQ`609r*Ik32Md=mq)2Lz zA$>P%opnfUQp`Zg{`RKr`eBh?E;?T&S@o0b{=V%d{~ZUHeJw(&6<5z# z@aAdEdokGd?AZP;joXraOaryr%9#XUSe_Rr@hO<%i--_H!iaiwCfM0!N+S-ScDz#NDcQB>{m%_bm-I3EBp%Q6ZP0I~R-~f#&*Tj|0^oQm z2rRNV{~@y_rWeJpES8#VNe~^Z>ku`X)1V{_EH9ePS>-y}2rY@^;RiQ6DMWndxd}&= zCb85GUTo8cMW&Gnz?)m+`|F_x`n)XJ)6J4=LCbG>)|X=>(DR^atsl<+8916}O$#cl zU3OOL4RqnQ{>}q^0E^yNEv#B2o~`2D7uzygu&G|nTmy^N%tDj4S8a2`IM1?bidwdA zwd!@k>C!SGm2hcuv<2DtP_DBqZ@ZG=E=-^U6vR_@n3`f0*#0Wj)Na_( zSEH*q4L8A`b;uYT$2A`~?D&QdJ%}ew%S+EAY?AAlYd*W*QL@kqBx(J1#^?SVL#jt1 zYx027n~5hdgjZY73!CUlv`C1}JnHMK`zi{)l;#0yY7o?#Q`&J0LjVv~)enfd-oEs_ ztt-+x)@wUzVAQCIZ|3we^MSHacEcoELs<)-22q! zEVQ~`0PzApG;Y0QA@~quQSedzt9v5mOGaE`w+!UJ0(V8TabgLCF3Z*o6>c|mOIpu* zf#X8$8f5&Ji)zGheo2p}zi{>lc-~|o9>=#vM)cY|Xf0jS+XfGS#h3Y3p*D~51#GG6 z0N&o_cd`_PQ^%SnO?iFg!bA$HwiEYO8opAOc3{0_Oya(e42GkxtM~U2I zY5HYDkDl_?S!Ji^2P{_kHcC&Q%%q9(E|mNsh;WNaQb1d-yAw3?&c5}<)3J_s?E*At z=v+=7{Gn7>zL4`ffxza`%bsCpK8GzYU=6p7EiGQ=tEh57K8ZA6FV@K-4l5PX4#J2Tc~+j z>Dq?p&MaojIz%^m?vH%I{uG%F(B{QVCk5}BlM{(aa+-a_bLIyM-$RGbKj>q8mzrXR z``$#djSR)!<#c_(e6jZX(!uu1(M+#NzGX1>FGG(~YdgjrY2Sg6&!Y|QF|KK zm#op;lsjVZn9HRyX|e1;bezv-$y1L<46(Hv*^q-xO8QnyWDMLEf5{gWM_^k^CWJeG zS}<^vFPW;NLVc&8Iv3c?z<*$Nk?~mVt3E`;6A^;qMcYkDBMlxtI9t0Y8& z*U0gBuG!Q%im?#UTL)|t8lRE~1;j|Kf2FT&VtkX^pA@fE_Ad{_=D+KxQt3u!P84A~ z9v(m8#ynkn!;at@TJ4iGV5)OUQQ@Wp{l*jqi&op?v7fAqQh3oAMf0Em|J}9x0kaab zXlJLrDwG|7?TR7y1X_G9@Ke>PRu@LmFiaOOW-%?d(Q6N7Acg79F&^?X_7WS7koTG$ zQp6Dl|04BCgCz7izIKGjx7{IdhQjCSXH6<_m>ATa3pxc9cT0o>4Bs(Y8B2*@n4q_W zvAN@|;a%-$;`!6+ni5ChFXD3@E@gX^t-nds!E41TYgTur0-bcv_k9@{GPvbwgUpGu z#};6gcwfi=LN~5Z^I~wvlaU}LPtF{JmBD@fo`L99X;7yC0<*~t=A5=olM(kaXbWjy z=Gu8rD$Ryt3m``9^G&c-xq|OB%|oj*EkAHykX$SJuXdyEj6MvLv(YhWNEb4jJ@B-^4p^XZxm#!8=qu;h>;((5rk;BM;a#yfFje?Mj8ICL7J8wA_rU zOT<`wo%o|xh;K2#{~(vaV-Knq0L(h3>irZ(gE!^(u1y@ueQKD0G}Al%z5+|Po8apt zwL8B?sbJZQ??14^qkLNr5cIuYgT&j0O34w2-3@H&1|Hy{fyjYyG?Zq5o zdtMn@QbKPF>*H_gQ7xbAx~jbY5Q8R)lyMa<3+Fw90_&u)@c_ajDjE2NA?9k_YrA6A zT><{#xXw|*Xg(>?RTz%g-zP%q1r<_~8@%U<{B2*=7tx)Grp78ym|V zTWr-wadFp;e_GmOd3TWX@+_|Z%PHK`z^fT|G~x=0%S9x3p6~pdenfv48vJdMW7$1p z+Ce*Y3213f#qJweLtrV@gYDTmls;^6H`r1H_1)oYnjtTs=vPUxr)0<3*AQFS{5lkR zJtegIW(_p+!Tq#FoCXDRNb`O#Wv6#T7jX3lN_@6&r!S&3q<^p{c#*CPm=e5Re|sS0 z5M7ztc0c`+XPD5V8In0%-f2!f;Im`@EQ@ab-fxlX^uhhM7z{GqVtU`IKecoB_&g!5CcjXX}fkxKRcl!ZjE4e&FEg32K%sv3Cuoqe- z*KFoGC`VBHa+LlYSW_0vR|Zl?otVxPzsF(;AtsLuUnH^y8|(dox5ceOUS1hJ*>&`8 zAMWq~Qc;k#$A1~?Jpkc(3a1W{%4>{RwYlizmhuqG$*N&Z7C|et1kJZ_N{ceJ(O0|Q zm6P!HT&dps`!<-?$TKX}0l4zu#i5OgmkGbUlYB9L0vY%}2&4TS{bK~Nw)_=$N zPYs(FZ7#D1*hR?SQi3aqWKh+bzGGm#G|afpq1F{DphTTPB1T+Vk*`KeDD zxO%X&)$AuV(Wzq6_4WU(aE+|(#zHU>@3FsmmP_N|-*dpC5n(mZqnLQrkx^R9*T1d# zCELHBcCS9%^n!77j8lX{dm#6*{0#-a#lTS>an^}j6o6YE7XCd(-JYP|812IJCun-{ zEo;IK{wh8*XnbbWGyR5vdzwM{KO3&ZZoUZ&w5^|@zAOynpH848QgykP`2bich&`}G zCBt9F>8{>Tf0BMekNuz73^f|w_Tag)?R;u4(QDy0UHR3wH}Si~WclKiVuL-r{48`N zmw~+?ouFD_qwj4jyj6H)Kt!>AXw=W{SHCT|!gHldh!G_Do$^#%{qrEZCdg`$S+yXwC<4^V#RdrtS`r>pssMnNX<(Devg$)By!?cFx zD_zvj<u%bl%WBcvL zRQ4(Ymf(-Bu{dD{-&yqNPWmfcYpJ+K01e(t3a51P`g6LwQKh=+>49;fH~& z;I|PJ%N2_QVH^)pqauze1X`7OvRvo2_DV&MERBCz1cMx(0%uSW-22 zj;#LWj+P*?WSJA3p&YedeVuybqx*321nHt9mF)@xWk&E!vQ^5TMgcSbl-{gKJJM*h zd{O(qP!fg%T()Gh0#L4AFkPt6|6n>bM_j2L#5$%Mzs!8X4{)?%^dY7@h3P--yoTAG zBU5F;J23|91=wy{ZPd7-ZiVc{J(G=LVV*1WpCK}W`{55sh{P|MhIu@Zyi1dXjpR3J|77*g2m$f zb>@yJ)T8sRX6XMKud@@*|4#h^?6Q*e4)IfdDKJ7?z6Kokyzc(+-r7DG+(b8+V3p2? z7xGRd6>|F$J<(IStWfEDWa0(Po;3sQDglnJdfv)m2sf|u@i9q!%TY)6|LrcyEP zRb*Kf*g$)t{-J4M1~0b3lF##DClUo;JKHY6p$m85L-12K>;1BF?jwB)#!3>r_Vx%f zcT_C=eW>K!)mGF(U+Vt<8Q5*M;ryR@opcZW&zAoHo=*0m-%S*ZJmbOm%(G4-mA+8I zd(HQM$8}EN8`1yIv~D86*T?Gx*kJ_xzX3aLphXD3_PxE|w&`h!jxoTzQEhqFbG=E4 z{z|eT;#Js;K5gO)uzNFf_&0QTH?Z#DfcY%!@M}cWY)C6fH_^^?z?RNB> zL%OiB|GS~x|BeHn24MAj6`DFcX=Ib++HO(y9WFS+77YAL>WXp3Go9dXmmMXz7 z$Jbyr;9qo9i{3b4ZK2E&Ja=fgkDaP{OOku3NtgMJ|VP}q6}idc90=(M)bAjtoZX3jIJ ziSO(8Vu2qW=}51NK&Xb^5u^(8BY=_KVQ4C#bm=YhYN&z~0jUP*JroH=iirV2=t!@E zv?u=8eRH4tyt!}gx@*mgGy9yq=j@qTvu2&|`D|=Z{p(0JT*?S*dIK>U#MflG?|ynJ zsSQq1JOu@N=zM(Z*ga4%49pOtDx*4F2GVut-I!%wvT~8t-La5e8X)tD{+XOF$c-3( zPleUC*8Qk%63S&Iupu?E-Oe9$_scF@pFm5N52z}IjX=_Aml5EnVq$-a9- zHn?=1=mR_rykt@XGxPC4ldq59TjzPNO56Q{{jw_f_K4@VF4Y%i%`}K*w8jOzYO-&5 zvR0&NziB)l@tNR7?{m*XhiZoRy8OIEk0AHS>FY_zKTr=t_XxV99)1az;7YFc1nWxu zh{bLNC+m;8e2{a__T)xbyUXcLu{~Lamh&hHN(-+hrDXkCm-_SjY{pXTwb~S=B0Exw zrGjL;OQfB_+4^XgmL_2&hQ-K=K9ng8STuNb%}TD!B64u33Beret+R~?{F1sH6%w1) z<2irl2<)}qz`QUj+dxq1UjX)d(s*4Aja&2~JajTJ=VCydN)P$yCY-7C>h7pV4E0^F z_f`VeF04%iEBqpV>8QOMLmB&u1|8_n-&}=-+F6?8Qt~0gQTCqM`qnkuT6`N57B8GE z1jj4$YHj*yMg$h5=)lE_P7R;$qC1srdJ$QV(WeHIj`2#)b?i1>HM92tGfvQ;z@n5L z!fV403|FZ+VL*nmGugzucbm6&gJwaecJE9Ro>Tt~b-r(+`wbvj^^C18YGvU)gY8P? zeXWq`-H;(Yh5HWp_`e>!;pn!X=lCRSp2F$1;5u2K-omu8%(1!>mdqPWC3B_gOy^e8 z#Y512b|woVkVqm=UfUE{UCPaPYv88(JLtQK&Tp+xtRIYbUrHjQ=EX8Y+Wp{uFv94B zKg!Q$$QzT}a3kIY!sC@NC+Udon`5^lduBG+e#a}Wtx+P=l7AyP$&O%YYqPmm5x7be zbA$>Z-AT!vJ@$ynCRx)6PP28{KE_jnS2&AR`G5R+S6|>IUCqUy&Ijn86X}}(hxCIH zi|#S*oQzGW_LIu|q2{Q6j$Bz2#AG92n^JR(l@8AzESi9N!Mp&4-BR;s{iTmX%@KS+ zZhSV5#0Kk{vT(mjL!NvjKlz1CC;XAUxVZX58U%Ydg+9`qqvkkEaCY6E(p+Op?oJP) zU1gLw0h{~v*y(W47O^QGVG~nzGrkZo7*pb`^;l}WdKp4RQ4{kHDT?AmfSp&Rc-%4D-{B%YgGhWnX08}gj>xR~7@#Gol0(XVl zjdnsUfswy;0XV$hlQJhzHdMpCMJH>AkxfmpYt z4)@r2zT{b=Rc&ef7`M^v;*s@v&)DlQSe@^5n0FGU_B_CxtTl;_D)^_1C~(~Q?cxvLhH%>n)0a1NxRf@>R1^F^~qyZTAuD9)(3>ZHNl;xZS^97r4|;Tt$2lA z)B&;Gq<6RTV%$ng-?Xv?w&3n`EI@UIS==8v1pQt<)O zn`e|svt@99ad?yU%8Y!eusz*@!;C*tKLHsOp$+d08p>sFLoz5iJz;;Ou!0!ODA!3PFuf1S z-DX&j!ZAMjJYJR9C+{3>(x~?s*C&FhzPR&tI#Q%ZhuC_#iK7dWZP%VD^@`m=()qUp z1+2}p5Ylp6dRR24TT@>DCAj0upP~|Iy5-C{2gZkJ}$Wv?*5J^Ep2oM_PKM}RAX zaw7Fr{PMZyKlMZ+2ii`n5fUs(esXW*h^z%j#^SI8zayiygAk&bxWd!eA?$m-3Uh6c z`x39KVa-XmZ_3FV9n`vT^J}AI_mq?4G^$)}dmCCV#osLRxrgsSb=BU%EF?oO1b}N_ z%aQ0C1`Q*Qndlw{O@%$uJWpP`9tfK*+Q2}lCY+EU>bvz;iS)UV?RRNr;7G5$>#HT7 z)Mz&;^t|L*fy0XQuuG<#SkHb^QYt>2U zrRcDxmS?(7r}ON_dU9cB|GlWvfG^a($mpm@(KyMWE9v+QT^68mQuw%9gB6nUfD}AF zqsHTJ4(rv{`t7w9I64RsDM|dBMm=4?zaB9=mcqWI@M~o-SSqu6$oL>SA@Ks@J{$Ts0@cwsh;?mQtf3}bx^8bzhuY*L zS8uQ|!hf^+c@bM@-@+e-hB3F#qmcbKbe)YZQ$3evxW*l+@ZsI1ku{u+D24shX5Rgk zz(;4{evWPvUBZZ#$tp&*1$KPO>VwYaY6D z&4Qe{a?9;F@|-}*G85{%)^*c)j@9lNbZ@U)1{^D?M+TJ2F5FV2mA-;{PYyp}KQ(E; znz}U2&1uAknV+>gUca4>fu|e~=?f#?PgW(pS?2YCj#RV`^}2m?J&n%59onn6ungH& z%A)=_t7IC5%?Kt{&r}AzG^|ivWq|lu##OIMZMKhLc7xkXiZHIA08nS3i4XFpeb~Ypr zeG@BmXE8Phh@8~B)-~l?(%bS4&A)1C3p9tR9uySnV_H22P*1G$MI_A{30mYCWt{su zO__+8G=I!9gmC8_zlxd1){(^YcSh~MttLdc?9tNG)oUj(&gaM(IS!lewS^Eq?gZ4& zXhDzg6dXM%;>Lz8O4<6Aa07}~)H{aem7n;-GO(8wLibS>zO5{!G2t6&? z?w9>m0@_RPaY1A?Ak7T@^loQJbvckX>1^D{nUCh3$^kq)Qw7>=XEJHv_{{G_^M+oO zfM&gWkyDijg0e|@@@4lM<24oMk6$yf;5N(L!GpGmn>+tFbvg2-p>SRo{iCH#-`$(7 zE4%36lMToE`Gd$nZ0OZ{aJq~Wttw4tQzD*!*Zq$F<_GeA{@rSv_B@uv8UVE!vcXZ( zJ4YU49b4`p*KiXtKJ{dj%l%m4z=n$>Ic7YlE)lcLv9z-_H(xnlx#CVvmdoHE`LjKo zFNO7KW*Kr736!<>Mw(taF-qONoy1sUF|%{|mlJe^UUPP}ad&{{BHVos=DWHs=-(s_ zFy3n#*xjZ%sNXnedY<<7!+qp)(G%|2Gw4FTm7rL`w*UJWJZS6-RkuzC@7M`oTgE7( z%zbCIp*m^1@e8HFV{K#zKW3FOgx^Ph`_xe^u1$p2h_%Y;3WYV3`1}r;+!pewwAWEm zS{NKh>9dYS;$g;oEIXH$JEM0C~phV?9cbF5p{ zmO{Hk=a?4$A`dPBO#55gQUn~k{k(aGvVdQ(jqo99W^^x3FTbrc70S7$GvDgR$JAzM z!ou9NU6kc2EofQ8+2G17tp*{Fh!RijyfFFc&l&KuuxjDO51$aiP#=4NAt=2T#fSqI zq{#mZhmA(FX(Q4eLT|5BGiS>i`*vKUFBr_Gmtqv)&*@@N5NP--x?$+e=@O6TC!`(& zNRt`p9R6iCj<={A`s2B~Y8?{E?l0lo?7$#o}d9 z_|!vf8$Xpbkt>AJv`OlR=9QpzkqP-iF$~!4vDFmEIMaTUdPVczo@TCTx##mEv-osJAk$VCrJo zgZh0TJ8X$95?vmxR@bteU@CD@dNN*4ZJ_fJB5z$kLFAPzD!-IL;gjmjlKV_0h=27f zMG);U)blOB`dp-zh?h>cC3|*1@teRlB9!6Wl2)}_Q`e?zX9HTn|IU-Ywn`<)bj~f3 z^Par~jdc6w35Pz;}4{_XzyTg_)O>Av) zaoDVs?z?>{xs;-}P}nA}Larbh#@+qM&bpRJ@+>A!TqWZK^N0W_)48z}_X61{NeX9q|(>h%_-Ht75#|T~~^%u6>PU^82GcQ_P8kt?dlLVs>4S zrP~%?8xS|x4d$;^A}EIzvc;|2JFMkL6wM;gslSywa=W9d|E0dy%c#`PVd=N&MS7I) z=n|(Gj(XhlOvO%ycUieROKVSVt7aiGLYS8FHk!?zRAOWz_}vSt7OzDR*X2_@;n%J| zs&B+vS7ttfnin){p$W;oM_8<82Bs9U)COx~y0QC2g zvR8HDH^_(MYVq=onp~_9kTqy_v!6QjM22Gz!z|xOWseqP+7V&iQ`)!*sQUCc=r020 zkm_7HB8(8-1*g`O)C^rqom`7z?pX`tfXpSJQn25?|ZMHId&?<5WM8s zI1Ac6eeTE9Lu@B8X`l|A-@`4W9eFmB6>ZC^p~=KQe)!l|-6z^lBOCJSe_^r~0b!=k z!^l~%Gv8=bs~7YPZc8p)8g{{2k`0rkj~10OFhi*57lGn`z@9(wADp*`H!m_HPmr#$ zpH)Yny%x>>@~P_$72vWa5Q8%Cu82oOs+GdAWDeLIgJ5!uTfJCh zy&_W#JDnjNQ(}Yu$MPhhrqYA<2k@>LG>_|Ij}h2oIXnCPSFbI|8yZ8)giFZR9*;;8 zqLt~sNIPKNe=9W%@`0XVSW{%Es#E~PwyouA*d$mPORj}^qpC^R(Y4Scjv$XcJ~j6r zHBTzwKWZmvgCImdw{W9~B#e>EWwl2fY|j#4?k(-)Kx+3&W3}{fdXNyBxSb*{F3fV@hz>K}~9c z*lgsp2`GvI`rhlwO!}hmP#!h(l>EGq?bhByt^^d2x^5P>smP_~;RsYbxtUB7OW&p&t^%4Nw}QQa3tr@A26WK z7FSf@28@4sJ4ZwjraVxTLmrK}ASj3L39(@LOx4-`ylG+FvwvQ$xyCKj+8J>JJm2v9 z)8mo70Cw`M6o2fur(d8STTSre&VO1_Mw~k=D4bm_pJB#FODIV(OV#lAMvO;>19v4I z^gr8aRCG#J2(Di!#@JW7=v5V}IwctA>N zHRaO&@RJ>_88S+n2f84OV^lT^->)-B2P_%x)^j#mSm$XmfCnT}-v-}W^nt;sNcC6{ z)81=u(PVOoc}R7j(IS2)Z>^p|na#lQT}~xIpWzoLiPkzbk$)4{ zGYKEt*`BYg-+nGM6gJsPEW z#`ZD>p?4dJH8W6;q|+GeeBC?kj#_V{nG#d~7ukm9;oXuOD&scjT>0tEpq3~y5hM39 z_tGx@^CCR<&ymr|7(b#_s6fO&CXXg^ID)Zto%2CgRMjg{6j;ST%9?jF=iZa$TccO$ zo68}3go2I#{~Y>})fVOwE2%W`$!q&{OZFB?fO+OxZ`VO}H!IXOZtGt(Ma;I8qb`^) z1`xfRmYmx;lt%QGQW)C=0F!{cIJU;r7-2sbmN!{k+>IY)JvX%HPZzAmFm|0-*&>!T zMo+8~6RT`SeEDi!k^f>mc1VOT@Wg7<%i?`@@J zyYCj{i6~sh^#S7Xmws8d+>YNJf3woO-f3MBI9sMxmaiXN&+24*!5(z5nACOhWB$w( zzqogeh|)^BhU?yUZ0P*+@p`v|H-xV=wEPE7OC;$(oQBH=M%NazU_fBNNOr z(EsR9)Ah@}t%A8umfz=2oOvQtor-Zd?Bt~MiLHud;MHQ;>M%(OZl+V0v7VH`lqdqfUF3jL3QQF-90*Qk!GnfBqV63&xjAOL`)=z=BzfN16vO^ wH%{;S^K;l-hIANQCH}uJZF{8DaM^j9f)v-5?->(o9lHN+gsH38lLmL69z$?(XjHZjhSfq#Gv9X08A7 z`}Wu;`^dBR9fKDJgA)!I5N}D_8ath<6B4*C*;3xXpK%?2 zxw{{-5)JfcIEkzH;_~`*^-2a#L~Wor?ic>U1Z`YWHT8A8$^Drr2ljCJAtIdAHS|C+ zX7)C-w{(>IE3~^bb5hTfiFPcRGI1DU%lm}qzPq&d$LPaa{e$Q`(~sjL>*n7Tp;BL^ z=s53p(LJ<RB5**kr{O7r;L5zQ--$BJqS%TG&w{XgZIzHeiz1q$n1~A0A{F~2q+%~1(n8R1 zyk(9^27MIuaDAzsOMK0Zprgai6ZsV(-0AzAO0$>v#QQdliis@PFDmV=sXz=if#`

Qq@#0(rEAexM`E5IczC$sVaI2 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

NxPH0b@^-}TtwscX|stc3+xI(sjx$uip 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 E7f2J|ssI20 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/processConfig.h b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/processConfig.h new file mode 100644 index 0000000000..fe7af482a7 --- /dev/null +++ b/epochX/cudacpp/gg_ttggg.mad/SubProcesses/P1_gg_ttxggg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTXGGG_H +#define MG5_CONFIG_SIGMA_SM_GG_TTXGGG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 1240; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTXGGG_H \ No newline at end of file diff --git a/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/processConfig.h b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/processConfig.h new file mode 100644 index 0000000000..fe7af482a7 --- /dev/null +++ b/epochX/cudacpp/gg_ttggg.sa/SubProcesses/P1_Sigma_sm_gg_ttxggg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTXGGG_H +#define MG5_CONFIG_SIGMA_SM_GG_TTXGGG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 1240; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTXGGG_H \ No newline at end of file diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/card.png b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/card.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa575c1da8c96cdc88ae3a0746c7042ec153a4c GIT binary patch literal 3027 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 V872WD8chHI002ovPDHLkV1gL6zj6Qo literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/matrix11.png b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..46b5244f60c1a8e89d25de2834afaca59471bc3b GIT binary patch literal 17190 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/processConfig.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/processConfig.h new file mode 100644 index 0000000000..fe66e4e760 --- /dev/null +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gu_ttxu/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GU_TTXU_H +#define MG5_CONFIG_SIGMA_SM_GU_TTXU_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 5; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GU_TTXU_H \ No newline at end of file diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/matrix11.png b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..20f88674c1aeb2e3c81584495918cc0cc0bae1fc GIT binary patch literal 17238 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

!gx95=7J|>lcw0cj^16d}p|dn1}Hu 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/processConfig.h b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/processConfig.h new file mode 100644 index 0000000000..89823b9d1d --- /dev/null +++ b/epochX/cudacpp/gq_ttq.mad/SubProcesses/P1_gux_ttxux/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H +#define MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 5; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H \ No newline at end of file diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/processConfig.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/processConfig.h new file mode 100644 index 0000000000..fe66e4e760 --- /dev/null +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gu_ttxu/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GU_TTXU_H +#define MG5_CONFIG_SIGMA_SM_GU_TTXU_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 5; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GU_TTXU_H \ No newline at end of file diff --git a/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/processConfig.h b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/processConfig.h new file mode 100644 index 0000000000..89823b9d1d --- /dev/null +++ b/epochX/cudacpp/gq_ttq.sa/SubProcesses/P1_Sigma_sm_gux_ttxux/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H +#define MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 5; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H \ No newline at end of file diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/card.png b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/card.png new file mode 100644 index 0000000000000000000000000000000000000000..80d085eec65ffff594396a3cad9b8a6923016cca GIT binary patch literal 3035 zcmV<13ncW3P)EBXL4bAE@@+9002mdot1es)cqdEzrWva_Qf(Y#?DyBk~Pa9%NW~OvahLV>|2ao zN=Yh|l4L892t}JEZIV(EQD}cg9-%y?MJkm?-Fwcx=ibw~=iJvhpYwkG@%^0hIq!eI z0N^XZGO!2$v2jU!dk?n1pML-Y{2Rf%#CW!wn=|+=pGE=nGw*Bt{>^VehlD2bma}Vl zHuK{7NdQ1r%dVE16#vsBmYudC`j=<^^k^>+&a&?V07v@g?oX81{G`aR&@_hU#;~N+ zV16hg(Vici&fs!53^)G9u*jIu|Kqy0B1ad$Lr~xgY4~&5sumZNg5x4>`;1AXT9*6+3 zfDckZCfEjYK|a_A4uWz}1!_S9Xa;9NJGca{ft#QY+yf)v2@rru@EXj4Phb&(AS^_N zsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu*Pz?b5cCKd zhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w;1O5=zlP@# zfDjQnqJU^2EQEu&A^}Jk!bi3sc}NLTgES+ZNH2095g@b37Ze6XMKMrXC^M7;${WQ) zC7`yT3Q*;!6R0*+59&T@95sjffhMD6(3)sdG#BlM4o9b=bI~Q}I&>@g26_ZNiT;Ga zVCWbo#u(#(@yA4AHem`dhcPXfF3b>S0yB@rVkNPfSaYl^HW-_P&Bc~sPhziPhq05` z&p0AZ9;c79!v)~taM`#LTqEuZZWuR(Tf~dtRq&>GS9}OQ9bbsA#dqQd@ss#Pf+&GW zFei8sq6pgvrG#d}4Z>5x2O^QENHih36C;URiKWET#9PF1;ujKyq(S140!hiFy`*|l z7wHk{1DQ-#C0mgL$VueAUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83ah^2{Dh+P&F&=I;S zolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyUG9+y!qb2uCwo5*f zLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3)9(=RhGD<^9&8!uZXdtG)` zjxJ{<7bRCLcSUYSo+@u4A1Plfe^ve!LyW;@#4t)3J&ZX883hN0WQA&l0fj|HrlPlE zwqlFoGbMr&ODRmLSgBiSPFY^rMLAQsN%^q~UWKI+p>jy2S7kw!sp_k`Q?*@nnkm8L zGBcP>%%^H(HA}SwwHmbt>KJvFdbIjs^?MqyhM`7;Muo$t#NI-wzGD&cDwc)9c7&Wo&7q!IzMy`bz^jEb)V=_^c?lF^*Z(5 z>uc!q^eglqtR%0rTbZ@8W92&oO@mN_BL)u*sfI3wI}N)HzZ)4F@r{~|W{j1MgN!SU z$5=F$8>@hI%LHv=ZIWej$>fWvk!h0YS<|;>T4vE^jb_uUn5#lp)vlT_S2PbcuQnH0 zFf4*Bj#>yT6)b}-Yb;+_DOrVB)mcrk)!9+(lk7Lvy4HN_R_g_hDQ7dM%LcKrx5={^ zu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk z&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou=cQ^M6_m>`e9+@7!o>b5E zo{gTLysW(ny`Ffhc_({!`w064`ZV|~_}cgu`3n4W{5Jdb`Ahjn`ga6i1AGGN0_NA) zt~t17GSDzEH*j<!!^q8y^Cq86fEqwAxW zVtiv-VsWuSu@~YfanW%-8|5~pZ5)c%jL(f1B$y@~Oqk<4@#_+y#I=bXNwnn;sy|sR zc}MbiibYCA%I8#{)N^T~X>n=&=^E*~)2A}*GLCOTZQ^a}&Q!?UmN~wey}5b|v}MDV z?kuIOoUF;M_FGSEBW#P_b~jr$yD0nPcHixtIkGuhb0&7!?`X;u%H`*d?KIn2wF|W? za@WA_mAlJ!|Huo;yOXb*Uy}c=fLCy5kKUfrJxhDT_6`&p6&~4#*%!BObid{P6Gfs$ z8ATHZTn@AqGm7(yKOS6v@OFtoN!203q2xn?Qs>f+GUc*;W#7sp%10`!D_SaLDtA{d z91b}=e8lQVbCqmWe%05bkw+g^+gG>MsMeGm!yHRF_OjNew)Z&ectf33U4Gs7`nY<* z36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdfx8$D&r;|^=Iumqe^sLj_?sKej z&F59lSGH1H^V*=c^tQS7h;~7Tf5*@T#|zz^W}U4UwJ+9RQn*xcS?qG*6~dLAD@#{1 zuFiMGcgs`aUtpi2_ZG*;x9rsM`bq=i>x-x7zeC@u?{hJTC5Bf${j|`1^k3Jj=91}bY zc{u$j=Fz*yDUTPQY<-G;n)giPS;=#m=QV$*|Is2a5?mg)8Sj7L`Qph0Z{qcziGO~Z z%y~(ESu!O*)iA9;eQCyS=H9C{uO?r|zh0cp{Y&(($~S6n&cC&K+dtWgo{00009a7bBm000XU000XU0RWnu7ytkOA9O`nbW?9;ba!ELWdKJ|Odv;S zZ*z2WV{&P5bRan{H8d_T^V;he0007BNklISN3W_2kVxdtBR}2P>!b^yHm-pjV^WN;tcjoN_ zOOaf&Gm$~(E>w7Mp z&tg2_slpEZYTCo~0l(8vv-Q^l{@u7E-_Nz@cF%u7uCA=uW?~8AF@aN*+ z(0@R@1OJ(`*Ex78`Rt;@iqY=wyp}CjqK6yozm#8OFO;vdd*xpT{4={#PSpfjE%uVa zXtmhqG%X+I*k_h#th6s4(9bgyze;0aJf0j%^j->I4Ac86e6T+5-f6e2ck}xd>s>y6HSHhAX*bUkcJ4XW dQ=k9Ue*?9GBCfN5$6^2g002ovPDHLkV1k!0)@lF% literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/matrix11.png b/epochX/cudacpp/heft_gg_bb.mad/SubProcesses/P1_gg_bbx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..05c87c33cc1dc0d5bf08de6131532a26d30fd849 GIT binary patch literal 16018 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/processConfig.h new file mode 100644 index 0000000000..4f350b6335 --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_dux_ttxwm/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_DUX_TTXWM_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_DUX_TTXWM_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 2; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_DUX_TTXWM_H \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/matrix11.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..6ccf61186cdae890054df73e6f72c7c2f764201d GIT binary patch literal 9637 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/processConfig.h new file mode 100644 index 0000000000..38d2d5ed20 --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P0_udx_ttxwp/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_UDX_TTXWP_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_UDX_TTXWP_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 2; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_UDX_TTXWP_H \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix11.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..c7dac8de3ac5842ce29c0ec12ff56e4b3476cbb2 GIT binary patch literal 20504 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 ZS8rH!;pera8*Mh6KIL$-_PFoOe*w!-f|dXP literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix12.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..933a7b0b098eacbc9dc072f851cdb5dfe67fb634 GIT binary patch literal 20382 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/processConfig.h new file mode 100644 index 0000000000..743c903011 --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_dux_ttxwmg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_DUX_TTXWMG_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_DUX_TTXWMG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 12; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_DUX_TTXWMG_H \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix11.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..8401e3d60ba947ad6f9159955b76fed25bf21866 GIT binary patch literal 20351 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 Gl>Y#fF7>|v literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/processConfig.h new file mode 100644 index 0000000000..0861e7eec7 --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gd_ttxwmu/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_GD_TTXWMU_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_GD_TTXWMU_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 12; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_GD_TTXWMU_H \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix11.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..357266a07d415efa65986cab9ee4abcd95f3631b GIT binary patch literal 19636 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

0w+?S94dW7RYw+e82GV7mt~sk9%n* zyV63lL|8zHefAs+|L|uJ^ySu9mhscjLR1_@DKY?mxJbx2L6(ok3kY z6zhH(=;FluU##gyiUCkNTr^kSePG`4&w04VG)r zOsy<9&Ky4l1NKo}loNg_jOi*o?+Mw$-XIdc6;>$*XJR0hNNoPawC0%;y^Tx5->F0J zp6zsu_?GYFn(E&Ps}ely69m^+|vI; zk-AbBW1qGd`)o)@c7(M4bxsQ7$N%P>+0cafr0x9gv!nKRmJ9&F97<|_I|shaj>B`Q z@|eDH#a#6=&&fyLPXGpOSI_9KXj>Pdqnl@z?BaDK8JJi|*@HIJS#WjC=|?-~2MP_6 z@%14o^m_+wM7hP~g)_x&?RG);*lX+tmoI|*KoJWg77U!8e$H-s;+C$#kyh=tC9H@K z*PD}ynF49t79;&~uqn5QvUXRKmLm=Q_=RiyOh4p+Pr$XXVC^7rR>n2-Fgjl3YD?F3Li>u{R&70yNMu%0 z#ZMXkjK>JjfP2(;#KW2x|6`x4qcLqh$xJV-WH`#IUG8&ay1E}r6wS=j_=Z_j5L$C; zxS{RdpCd>EIvaf?g{&m9W4O=}j9CFQu^D7u)tFz8D)0Sw!P5Y(X?yndaHfgNR$vy%E{!D6XN=9F-~PWiNz+Yc79Z|j493fxpQ z7Hu$zQEwho12BPvm0v>nMg9G8?2kR;%!wKDoF)|ltQ;HZl1h~K*-C^bpT38WmAJ!^ zNl4>*$*<#35WrI2d_%jIqCEu1PL#?w*#2;i2$}3pg`rJABV^6$cOJhXN@na3W9g8hNA` z+3y=zX_}dSm1;X*(<^vwY#+ORZmxYhJ9YBQ^_?&71zqLFHgyaD=@zU!}Gd+p>eKvx}ASg7aY7dtZ1_GOn)mJZ^+2y*}gk)%8+gYVCb8CXF=e&(| zVMI$Eu#h)KaV~4qp0mG$h!xjGP?s#YzjiD<_n+)?Z}-JD@ZDL_&}kgb8b!heh-kfD z%}C;tJ(a}lO@WpxW~QM{SG0it$ECS-m;%dVgMw^4*)9Fq!*BD_&NZAU-rw}n;vFu*44I7FyK;XRSc<=D@igg_#2MnRsX6K6W%kW!91Us~I2h3r7Fk?4 zCpCt4e4!IxYdk+oJr4uqk0DkFLxm+U+ie`c?CecIr(w|&jKG>zO5q_Jg0`%`W$fJH zD00FX&jeoI`O`a#EP0MBSh3nFcoV%0hfFKZ2_g?lligI-Z1UuTX@z!e$tP)8V7sz> zc%1|iY<>}80YhZd>!*?kElhXi;Luj`Vfc%hM($N-_`*?fcsuU6g=Oyo^|Bg`MSHD$I?qL@{JSHpZ!HNh7j)Jza;2%|Mj_GYNo zn_B5V=wE2~y!u;@%&pmn1_Fc+Vr$r%b9~5AHB9VA=b&1~cD)f{qBCB;Pn>fs337~{k)0(Cy23#1=A<_h%)VJT7}sYV zxv?WM;jLNnHTaf1H@A7H*Si4!uH8!!J1~?#%ax`@i$165dQogcrc+GLNZ2CNhFp#2 zPNXV6@Kc@cZ_bQVZG2Vm%?TTa;FoDO`Y8jmVjx%LRx&aV10El&W|a$zUOufU?Dgx* zO9UF?(_vEJIpp>k6F3czDKdO8H9Zpf-43+sDgR>WRUPb&^G!wmn3FZa z2`<2mM?`oUDBR+7)X4oSq*rQ85^$qgog$b!>Qwcsu>OqH(PCt>X+`d*JOc{hoJBc$ zjQbHsPy|dM2D*j2DM zGTdtJJWO&taE#!nhra~kz;tsJs13Ap%Ozwu?9b)k%rn0={}KVKiRG|I~10TocA$+-8rD^C}iB#gO=e6tZ=9)}>YJ>kkkC)_%jtqJsk) zupxOlfO2x}{9_V~=Yo#f#u6?XQitodS$F481*af7?mbD||51|O_S8WOvY_yzcu%?fZcVE80|Gvqa z%_h6aCYv{Jawqwm=REh^&)meTY6D^n$kflJh4vA{msy2brWch-{Qj94wYrfN6`|I;< z`>V_RxmN)%7cW^?{AYpPFn^i)IO~vM>Rsggd@;d2xq&e7&%}M5gI-_|i0hsuR~q)3 z>&*V;b;?OB>=)f-YNNe3;A-nZ4n|aKq9!%-)7w0CYBreiG0pn*+J+5ty5S5SM&@z< zR5=;)Tr^rY%N@EuTvxPU5fF*O^#xtSecwDP`8 zs0oKaop%DJPb}4yhfCu954{we8x#x)w3~%fUwT>{b$nZq*2(F?iWw0!Hn9)B! z*TI2%v0LHT{$eh{l7++6|G-oeqk|y1iU~tLUA;uEJCQ zMZx+ZcTP0nlBOdzntp+x8KH#@pg1FC!JmaF zY!cnmtRfi)KmEnlf$0g|$NqtZ{k7nS4JGrh;8rSFS;Br9Fom})idrx?b+#;*hr z<0!!=Bq=El6+L>cWcYF7Aqm<%a2~44ZW(SFKm+qg*p7rJ?C~dEq2+9*jXF2MNf?Gq zX@T2s+Jmp|Opi!D2tpCBzxqrL2>@;)cv<>oaxS zs+a(TpkGr%siw+iwPs=UNst*nDkZYgxW)m*zgy1GRvZKBQ&dMn-Vpu4sK1)$C0^Qo z$ik$?;k85Gw?14X-Ae`0zrXb_Uf2c5E6ByatoqUW)%!nCC6vi>Q?}z$N9acs56%zj z54vm-;Di*3ZNbVjse1eAA-UPk!)J0%a3ViF)}Pi|i>Hzj}>e!^zdYZREs zPdCrT#m4l-o{gAIpU&6NQ!AF$nwEf8oB6wxqjV0V6D2u=F>|2iE1pDjpVc6{{AZzP ze#Fm+A3`ib>_T8eq@+p;TFk&^QCnQJK{yHw-^z8$^=*}Oji6He>TPll^{7T6#W?w{ zvc=k#VkzZEmF?=yh8~#=eLI|7>57x3b{0Ge%?Qmz%^!{kJyLy|9!+n2iRwc0rGH6> z4Cm2R*%o~+_ttThWXlSdJ|fUeFLbGw`s#-WA}%rvn%9`eK=+J zvK4)mU&ef7Dpp8|=8JNvYbn7r(X`*b5&>lB_wJ90`9;RcZLO9LIPIEa*kx(b;cvC#oMmU{b#`ZQbNKUT<+x~RsH&sW$jkry(M{}t zVk2)j&#AAbkEid7xRscZck+U-Q=)U3Qj2nkk}H2NUn*bSbk9`EbbfPh^FzNi6*ILw zl@&FA!fwJ@0ZBnc0e*pD;c;P_nV-3ynM=J`J;4^e%WoGU;$1+A14-m^^h^u^O*$RP zxAbj+i({Pp!R823xu#vr3K3lvZ<$N4NGW-#@qLZl1vlFQTNm4xL!!fu`BKh*oUu;g z4qFaK(;B0zsr=m;U2Q&SO_l?xr_9AwSyf}zxBALJYGBm5C$Bzl2mRBw=f+7ke*?e1 z8=WWQ%w`;Ke0M+ggnLD|8LgSgb-DL6rDMYLZ4_;+BdHc-ocLD#L)+OpZarsCNWpjD z7UL5U9vL(YO3>ou-n09PD^(!%Sqk@q0Y(!ZSL9Ws2$@0Pxo3o!+#+Rv{*FYD+WuTD z=Wc_)<;FPmxC~S+`OCnptFktQOvDK#!B@R~zeHa}*hBGEa(OKPfesZig=}rlnb!4+-SL2x9 zvXhHcnxx$G71!PBx@sPJ>Q?18wXZp?4OY{?`jZE~2DjaYdy0hxj?5yCpsi(FWmgk4 zvn?5`wQ9KN{&U^L>rcsIQqbnAnf^ZXeaZ-}2k^VA`)SOh=NQvx)fdT;Z>`m1{&erg z$n$Jbf3Jmg4bbJkiE*sto2zQ9-(wnhY&g(S4KEGv5Ih`AdiU+r1EZR#ofF9KchWue z0>W&?e3aIT`xxUBCrpAyf-CsZo9~5w?{~)tLmWXa&_6OD^X}V@?wDJ~K2KoT+ixm% z90RhJ&u4*~4_jjhPFpv*5rF}qNpHCTT~1n&MfPeDf7@Zlz4c0-S~}yA9;2+O7lrHE zab7#8>7Hhv6_I^j-iO#X$3y?V4`Y}&|N$ zl8j|<_$K2h6U%=$nERz!~T(`+ZvwV3vts7;m%p@m#BtT zC0X_olL+$GfH1^&$;IfBgknDp#xu1rrJmb_>_a#?PG2lPC#f>b(`3oM^FI#I+Tq*V z(Ou=E=1n}&#^QI5O4GOU*KaRJ+HW1>$X43JQAmGf8_VVX|6;(G>Kc5@X1J+VGkgjq#62u=XIj`DTQ+^UcA zGfd%&pbP&$GOm?>IZ$*U5X{R zljU_n*-GqorS`E&E2pA; zIDKG`g*_~pyJ_)sd)MhSoWH2ZLE%Jrd9u46m_)r7pNOQdC;UNylxhAJ0>cBsNtq!;~<1bb z*==@Q9;X_(-Tvf18UE_KHPv(9!xd?Z>+mkSZO1=s>lcgUeVucAU=M!k?mQ^|L!nj^;oQIpf@)ca77D{Zj8z}B|`oa5P+5il6*)|lQnXu**zoMXH?FY;8qWP7sOU{`jcnpCzq9knT|oVEX}nO(T{ivgMC508xp2>3J7U0rrp>Ps|JFR&pbHA<8sOf0)j#Dx)92O8f^`T}JCkA&J$ zZeZlz-wHQLr*G5e$T+2iX~hWCIhLWzz5dtEMB!g?{R^i}_z#FaEsU$L7wB#-39O08 zN}l-gIW7~4c&{W8=%FnNIT#L)w3$@gy*xLq3_!3dd^5=_W1tzbVkhH42Q(##*CY;l zeVUYh>l0N~myMmOBL4|J_?hFps!`)-`s7*C8`@rOKwCax@UiiC;5o{OV(~b^8*N7b zvQ^;+)K9^*3Bf3Z=F>IgnQ+9VY^nu`J5`)v@f`B5c{x+Wpro?!>ofK+EI@>)A+E?5 z>`5U{NIO6AX$hw#xw;st3LxSS`n%C5$^dU#NT5fiF3E%lKNMgNX04sbCHwe46rZ1e z_S?9H2#SbYaz29)&r`q_-_2Ck%40ctgenL%ihW4HCBR0ei^cp79Y z^?&=!cw-plgwOnRbi9X)mv_b=>6bq>MyztngAKqoANb7!_*n_lLxsj~v-;^==gSfY zEmxX^%>4ssF>J`kV?ArCHxV?96l8Qq^6^2#SCRxKx3FjZ7}@)bMvyeF zPne3Z0SX&*72#|z}kf{4Cia`Cy)&*OP`{|cjG?gP)l*^3m=?uq0ivb zZu&FYR@>3rw0pS`ogP=pY--`AjEH}HpjN!}R)&^uTiS`C!{Y%+Fd9jjb+nG-*4sBU z{KL){db}_2&dgbg5OGBb+`5eWwt%PosO1KH=GlN@=#jux13`N7@z?uuNBh7UiX%>K zSBPYr_EE{R*Y?iLi|6;i8WP2!Wb<6?cGEt2SaJyjpy_{jsT z;uaR>=ctpgW35A{t<{u!Ju$RJdjXd$WQfs#QY%w+jp5@;;9`wo{`6i`VmW&Sa5|f4 zr9sXb_xczeT_BbZc7@ZYXSo7@w6clciUX84>*M-6mRgCu+l91i!=6+N!%q?fA~=-n z^$Z-tAXz|jt6qV;1e`$ii}+(A5D<@o`Oz}{GztDBEnFPy8h7zV3=E&;UjD(>Cv=ez zCf1TeZ7h3a&h_Du%b1euob-~za?^4BSc#mHRu8wex_zxivmhx!ZRPe+Ns8KvYjZo6 z^uAeN&JFyKPv_%$QB4D*8Yv+jktqJ6HEwVx=?5NFq((8sV|dId%5AWl?$zh|sh=mT zBcCp)I!HM*;h$Q3`cV*Il%LXSOaE3tu@$dU(4^%gskSahS;y~f+8QrKGKUUB;2-cy z^}EJ+hv2FTZm}bg9kqgsEH4c1c<*@Kvrh$OCwxkzwvDADQP*;o^!tR~UpS4lEP0;Z zwh?(bFq%+K-k4MlS!#?3t5k%SfTG78GebW&n5u)0fE`-DBV22T@vVFZn?Zl!ZoD+y=4DB< zrm9E@9r4WBUrY>iacGEm|0O{FiZfYMw%Zm_HyOY%$>~}`>(^!$mAuiRc8;0I=D}tn zm85NSZgz7M-7e6-S;7{TZMIa==#L>#95m69VU8Gd)+TY|vJM7qEPXBFTI~r5(whb+ zM&L@{ixfy6Y4}yf+r8dN^~^$M1W-1g$80V63&pMW z&+wn++NH{A;(d53wQ(1Xm8e9xpO>5=k4h4n||)=S5_c+dY*mc`=av zj}9AGQ53kU`T%tP`6t2kJ(d=Je*c$@b7-%)!ki*3SUw=?j)197uASjnb&)1ifH4=H zS%r2j*|M^|#2zX99%zzJdt4GNqbc+I;zAk`p!@!G?UK%C=W=F{@XHz;$Gv=6ZVF== zP2f>kZ2$8O349fj$x-~H_}Qtpx_)G`agyfUr|~~Nlu4e1Cj_8qKJ7`#O;*`ydRgIk zqg;n=SE5F4IDAtsE(+w*!hku8>7>M4sVOZ~w})JBn{z1u2T?l7V;B8`H zI@~8W4O@UW@08nE*A96}$Pdj4M4&h4G<0W;dnV$YL5OR{)rSDoRf~Ac#U1Og9o`FI zd5DsG)M?Hd-E*{-dFM^g-X+yR;K0n~-=v|duI~XM(s3IRudrq)<*8ASxguA; z?#$vY#%~fvmC%G*4A6vLC8rb@Jd9hp~n(xF9vY)C18pE}hi(?x@DD|iV=3}<0c`Jzi!uvPLI zl<^D3z~tvc?K{@g$$h5jI^X2((v2S&W-qy&!>Lb4%Ui9H7!POHG(v`3zjzcP@2F>6 zL&@W8Q|y7Qj}QF%ATg%cD6b|c^ZC%srau+KfT_(^>vE_tLH09D*Cn&r1nNSQpNi}J z_34f^Rm$oMneVsJRMFy;4?Mhz@N%6nW|~tg8jc!YcQqk1J&@DFd`=ykxIrS9BfR%cLy+=}Dz{-BWu)(0r&PCs4r@_tN~*4% zBM}W6V6cY1UbvvHsTYuve&0?e8Ka{ez|bQ(GeoZ!6hsLx3amCLKD~>Mje8 z&EgNvls%&@{;-KW!h%UO6YfI!)10R82_#!tnqNB+G%^;IPT*C&7v=#j6xxSNZ1& zL#ucd{DuYf&-*Cma0wSAVg0wS*P_~qG3Co)K1z_!Su;yK`Gx04lEPYT=SwjA-byyL z7tp^$_Cm9&2_Y%@Qm$||*0g^QJCk<1XDB+7?<~7WOzp*M4Pf{iD($%9k z8}XT|VChO$8F5?3z2X@2l_~QJF|AajuLfydCA44ESv_@TCV^{IvjB z_XR2MWXv1Cj2Q)BO-O+I`bh5J$eFR~@{5huGprgRG_SR8Q=HH7(gA@y4+ZAg2Pt4CRb^*zl`2;yqppi3%X zJ3a4H=dE7*z7zah-NGhT))lzS$ch237vgu~ox@<5ko!Zkh9F>iNvB5laXasgXk_2O zlWT?BLzUb#Rv76+&umEDOrUZf6Re(4izxrJ_LZP#%O zFyIx(+5z3jNgFas`vKOjj?tuxyfGNJd)m{(qz5V%m5NCfV?4p5)c69k(R&7z#4VwG zkgcqp`=G1j5qyD)yE&YmtL2`l+?L`!v?PbHjzx=|vg!7Et4pZk55to-FX8F2jjuCd ztNWp`N6b`>N@&gLVxsNm3+z7AYj&LO3oo09o1gMf_&$o_e(CD-XKo{T8k@yBDc;!- zM(Fq>*AGQ{-obCRx{ItcU+8(rGR%%(6zs|f!n5iManxT`UWD#zk+=2FgN$?Oh6Fuh zIYk@Unj`$BNWjWy_2l})z=1hljE#v4rh3Y^rC)@%k^^SppTE~EkYNfCS-a5!NO zhFBH$YGf4h%_N&Z*2ZZc#Ud9Ca>Bf#$N@T%ib9=<9xo!`mMZD^Cvnq?U1aNR@LD1h z@}@6S=_cChtt#`lf$>?*+{bGjz7^m8Sm5%fFiZ?MoRG#T!%xC#ShW45ihTXhy*9iT zonJ+ggaKk98{snE;|@9KdrB+V;%DIpE8 zwFUWG$z=sost-ZX-a93Z&1^a0=WcY(QG0$)OZ4@OofaE5L+T)?!6|q71Z`?J))D=G*^v z22ec~=z@R14%2BbwL%tqQOP-j&Qh7|Rb)uj9;03QfQgpqo*u@}82HNXs+Mjr|B-K0 z10UW`V2;Iq##3qhdZ#5nU{aM=>E~1mv%LYXaQE*bYb^7mNp21q2YiRwldfL8NqQ@U zmrrbel~W1OERs&wLV^1{#0Vcn0ZG@FzEbgp?XZCjojS}QYb1ZOQcKoR)i6_4rwWQ) zIEOzeCt{wk$ZXClF`2sTD~M26ELROS=S&`DQ@{mxc{|MhMbH4!l{K{(5VdRNM`0*X ztyxryg4i@uL-9wU&lD0Y{4d4sF*Lr44=2S;wBhIm8o_MK78u@xi-pc&z|QXi*s!rj zh=w<|BlV(y5WG3vD{okD;0NqM=}bD!dH=oa(fF9J;9z8Vy{87yKg0_q*l0uo5D%;v z*gT|tN)@Y9RbJM=$QeI;QImz z1zoDjFc+JnJ-Ggq8&p{z_Uz^?$M!h0ArFh44?5fh|Iq!AF|L&ZSa1GlP3b&k(rO~f z1#b!I@8I-iX_;>>q?9!8T5I_PX<+*@#Nl>wTCK`X_Ab;sd3{^??aub{-Qb_hKc(Sq z7A8p3OY`@jE~DP6Yb7hD7e@Q5(`uLN`G$@_X=u#BqA8&9MYzL?%{A5@2 zikN)$Z8K%g)2O=(mj>A7GALbN{x zqksr7>jn|=nHLTCcNmEG`*24KrU93T=cjsfxG&$vHyqDmil9od)oXH2I1PBz@hJM= zSuBtB5WvCKuhrQwCM&kZz#f~i#_B0$A7ycHKYoN_hnAf>70AtgB)7+3rR7jrzg#hp zWeUJ=^e|p@#}ImQHS$}BRj3O+$KTI>7chyv3$fzxWas|!lt#(Pmliyd zkV_TGtfnzf1D0jS!1TY7_{_#w-GOL9aHnJC+E!6DPyot0)uz?e0{B^@2J{ z7h3-JZ$PGtpvudMT7Ho#U=7UD*lrB0bb{ZrHt!@1bSDP(mFVHV)=?9^L5>(6I@!qd z`P+GYdQ68CJxn5mW(_O=zjFP@9P+((&0IiV z1tWty>;Wk(oS|>+KUgApe=GDZqs4{yB98(t)>%)f2>OKN zWPQpZnlbFJGJYb85QzVqGkEstSb_x$R2PZ=^*JGZ3K85h1no!0##kmpb6uA;4U$Mp zX529{iE|l-)&I%%=jkF{1r43rllj!=I}8?v{{4aomQb2X2I}_4?tWJS25j0^UBZ#k zFL|u;b`Ru#0wbo>i(SYfKh*9#@)ib&zn3idqhOW{zMaqaijfhU?mMQjmtgGNNB3si zd7EMm{Ul13Cfh8?ooK)Ydy%UVjr>Xo^)JiK9+8G@#5Fxt+!ySdcu$yL4P7j?{7U;Z zO%c8N%5y-^%Yr)xqHU*2rj8Eu;#Ff^ky6Jh`96&=1W0C@^nWtZ8n^VNANS9u{jE;z z-T&aKMS&ZN|C* z@nRzc`d}HGr>1b4`bp#Rh|~#cda4*S4CB3FFXkdr+D}&&8SiU^hz-pAYYI#JcDREf z8Su=NtzV7+G%%NS?{p>2ITRg_y&BjNHYym%+&>5IYcZ;>#aja+Vy$|Avz`2ZdI8pF z&eIZ-r~o+}G>^Z$FV1T9&QY+5zc>~l0nYF5_UmQBA$;p>JQNxp_pUBmT^5vg??8gY zv^TXTu0aTTH9YEyTq{S>aA!q=fvN9=_$hY7CW4xI$l`r%o#99hg+(Rdwl@Re80=Z3 zdXE9B)glHK3X~C9pxBva#9;#CEG3imG|RAuJE_&s2(V_wKr+Vha;bbVEJfZD#hX3| zv^4j#7#Kle9C;ga`8_gadk_vCzfdGGPVQ)vzJ*!}RRMr9LU7D{PnR`*-KW^e?f9()C#}*B)*6z& z3G1Ks8pK7ckv$!Y3+nKOy(UShrvS1DwD7HNOn4#H;e~!r)q#&>&Xg*zEeQu~@uBh#+8+ zc{V9m*P_WZ7oARFJb0$jyowvl_SHW7OR@3>k6Pt;QA?-q+>Bxdu_%9+cWC3n;a;vn zw&Scae2OWPnzpd`jx~}^FW{q)38AmpWqmNW%4cv}RyE)DRWBfredLDpt=MI{o<%j^owKVsIm8J zZWKl>j)MMTHM&nRj%^k<1vEI zyTXcPqlrXk7c!=Yy9p6r*Bt3=cGrnuTF>Vh1ZH*erVuaLmrU<@BJTz<)cm`t zE??n3b;oYV#%+99`ZN)enE51r$^Ks(1R&oA7&4uB(zX+6Xgx;PkqOalAf0B{PgBSI zS>#XYzx1&Ydpsm^I#JOeN2}N&(EQ1K)2HV+c0%gE&`>W4z1jH z#(c~Ch{lA|JR20$K3dim@`lQ72OqA~$9y|T+jysCfdYvk=mm8w^GR(vgSYp`^32gn z)Mwdx8-GU=+g^cB8kXyOa}F8Lx?Gch33KvBK`ZVFK(?iE`tEDI?x{?sC0I8nm}8=w zeZqT`dB3Ysa0Hm@@by1?`=(Ja%rkW&L^r2VXukV>!?=WuMBcZ}Am@lvL9xllsa|;D z6Lio?IO)>pz0X83LD3I8BBmvmFOQ-A_n%U>(3m~6(!M=3^N{qgEF_S#i=^JVK63~7Y4JT^4tvsv%Z zeiY8W^L%+TaY%W^d4x-F`072Hrak@;%8uE$zju<--SJ+t!d~fVZfU4ZW+-cAEBogX zk81ujkTq4>N|6)xuWuQ*UlK}Y4P2)kk8Haq`P20*r*(MX4q5d^B^JK(VtblvmX|42 zv*JJAf2E})bm`(iWd}EcbO4l6~xbA0P zBXO*=y)1Er?=ZdBepPEk)y>sc-NS*OV#!pym^-S=-vYd)|CxLh|Hz$v4jV0H2_;*C z=3o*$9pj@{+pyi=FeC)_!_*SA!`(yPEUFwD`w_> z=5-qNNV4iFoL&miMoPX8;RJQ~1n8c6)J0eCq2){U8AAF zONeGhb!285xh)z5xU*i@XNQ~M9g}I>jU~ioPC?~;W_#>D{@fGIi0g9O3N5D(lLvByRj_opE#;Oc_8 z=iHHRS<`f4U%_XeZG5^3{#ceIYP{j*ikhvO`P$;WuO3Jer3Ovkg|KxtkE4A0ef8?x zJYVhCYM9aFeg9AI0@c^<$MNPBYw47S^*}PH93&Kt-7-pDzdKR4e;Bh6Yt60QcyQ$H z$cq|MO>cGyA<9IxnO5638vW$ouJmX-t_2Lp-giRP-}qH8yvz}*kb>D#8`Q7$hg`rs zX+57YAk}5Je};gG{1grS6F8t)n;CnVuXiZJy(@uG6|-r73I>_NC5) zwHv)o&M9xVX4T0dMk%Pe@ZUC~zCjp4;{#gMY;3|D%Cv4Est2X(mhmLOKqtsCZQ4J^ zqb_GMB9KGB1^tYWA>+wsnCkwL?aS*BP#UeqU3Ra#hU3Es_vyJf;O*I-9b|EOyebMg zNBCmZ(X{$OS@vtN+r6+KJlUH#__Y{sCwjHJes~l9{^L6UFb}}yr*7G(aUsnxP33!r zb(S973v1(dm1n&3h_+-#AH=Bb-!rr^2Perp547NOtPEYSP2k7CwK8efk*z@pldxUE zDxE6*Ny@40V7}LUs^9_qI5_v^+5!P-Pg~$`aTKGc!=R9?xNT$3^@1Gw4W0H#BP{PX z3wOCe{I05F!Y40JLfTAt3PKG11@nKO-MqB0-@Vt?RN#Z+$NUSxG(K(XyB8MZdqHAU zA~T%+e2FDwY8}e!T}~OCRe$ z$$SnQpwa&CiWnm-{?1M|FB?ZPrt1JW{R1?KGJcIRrWr7KDmPPS{T6$l;-Fi$4BZ^b zINop%jXvSxbY)cMq)2D~Q*=B_^qQ}UTbUoC#+SVmv~81nx7V+JP3=yYwivtO@*)8~ z9W5d=)nbW9-Gw>CfUwrIUT^w1hn>$e{6<7r$KBMG8?YdWkiSRxY+WpT!l)-=LqT zHVDf1d|4+M=Sj{EcG>v5x0fKeiMPoUW#dM_EbNXLSIza^@Y*8KFzczE$z)$k%AEdg zw~impE%m&w(#-mxCQ3UFB-+LnR=t7rczWFMYi|n>#;KS$7dNov0BcSb{YwaQbx(!0 ztTJKXcCIp+4Ab=VI3RPLgb`t|Osvz?329Ts_PvByp1Fqhs`cKW`PHZO`*19>xdGuTiB4`VU6GAz*F z*?nIHZQFS~#A)``+(Hk%#*4THbnRN4QYKe7ww`7Yr^F!BZSq{n=IgHvvSO#lk(m;0 zI$7O}&ppMv7WxtCt-acU# zGk*y`!oX~N7mdZp%?JpA;k5`&O5uKoSxe zChrj&yd6wGsA;O49!pJ80;|YXc~ZpyGOKNx+c0X@qf0`{_87Yr!y=;q?sdQ}9HOf+ z+hjzzVywa9{Re1{yCrmsQYF+uDV4?ZUWj$&C2S(qATQx=`D=rqk6W1vFLLBf4JDxE z%0`oOlD@A?)%tj&jggGDiZL=UX@rhY_17n&!tSMCUw;4hITQKrkhC7Z(5AWgGMA|k zAr5eLD{E!2IJOKFjkt*yDL}Rxtdr6W=hintG-7+g_&O&wmIgAb52=uF#7N;ewA>H{ z^o3I~zr{Rar>&DP9=4|W!$T3MBkLd@+6KjIA7Xu=yzwVN)mSBgr2&J*ykYW;q4}cV zt!x++SRf-Ce>mim5zG%@#WfsKj{$O}le{Ts_g{rYWw)CKw!{z)<-ri#Uq_b4C8Gcj zTL91h&G91KNUDFBCg$?L#N(Ouckvik_n@-G8cI-^Mt*#ccDLm*kkfh+fb}gID!+DN zIN^*BxBM{_ZTKq~`SUP1^}ChN|7gcI-qAOn8)_yBZ!ERv4mE3CJdsOB>tv9T?cUP5 z6U)u2wMmS&qzkVJRDeU^Nw!HX0lO1ZMV&6_yHgA`_&??NS89rhoA%Ys;{TU=ypqIZ z=Ig!qJpAD<&}&F!4D;buDZcJz7@K&g+OQ<;eD|6D*WuO}syS;wx= zj)&YDL)%`?Q)DKB8TIR$36KaHNky>S>RAn9K7X`^{cugwZVf0Zl#awZAl5MaTl3mMTyDsNlGEd!69JI zm-AlSxyB^Q;ZL&~2nU*_FYxL|yKV-0ZA$rby*vj@+D@tc=97yGeOHO!CFE6DA0J}D zr~9SYr@xXiw8ZsW|Q|5aUVn6of>H7BKI}L`>mU z;heA<^Pjx#HOeH-Ls{@1;ZcCR^|%Omi50}V$qPTwq0th0MMv^dJu@Dc1PoIpbpLOS zk_|3^{a4DyTKv&S%c}(~a`U1FD^pEo5L1T{U4cWTEi&_pT%qBw#LiJ6!VWlkpL&kxlGL ztP1wV@JA(x!ZMJ3HKSSc3~UrEoex+U{2RZ-sbdfBL2zL6+Dtcqdh8M&Mfu$nqreY)OXr*s5{9&ZyD$_z{TF!e7)e{)8`%?)Qd%C(bg@pAg(lb8bb9-u3%}@d= z0xu_P$b>8Egz!$FYm=%RU`W~P*xkv|=0$EQ^pOf|6&qPUBz;3DLK@iSZj{aWsR>$;vo>sy+Ag{zb}l&bKNH$Ciy z(b{d_IGdoJ$4#TtiJkL^oE>vz210VT+R(a0I^d+3jb25M2OQWvZD;r>?76^VTOr9u z+;jV6;Z+|vf`ddZaFj}-#;O#^R(rd09I#4+6BI}4p@6|a5H{sdxKRY^v74&^7 z-bo>m0XJ-lcQ*RL@kuiXwmf6l@{L2gXjb*EJ4~8`B!G?#@go>8`vzxtE)Yu! zuJhjXmYX*fuw8g7?Bc@^JPN_<_6oe&9~Ew6pOyL^8dP5pw_k4EpkLf4uzBen8fZy) zaqCl}k9_ypSVvnHn0(PsyA#+b8Q5(^)Av;f7Y$P;|IESsnz&*y&#>j`MGsj(h%N zj@$=h?NLif-|WRa#Qu@JEXu;6TR~ZwrKG`v)3?!B7V4>rZ!W$A4c$eveCym2_WBRC z9@0@It3dpkM0PEra4=Ui$#Kl~k>H6@SDz8kf7TfR$#-#oQ86z z3h@hGdiYsxjlh1AeP0A4?8(sgjEC8fMGx(Jl%zWcp z$=Ri1J&?*@(Q#d2n|St>7_c1umeK0=zu>PGZfg|Z>poZyrG7nfZezlo`&>U1`{;ge z>+`|a*$P-+=qcjJ@x*Z9E)7g5babyB{k9{>_1?NMzshU7o!K@W&f>1o!;;mYI{&#I zk@QS0>T6BLVHM=m`>J;Q_G1>F{)SMCnf$t&7I4}pjoq@aqS4HaP3y5p?kf{uCY}+; zEE`Y1*YS#G0a`z{;c5kR9n!4gGUqBMczhVJikq6M%@P8eu`x~IKU15cS*1_S)Gh$~ zL~uYzAE0SabAe1#@C9?@l(Uc96_a&b_3W9*O7`9{efnjK4fyXhWOYLwaKu_hchR0G z3!G-0mR?(0C^FQ-sOBJUCj~0f9Wu@^zKEF-vu*-A@02Gv<+L@m_$eAT)f37TJxHRAqV@84bz;Q?(tX2%0(oc){+rI?VNrC(D#7Q=e~c_=Q%8&ZsV6Y9(29mqu! zEZjuW$deoB^U3;YcyBlrrV9`NbZzC0W4g(`!+R+ez(jo7x_X*OU<3YpH4I50ynK|- zUe%=&)>Fki30#(rPM^68_0#Vw_~q3Il}L7G0&bFD;?oxK-lhwJD$P_WLGU`_IVUPZ z1>#`g#?DmK6;bl^kXoIne@*<;W#BDAJce|9cdC40yxP(_?Hr}yRn?yLobNGEv)=?m{?FdhDGBjp++4p5PK+**R-02sqOZYhyS zoL!wE)drMxEo|gzv>63QtjFDKsX~eLk|#nru%MZG$s?h(yo~z)TQBDs)a2IfaYVp^ zh(|aego7d+6f~fe1Pcd+L)Fj%f+B{{BoIQ8mIM<)L8T>hAp)-=5tI@V482S51SFw1 zL4nW{I=pf2%)N7F?uUE7yfe>-J?q))+0V?L*)!|6{`(J&TxC+G4V4*V zg!s^f&0aQ_(pCi%I_y}1Qvyw>XFm7PM_Xs|VRwABH0if|b8ea|`c_m2X}%I0K0%e5 z9c;0Dyzt3d9OTt=&!E+%?&Z^ZwK zX}eT1Z6ll~JNB6WBX6L~g30|33vuS<%7aBF1wJN?hP!oG=_&?m`7%D71V5=dRgO4y zp@ijB?yaLjsT26v7!a{#H%ayhbxMW?)h?+jpdvJ+FCzCN@=UCn1qfV8F*@I;`pR*P z(Iok{C#QQsL5>Ms6?}XtkdZAM?WtK&qc)#>Z;`xwo&7;=-mf(*B(WU9r&uCso4$De z9cc#nlp8AP#vlR%8Ow6+KiLVva?Wid;xZI`2)a4_douGOsJ60(TUVnztPw0ks;|67 zxBom%4w+RuhKk?`V()-bj`3>9e~}t_b*meQvnA$nRMCZb3mo0w zruy5<)*N{klGtw&Gn$|A?@`Jv;l(bNpipBdJ@~+|4|2!-8zF&WakrI{_o^6-_?BcW zy(=E?ie$-Bvq?#Pxxo0ZfQAoJLz2DP&OTtEh9K-*iiQ(beMC*}eGxqoy zJw*;PLaSb1l%d7mec+T?f~a5FeiiN7dmT^<0mKX#A~oW9jXGJXI5;g-wfk-=)dkyZ zIb3uN(DUJoTI3{IWDT5*>{SM|Ku8-tzd=$9IdObSC=(~U;vT3KFBLHrKTU@0SV2DV z{@l+W5Jv*Br{<&;<(?U}`2TEsp#b(Ad}(%;tEv3H1i>g2r5f)k0~#Qt7%7WNjrEj> zi>SeFvMl;)nx9ah z-WDW;hK3;rqf$oQEEnGiL=|59!yQk~fPe=h50(zm2)41vh(wM(lxd&Rs;+Fex;cBX z%X3nAnyOLZS9t;~<2>k=go=Fy$ zLJ~Tk87HfzaVD1aiN^Mrydcu6w|$wUR2#k_y)u-e0CNjW`(nDq_^8VE$uU2;~y{z{8MUMIbv#coC_aWyL6XM&x@4f}kD?d5uw^mgOqZdn(<$dYu;qSbX zbOMOd*3I`aJYkYe**EDy{MlZ)kJ!>aRRKAh0xZ$a0KB2*bO}Ns#^M^XMZkQ(wyfvr z`&C<_sobhHgiqg+(qg&yT7w%)ipPbBb zZqV7B9dci~tsd=v zi}_?|mb}b0=(|!ZC@N8kAW9|LDfMDY&fO4rmMf(a3E-H_*f*&8YKyX)WVOP=K$ z{qD?CwfP_=QfM(obOeO;XI_)F+kCEn_<JYK|ks}TkIe&qZ6)fj%(^(y3=3}JtTadEnq{X^>_*>PW#_gRS5x!fRiU&6v zAWmC>Z}en91GWc$7X^H%ZYM~jk{acV3q_(6Ki2sJ2R03|c$=U^+UDJYRVs+omMDgs z`ZH{K)UXI2V{_Y=vzcz<$1qa+j^Kf4L!+i)wZu6xMT^l?w(}%`a|>;dRj#BEeBG=Z z>tB2RMUA@h2t@83a->ra^}B*(SGFHG>;?GbkZ3Z*@{~-bNr}>n8reDhgSD<=**x11 z=T2o}LJ~;)b{0ZM=FhzyH6L~h`gqqbab zbFxn%``}P;19DC!9VTu?I9_YONi9>VldvWz7|7ku#6U*G;ZKyTiMp>X2%nEsl2H+q zYmJjt0(OplgEG1WIixzI1?NX91!HB2?0Yb{%1dsaDdK+5{SEMCCjJo=9LCxf%E4G& z1kDjXH&u{P$7%lM1F|jm<<;hn^y~2^2(sRC!38Gy)3Q<=Uk-7g4+5um*1H(fv#oJ7 zOtY|bnUbxc?;zn-f2OV|e@4p7;DQuVDDt2ilVPi^90@Fa>xw!~-6{wGZV~zDyfF=U zXF=!TtHPWiZ+&s1r#|99B`Gh3=NJ$fV`6@S6m;l#RZS|fPXYK4rw-P(rjz-vE~aS; zUM4~)nELw&gZ3jP|93BtuK~y`m_b8s7kv3^;d|p(`7XJn+YW`rS20OX3o%=Tzr?_c zi@}rhotjjRGV*_5F2*p<6S&mA{s8sS!?11s%sjg)t0w6wOXX27cwlicP}Fva=4hKW{BZ-;g2{=Q=RB1Ea^dn1x0sXS(UiUxi=L8{f1X0Z|K6#`H#s=nnf1 zy|+PfcB+oFu@hXOh46&)^kkb3uVC+kmo_FK4m<4}d_Gzp6ag72I9aKK3I0jwaL^Qe zynx@+a$O5u`Ws0Faq=q*SGM;CbkJFi0e&*<3u6Doxizg*Kxbh(w{F~#ei%((`93m4 zDn0_cNc#nJAGCUUASo#=&;n%=wC;3gU?J}bOZ>PdY=w1uLQ@r-nd2&xKMel z=9~Q;R+&Tydprg2ap4tf70vfgo@?py50?9t9{We6=QiV>I|Fuy28pq$Qv3Nd0=~2B zv#uua-*RA+W_l9r4=SW?T_T%Y96!}o9*@D$&Klw{;?(GD9A+80b}w%9+rrz9e-d4D zh*$0Zt_6-@-dl4LyU;$C^gw&4T8yflK+h@0Z}miX0IcZ{kN%$mQ});*cy18_xBXu< z_dGqgDke}%%D>)s!j)1sI!EeVnW?VmMR1~&?Zzr*--KXW0u)LYQx}b zB3|zR;h>Xcm-4EBuympBbP%>hr#n4M<|-Dy)uQvx&NBpjYP7MItFw}0{<@J_<@`fb zfim*d^wcvG=?$Wo2s1Q1vnl02Cjp>wy=`|c6khH@LyGFsGx8dcJ*M%Z+#}CNxzFvf z0PLST2~4E0!;W>cM4Ax`r+LP9is*R@wv4`xOwK5Q+24Qa)xXQu?+QkrsQ~?WI&Y}A zF(z1Dx!<{)NM!F9pBPK~u#`CvzQE)0Wmv zg}iR!4k5?>kPZF;j6NvVlpWrC+%!V$*k8WU3ES1!%m+{fE5}=2ULBgTd2|bdT^iS$ zUD6E8)^-G-nrSUY$+5j}?oQW4U^Gf9&d*vR5o58Ne zJyDM;ZhQWwqk3<^i@T57aP=BpO!JZT-B?ZQd3l7;q;rggVn<=QgG-@JUbuA*WM_30 zaIn1S(3Wu%_k^+*iDzN`X0}K^Ph8ep-4MITQ;kFQd-m8C5!vds&H0(R?<0w@@T&2# zpxsWlCl%dT=P1zE2}pdN=HerKLki$P!^CSAws-`#9@-JO-3BY)7@3&dE!Vqo1vKVU z$Ddp5p*6#z>d#s4E7L!y2psaqs}`56ao0=#q(-F zP*eWy{e{c&gM6u(_;vqPXq+oF{y+OLF4Ok#o1OFRf~PBocz#%X#`>mz=j%Fz{u?=% B+${hA literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/processConfig.h new file mode 100644 index 0000000000..2e039b079e --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gdx_ttxwpux/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_GDX_TTXWPUX_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_GDX_TTXWPUX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 12; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_GDX_TTXWPUX_H \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/card.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/card.png new file mode 100644 index 0000000000000000000000000000000000000000..a817132c14861b9bc4da104cf91ced73a21250bd GIT binary patch literal 5708 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix11.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2d0ec070e3fe9d076ec88b356cf7d6cdf35a0a GIT binary patch literal 20341 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%0A*1p&2+Z6oE9o%#8c#;j`W+5=s2ZM8-YgCMpgFcI zfmipnOqHx+vaO}K7HMW~N)!DcAX4uy2eXCly*hbK!41mHGrH(ZxC`Ct- zLL4UAIe2!B2-}<{tOmx531OiM-VZ&+nIFBxlMjM@@l=_!*to3mS1Pbcb7+Z)>oE-& zyF;%+;Khv-LU?B06#k+d)`WasvhlD@BK%L&OgU@si0Xrc*n76fAJ807#96-<41tV; z@J)d2j>nZ86LJI*uo4qzY)J2lPo!en|E9_bv(nH#tA zDO#5bxJpFR2T#mZT?MgYv4Q}`di1Ij#SYLI6a`1v3w3ORPtlkb3qvnAycG=$M@OS$ z1ThImXJ^jl;O!g>{{lYZ8I7b4T8Zqh{AyK@!F}yzE`FGlShmc7 zWzrsWYLg!;kto$TgZ%U!TfN1@l<&+HI*2`G*yRIFCZzA8xn|XSmp9_lVM9H&l-_UO zS1i3_a0KY>qY=l<5S9b!2KaZmdhev|M%fu?Sf8ODGZg@}dQDX(_|Ypj82&-h!k6}$ z`7IQBB&N=2`{q2uHWuLE^`+BKt16vX+wz;hdR77tagztT_5EkYnz&+H4x(FM(4K0r z8YRq1R#@rF$hQ09n03+kQ>jS6fXJq)!Su$q^``6kcF!>*;4$x&+{gL%*8D z_1`W<-#!CA&i;n4p!JG5|AP0=3Gh7?zX$pq*Y>ySRew|)BJ^QdKvUra-=ut9KSqTr zuIX`tRo!1C6}QGJ()o(&VF%GpKzF_ZL{7Q%zTo>ez%HCl4hG!6mT8V$=1&}j;}r;E zzNCzvbuwK3NV39%G$|)LAxQ4!qf(!p3hKuFhw=Tx^=zVI!D^wJ6=@awt#LaiIT}SL zEjSf|&+oHQ=%y^Khz;I$#k18g_n&qo?dOq6&yAOoEzm2~*z>s-{4U+cUuEBF3DIn; z;)RK1=p{s5FB(nHFn`8)@+jlq*m#tDM@mc|3mr6k!Ue;f%S^*Dp_nM8Y6|2 zX7hvpl0Ka<-EiA@+@As%1&oSNu9{tHuLEP-42ZQ3bjY_;xk4}oBw1z*)niM#)a*{x z#;?6w?X9KLWE%z$fax{aY^FFNo~tt2Y1Zx9B&UU0BIS{6x}RUxE<%s_eKH@IbHi~# zcaQJ92sr%3S3{pC&*I2W3q0Gt+zfNN+b23c^GW zatA4`fn85{4>UV$S{bkT>U6F!D2Br`ddZsiEr6B0<>jdysF}DGhMco*2p)0AI}PzJ+%z3osjKS3ja(~l65ixxZS!TgQ)a^7{oL_ z2F6^OO$~3g4c6M2mqye)RDN`MqD3syDD6DT*R%=lVlMd`*+;1=>Dyxo6h)e>HPw;cTaS9KcOmw6(VfRVvlR zR!X<1S~6X!v6Rp-RjO*xR%7WjgH{9)qJ-FMYpABu5G1v45vqcy z_v0DgmO&rbUnGfgeR zPB{@G7SP7zAo&NmAlXr|eX?(^ZwP)oCYQkxs}b)=(s zw=&)R^jix*=2gWViHDdy-5cB>IU!`W4D^t6Q&u# zF=!AQlj+hzo0jo!h(8SW-7vtq^8akgc|h~K3euh8Tu&5~#J4N`LVSIG$seK7JE=R* zY^@z5X<+~ONK0IKwRp~Z!|XWJBx$v);7P$$Z$(VjQ=0w$s@^i5MZ7FQK({{*Z2$?+ z^N#U)M$>(J{7ot96IWKfn*N$;g)Zu@RPq(0bYNtbtuA44Z>EQOK&d*L={bbRVVy$Sx_ zZ=0cbWNS6&*qKxu!{%tl?(&ybwya5yX1J6J-rFzLaLjESmzq7{WTuKej7N^Ttn?~d zsyM(M-&r42Vuioi+38(hWy!&SMH}9 zGF3mD>UySuLxE=CW=3{!^cXq*wc^rxanWfv2Xbq%UE+YdZz(l68i(*M&31PR^9rm) z%xvkMumH?#<8Ith{j{i4MDum@A)2>5t5H-D3z5sEU3Z!)HFIe+_?5Tl-0!H=H>!ZN z(--S&V{XH5+1&|^Fl3mlm&~38mc*PU7E3rK@cl?LNh?#u>zZ5U&f7LK(X{B7V zahmdF;JnR1op3G6;a?g_-u+25N84LvC;Bcd5oOquy0jO`&iWxoWh0?MMuT2}UvBZJo>pdANXSN0~*;M%=qa79w0YQixS0yY$K zK$kcxlR)z)kJvZ)M?g{MU4Tjid4G;RIA`H0f@=`k_xu$>8Lf>tRdOguVvkGz#SikU zD*{tjP5pL1Y}Jc>>JAETaKWG~%4g0UTQ<5CdUk)F&9##C36*r%Kx2je2vpZk3J!V8 z9q`5Y6fo24Bz`y8(YTDtZae%u2oRMmwRfv}DM<09TlijnWl}u5T*XJUl;WMuO^1M@ zvSme(>4-I-poo+Otwg#GPP%1Je83+r@Rm5|A_`~p+7Uh0a2oGb!G%;`UY1*nN_Y4$ z$N5CIKIPZCM!|(tCkxKgQ%X>4oa~Q?&a)|m1m7d^9D1+7}g{;Ng# zO;b|tooVB4Hn}S3V;)Wiuj>`km-1Q8%IIk&&{9*wd`%7^ z`99B*u_0oqIDwPBOF$A)CVHqPe=EXARXL8a{~qDHpOM72>Ftd<(x77c3;4_99hSE#5T z^){)kXdnkqbY3v%okYoDIETo4gUP~FOckMOgyK0UF~4Pb?)i1B8|KIw=A(SXFpCEP zVQqGL$fbj^93aXP2E`VduHN+gog|qa7JFYPHKF_;pa;HgITRNl-)aQe z&-Tn^pWT)6JW;o29UlOB*qi~u-Vgq*dGUeKwcD&80P0K=oq2=zJ?}0v|gBrj$ zqVY>YZgY=h6I(PSXH z2qlOJ@QL&a%ngOD3x!|m0!0+|V9Z7|6}_3kLk;D7L`MApZdVUmiw|i* zZ`@+f-WGD`b|z&}fiQ{~ndhoyH@q$sF$DFJ4M@ZeKtQ+Sf_Ft8TE8rt2>JA+fH_rV zdA7NEBpfy;iXpMxHlsTDyp+lYQ5nbWb+D) zbVpNSA=C}$j8_)||3SQjJqlZEZ2(hI-b`!`o{Dj)y= literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix12.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..46c92e628da7d3d023e99afd0f61f10537167071 GIT binary patch literal 20216 zcmdSAWl&r}*DeY{gCw|z;1FDg;2{JH0fNgQ!EFYDI|L2xK1guafq~%e5`2cigA*XQ z!zJH)Po27T?~kwQ)U7(_$Lzi4>0aHtd#^py{j6t)e^!yl$DzVOK|#S+RQRBdf`Sf5 zLBU)=eF9LVGA>V1P_VCTWMn>@TUeU7f?SNPoJ>5qZOqJ2P!z(ml05}y?r8@)I#wJm z`uGL<$8`r1ghuE_D3H2!)uq;dfKi4Y71@&#%sJw*Wg*Pq1a(3+YkxV~T=7C#_GI}b z@A0{Z>i}NBmr+)Xx_nD_6NB-?7s~lbYHP|S%j*33sFJT=y{wQd7)LpH;9xw<* z;EF3p4)sjn$nO4O%t88lFw02_)Xo!dx_+&Q@=klCDkX#DahfqD3r2sFYV~kt>}+ z?g$M<{$~47H3@!KFj(_TFm$`WreNla9~Xo$t6S?& zO>BUoRJY|r<(c>%_Hld-CCILHieI<-xnfLWJwms0{w7?%dE}j`wnst5Mx%;DcY61{ z1eNQ@%cua#nrE<1!lq|Dt1stJX~R%zzr9qKW`ScmNlU`9UIaRQ#;}z}v&OWN7HdMU z3V{50xroNN`kdgK;$N!K0M##qfpnZ7LQCS9m|m8?%ZQWg4dkQ)4pN?cyUV3xqlpMg z$o*t3mh_TTdh@f;3`$l2_q+KY$X^6!*i_#we_a03p$Jgq#ZL**GI^DT0X1QT;~L?9 z?|J?eGZXD7L}`ucifIwkIOukjP#2{mber%S0ikH#H*0#%;GiZ3R0WD|c^I9i!gKW? zLB=cv9;erYbkIR^5=>cHzR&t>0!e7Y)O|9{KVUy_K5v!~mjEdWagP#M zJ`;%TGi9#L&~>ih08l`J$NExCR86Z*zt<+hC*Crs&=$u+doWhlzapB53>Xh_>?wpp zfW48cT7Qc?bbPQSUm1s0_qnfQ9VcGN2C_X3oz;Ud4;zVH7;M>%->uP&#SmYjAV}X# z%oq*~FYKM}1@=0wlM{s$NUz5|QyeO2EAUb$-zD5dOaG+J42(w`RNQFWz&vq1aXzu4 zFN=c_=&*fYQ!061qHL|Z6U}R+E1SmEs`6H*>BCj#-yeS~u#G-w1v3(H*2xyU-v}H` z8*F9M(o~(%64b7LSFd&k+Y!W2QY(b3zh@IkGE3S|dd~h{E6=G!e9z66>m1WHAvBlI z#z3EhE5|JY@D4(pA4VB=9ab2w6=q0A{EM)eJxeJzmwaksN`BY4&!P{pp1a=C2kHCX zN6u8hT*367`GiTINsg)gBR>b>v#oN$LJBHhenVeaN(_PkHE}Pwf{`DJUPJgWj zQkkeO%U<4(loC-Q7?c=TA?6{rA*dm;vPF4~rZCgUbphr;BBeKN^4u=XfiQ@rYL zOwPTjYC?16g5^T`f3Q^86i}9W>N;Cvc!dl_G?5B%^w%rsgDOcXSt=dD%`m7N%&p~u z`jtf%O4hw-o2ZlvzN?vwoomjH+8NDx-MQ%b^1j{9=^4k_>k6jodSH4(o!O=snsU(R zAV$oW_@$xTpOMS~p%V^8#^0e~zIY=bGny_OdG^Ect)&@(O=-;c^BqEFkv_=K3mH zT8%t>|K2!D@6fIM=>Or+Rn;ZbbxPet%`QB8{I*r5b)H_EzK>oYcPm#mSHon>MAl?_ zZEFpy+lqmc@gsvJqe%Q_{81iFURfSlo?-reeyXXDnZBuGt#mE9A7zKPHFIX1ZSrg!ZSHre zc3Y;4`Ty|8IJ^h1gZIWY2NzRB+SA*9dg0bv^rRee7FJ|d3{_qLRY8oP$YnQSpl}P@ z?Qgf0gDjCc5uh`R8~n(6m~?n^JLW(Tsn>wpz~MCCd6?WX;`TU*JJga`4KYr5to)|) z)hc#5drCsdyXWEs2^A?V;yZ%8(ZQu-^MP14PnJ@a7|Y;AJ*hy%X@nH5f&X8(aB0O^ z`tIBfnLzdJsTlsvI$w*GVa8#3_6iPtb_;fQ9d4QzBH}*1dkW6UAT7Vy`TThK*V;&( z#@Uj&B$^%?C6SA|xnkJm+kFq2EKNhdrOTTpude5@#1i=Z`1sNM(ILuTHJqkLhdL84 zRS=nb)^oO1_PLE4Ihe(XsvV-lE|zB%(}+Xo3g@wHt#KWgI`DMi2kZ>?^CHYm`n&(Y zFN^`)r7X*=O7aGtIb-!EO-H>yPHUvy$(bBVIs#SW?tSiKMz|e-$+q^}A=i%mmtKqB znD%d%np~$3x6X~+j%I;djoeFsHs7@u`zqc!YR1406aRg~o|Z~9IW%xkf6%MTPlv8A zDyf?JK_Wf}?PK?lmrXBke(X#qm7f-m`5@whX+9CC>r*M)+l1e%jC* za!%hC@-KOuWZ)$-plzf)@?X1NA3}FnKhFvG_k)ajD*Ea1GfU0#R!aHW^xJPOmkU+1 z7!Pz9Wscn|omCGD+d7PQG!RUY@_kmvozG8IyV>xwUbmKZ0&- z6C3Lqdv)CSW$Ayq553pEF}(NQep&olHPtjVEmRr*~6S-B5=~6fx zd-3cwXC>KZJ9$R+xepmZbX;yPj?Fi!dT1|N|5^l~+uI6$rv56A-}~K=J_eF;Qbbns zyU5^OuM>1=lQHsfC1>R}eyL2aqqbL{}_0T3i)MaP;!C-`0IAo^unSaemC;yp5&V@1PfxFfbt0R zkcqq8RiE7rB|5_F+~5xbhQllv@kwx zMm&}5FL2Lhu`0s~n@{d+JdGg(K!t&E&$v)&dfeTcsMZnADZ@ZJ{6-M=ZVT(N+nm

dQ&>u2y1@8gv{9+S*W3ZW+b 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/processConfig.h new file mode 100644 index 0000000000..8aa1915d04 --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gu_ttxwpd/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_GU_TTXWPD_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_GU_TTXWPD_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 12; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_GU_TTXWPD_H \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix11.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..3edb56cf43325ef1d79794d881c584398ec68834 GIT binary patch literal 19688 zcmdSAbx>Tv*Y}A82_%6K2yOv_I}8b~!6mr6Gq^)=2yVgM-5D4hg6lw#ff+PFa0~9R zliySCzWY|~Ry|d3ZPo4{bEnVguD-W>Zr^jyr@s@aq9pwqiv$Y^3F)=0jHD_O(hC?8 z68a)C!hs}`d3}zAgn45lA)#V!VQJzHbThJYG4W=zF*8F#l8MYo@#dL(q!{k$S#!J^ zKu@eF;PhpUbu+9 zEJtR|$B79du15j?eA|k`{u^f=nIZzIArMDZ>>~`_MNAlm@g~?s1^@0YlNvVTb?f|QNl22-&}elJg;rNyZb%}fv;2xg(u8zDXmd?=t|Ad3q5 zQJ`Qgkc>khwxz;5hm;e(np}6Y_L4kO@5u+Ymdv z|D_XpHtI>3{5r`E?J~Mi$o=oP+DJX$cisl#zU40rw5DbW4Qc&=EJM^M4W{yzd8r!0 zLz5%J?n3#N3N%89k1i#}siMokos2q0Iw(Px56;I@*(!fm4p7J07q%ti4ZjQeSY+`l z(^`#(@F@I^bXlS6G~F)08}l8y&kLc*r_f&GU80XeM4N%9!;&Td6D*E!PS$j`30zAQ z?)X7dx`s?`*J@?}QC28qFx5oaw9YiVAqh71>4OqQSv;s8?e~TgycJKM<`~O?h%ZcU zAo{n)-%>BFZ}YXUv5zX@-rGIY3(9hh@T+ghi zD-*!DS`3m5^5x>?iq_h@u^filQt7OnN}nWJC2z9-=Krn6G?df`rNLuqlqweg6FibW z(#fEqt~{r~quC_d^z{O~%Y!EWwFIUr&hR&P;E|PRg$L(bvF3Gmg!Qj*w1^#Z$`ROD>ZmH6^1FOMu1` zfkaHN4UV)2DiI#;}O2vLvyIQk>dnRM=A1>~6#fdUob6)x87tJKi82d!-sXk42 zCYQb>_1_D=gnkJd%KunxQ%qdpt?g=!<`Xs=)k?t2Jk%tk3#`Gf`B>v@-wpOY`o;ZTs^ScJ-=YSpsc2?YtqYTZZz8xKvfJ; z386v9d0p|H?YqG1j@Lb;#H6ROnX#5JDX}3j%(27TJgKBrf$rlk>`m=|Sh$S-iLOYr z`LU-n+hVC}Ic*thIa`%pC9Van&E(MH!2#3(2(>v_f?48pFM}PrH?On03#%*FtIC_+*Yh6p{>2^7 z4a?2q&HG!d2e${n{pGFvt@NGe3uDx8DElbe3$WVHt(IKBI5_y6+*n=h7Z;ZfisuKb zJ30-${Qlm#itSRZLVlIC;bR^mw^Sz%@2`$B`FgQ7IkZ)Uot&JAJ>gc}Ub)6PPqTYyq~ zvZ#fasaQhV^p9i;>6-$l2Y3Yo&5`7?O#QgTvbJL-9Jt~P}>&Nh#G zBzqmRWn70`agO5l8}|E?>LbgkpSv@<+I+B^Ec#QASxTz2t4C|D^pt@#!01&EK0Uq; zhWkyAwWFNRji2>gKYGAUtj7q(wszuB-LdZ{dlek z)N-ds6Y*H)vS#o8Fnm^4#0vo4bblcyFN*_+RT-v;(&TvLD={?LV@L}^OR zC9M`{`Ft{2KbidJtH${<@b#wyFNqv=1OJulyH=mxm+|j}UJt!~9m^FPrs$;RGCMK) zGwE6hp1p59Z(Hk7(DEk_y(~$&hyR_Mm0hQ6ZEBIGs|mn*G_s4dO{4bdjQj2-S?yJJqI{G z%f9FipH^DkXOFip4LwevdfP2*D}XM)^*0AfzIk7b^mU8UHHQCtjEgo9vz7EALN_4BOKk!;JBSc|gA?|IBNJ zKRTnX89TfI<c;qN9VdI5eU?Oa`1o$)o*nl5dND?EE-7CNdrWmeM4s{QZJeo3 zK!0}L8EG5&^xXO9=qfyZf7HA)c=X-DDWgKqYPM=<4Qb=3?XIM)jGEmxqnxeDQz? z35g0xR#HseEBh!1;z+jVw^LO{Z%fi|F+M`g8n{hU6Z8k~C%&80)Eh{qBnC~m!X*0p z`X)&(OqYlz{ses+^^%;(Kd98K9N}JEuY8|FjMpVlU__~3P&orXe@M{R9I5W$JyNWD z>!|I5s(IO{-h4T8`PBKauO;O!;NKlWp`j&oIT!v|vs04mV~FqRUot@wNHh99$-G~- zah(?K^aJ=w7LZL#s`TSE{r_*=JdQx=VcSk2PoRk7@Y4Cv)$iw+jib+Iu8Yb>14i55 zA>KUoJ<~4nxpA8Y=lxeAZ(2?qTcsbpA6CHE4rFmFMUS65*Ru5{x7P>Ed~r`QX#lS0 z_3I6ZUJGOmekAoPGaCl31K^h1wzTV2IS&ZVl5gJfCqd_UaMHi-wvS`)`IhN5xmS5b zfQm&ObD3%YNC&*JV>{Aba0=LUSnF*Hnmep*Gbxh!|JWQ?CLYO<6=&O;+eL*WtN8&Z z!Jia9BYuC|&b5!1QUp&U;O{~m>AID;W>`r zG08DuDJ}VddZT42GuJV#PwwLI&kW~${#~unQDR+q$^c%HJHziJg9dZ6@>ye_3Suhk z1`X7~Go@VqyIiGr=i6J7Wehe<hP7>S3kZ^u`x5jm`KcOXM7S)|CmY4=bNUT&!&qYqBhS^L)4t zq;YC@fRu;PaIc}T;UVSjl%;1+Vu1Ll*Jogm^5m78;>3{RTu{X(y~yOzQ`P1iVVOZ3 zD+d(*^foXy%K=4gIB$n}H{epq<%j#hgqC~*n%0XI$A=~&GS*ec=LAbV-`GF#=kRZ3 zqQKy9i+s%^SMh7He0do;El?L=cLfzdOmjC&*IYmb_R4i#P8RT-IqA-s#o&7xACDcs zNrPv`=z>NBLxg}zx)xuD zTpBs@3C6;pV-R{^){Nzu2$@?9@4T2W=}&eQv<#hlUUaNF-W=ber~rHwACr=~)b4`6 zi+o;bo}qk6HRZv$-3oV7bET`ra}4jC14ynE$qX*t6>_9x(oX4(MX^oQRo`&Lg0FEsnO?nwcQx|V)PfVcQvVe zFqxms?UHRhZ^*)znnBGS#cpGny>u=-1TNjXI6N;#_a@LYm6()k-wQ!K1^hyuA8qyG3a z+wEP%1hqL?1rx&d* za7u3B`BZjF%wdQ9q78jeB($WvVr*sG)yoSrtH|2i8YA!O0@d1qHG%Ig zxRBwrZ2dV})b(hA|0tv#u24etDyzzsM5G?*kytY)_2ISpB|dE8GBx*(=woG(^Qc3d z3fLmvrj0lNcjdL95Hlg!5ZKA0t#n_N*g04C#-dbas0Hsrfvp$}igM%1R+3ib3bkzkiP{CA2 zda}X}>H;R6Q9fb79xI!p@YyNu=S?-V(#a>!Sq1?KHKRB8f1|s&z`y3wMApKM4xtTb zrQHvaSUs>RGi-&Nse4u)cSHC$wVf0Q-+v17m%;%lKnrHMx*s(_sXdKG@6yzL;%7O; zu#>Cmk|AH^Ui0{t0O_)l3|aNslJ9Kc)vAn_(8h*)|6doj@N6hoX}2!Gvn!^eEdAs&01K@BOLYYwOP7~e~y z?s4DLoJ6r(CR$g$2mexcW+HnN$)O;3S&vrga^H_m66cdJE>#)M%5g~z*A3{cyhZH z=O?^k5kOCJ+@F+X9LQaQx@yw~!pK+qIMmIS$u5GC*; zb?Vl*2!|#E2av=+J@u`A+A1y`8=zP41|tI-0FufncV&aQ%@iHwVgT4vuB`8Of?|1L zb^suJTX3GaETjH2X$DN^6}Jh98)7nX>dS57n_*(sEtM@q>MOH-2!}~Q|q7>qO5J){uBHKxrVj)RH1L{H(8uKHggv*SV0#K{pok{AS9djr-7CcsXM&2w2qH z>{XaCAvm`M`<^46^B45izZEnmK3*Nv=4HWut?fgxKL$*!XzC%<&;9t0^bs}p=&Ua- zXM#SrtO_ryi$W1IB{RI8MQ^<0c{a~dP+5x(Z2qBUPH?USeq4Nx%bphkO}8&I zy&Tmysjc7#_cvd45NYh2k~rD?QmT2s@({Vyy|4WKyHyd`IjoeT4nIEG1XbB<7%zpD z=kg{#T3Qb3i}6HOe*cNh=mOmPb1tA{VoyElHGl61c{lLSxytJ-(#f`HwnidgPz7S; zeY`M_oL)W1(#>Jb#w6&%BMpJ@HNOFapXfXtfVD9Dn>mS+JZ0*4CyfK&uEpZ(cu39r zOjEUiF;S|wJ3c=pr&t=+n!kFcS%Hq|q&UO?@`s+ua}9qZu5j6tmTaOhR8~~n-S~{rT zy!bEkU!7iy4DI@j&)Qt$d3dMR?Bhq0=%cLti$X^#K-EXUzZ&%pLcfrPE*+dD34}Q{ zC(C|^V#?j4fs^I+?J=;GzH1jdMp3Yvg4RHrvtHv`iVS@Kox}(y!RuRBN8bJODF}2X*uMUT(a0yj6sftFD z(Q$Vcy$66y%s)WK#1%{G7;I2&O}H~1_-Cw0xM{WG#H*XC`kr3m0=m|98MQolUZfvf ze{<+yLKQ{XXII_%xFGmlwoKl4A2&EG#A z7AID*E9csF{-pwxK&O|JtM0SP6U|Z^w{WtfUVC|;6^#MoX7uN05-Wolh`CZGIU*cv ze-?jtvtl8FLA!ncO)ykIocfprrRcD} zZWA)FlcuPiPHv-A;&G}u>AUA=REt)kMn!|>FglTN)`$M;u)*jr_@5#!Ok~0Jvsnee z<-Dt3SO)Huf4X{Kxgf&GW%P8NBjenyDH{J3e4^C18#R*YKV@isvZFCdPA_HwFX5e%!q$Svf8P5cuP_kNjNmTYqde7@|U{` z!xP6%gXn)x_=>um=)$*!Sq}EgcQoSJcG&;0U>a;S#CGman+6?u>u5<=mbit7VK;}> zo*lP06j%3r!KH#HaTG0Y;C!E|zR+0Sd+GfM zcuY&(YFQczqZZ?oLuXSyFz1$OQ+uPbB%c?2rgIU8a52zHEw&61)bwd#k_75D=us@X5kZ9Xr&g{8ZSmGy6j>uoLGx@ z8=&kzW@y2J7ImU%E%1KI+7N1bYf@Yp0a2X?xQX%9P6sw#K0JFvX*jd&oQ4*bdY>Vn zajh_*66(IqPsC&iYtKq1`Y`6{u)P5KU+xBf!p;^QN5eZb(%G7POB$_{iw?@s8FQ7p zjQFVHO(NK`^dymm9+h13yUj0Ozb87^AZ@*(*{PJ-0slAC-#HF8ir?GAE;>NOjc}~P zqrs2|0s4b|aL7>+l!=dR1)PvHWywRCC-n?`1@OPb{FtZcD0uvP*mwqxxGT{8$NE)- z_0&FVf7~T1NAzJ`aJCHf_&Yy9b%U^FJDkzrVwVv{XzS5qskVGW<8M|o=OC81M?)#$ zZn@>vQ~{TAkd=0E3G0^izt<^<;|Jzq{nL0uL-gP%fhYD(XBHq}j*Rz<-*SU27* zj%ikrWqE4Sc9=A~K`zUaYf1|~zzSpMd^*e@ueL|XDcdll7e`_4RKUl*o~fi`+Ie%q zRjm~vh)&Pmm9K*dfiQ<&rJwprN7v^oc-)u8(HFm5IR*hr?=7=n6naxuv#T!m(u28g zK7je=M~uGRJgpfidGA|?JB-Ye-UD%!YffGruB{l{`f(|35DT2-z5s&n8>Tep)qFQ0 z7=&v*H#homM}v_)>EEZW@CE>ao~>Q3$4~oTZN&uQAuA`o(`dlqE%;DcF7U*j(vKOk z?E`$*!|NGPz1$=QEQ-HEFtI!!WmzhQ_d1BYt@M88(H|tj1i3ns^yAu7WB}gXB`bzk z@Ay5;!3Ev?06#1QfC_N`MTRMGH_x8XL?c@6{{EaARaTq#E{i>78J_#^J;KvBK*yT?;p5fWpP3}tC;wTGN4L8^ zGg7hHz0=t)$ZvmnG+k+xItN96^r{C7qwo1>Rm4)l3q#Y_{X-Yqr z&A(y8sU$Bxadth}w@uGx>rpHz*(e{am)tL0*IL1^=6FF{ae3B77;-Hy<;!+F91mko z94YC!i#o2(M`fSvBudRJ)iL^ zs|aSl5^aCDzw*5xgxa)T+1aC5MA&mOBy_f$hXT&)5Sh zGLTOj14)#TQ@~Qw*p>PE=_Oiat@%ZjK7C%v|Lfqjj09e(bf~Qo3)J=d8ukNdkv#E5 zgEFf>i=#92$5sIYkcmx+o)50)Y>liS2q693ujS7ow#VyIy3wGs!I-?)2r|M^*XQYp zm||{JbgF_8z~Zi)r_*T{3+rDlpqepE&G$xZx=9M&&Sal3@ z=4E1|U?a7?6j5#ye9@K993M-yIWdZdQNTnDmmgi@F)#j{qW=@{o}CpICiKY!B#TI6 zlLcQ8m^E;$*RkW;unXKVbE`zDvKfCAgAkV1irC`1Y&d+k&o=L5%ch-tZ64t(^`JOrIHIbV_Y9EjZn~J@Z{Y!S zT&P7hm(N_G%s1Za^ldLY__MpBG_O|usvStWZ2z*9V>lMYseWM!oG7Zxgyw2RQhY{N}=q=j0K{kPi6Y<;EHj)_{|w#<8J?0^D&n@ z(5ne`dQ;MDUScsktsMLP#sSWyL}!DwF~ihJbZ+P^=+VY$`y{({A9$Wd=RiUjv)u0P z21u`%%<~8t`EJx0GF;0Qt{5&29m0qebD-b6#kbt23l+5~yZO#44pVhPiLdZ9a>nqh#70nPxgKNewuBL5(eRh!fd6jdLq$S!!88Ohe1cMe;cT&b# zX3x%KO%M=#0_I1}AT6eMNxJ@HaexfQ^molGxFYng!+-7M`toSiYz^Vv6aIdL2NDFt zQoF@Qzon}Y<|dqa=Mgk)hMGQBLt(*FTCCBpUia|6;-#1mgx@(TLed<~4LAO_c& z8Rh!c>Sl7_2C|yjX4a@*GSF*V=zNNFCssY3b-tI@0eOmVId`2 zFaV6MSyiA$=dr=skif|mr`3a3b_o+njIg$ZP9aX- z$yA`iCBs|fu;6;S(jiCs|Eq;_I?r3fqOAJ@A4}bkSxV!eLQJ$k6d3YBkDyUk=m;M^ z$7IdhnBkn?8u_yvP{EEIhEg*7Nk#vNX>Emy25}K4zNON7U=sU1CRSQ?L@#{+1;h5r z=`Xj!v^H;57!t~SoQ;4?m1pvz1!E;)$sg2q5?Q(2hkzc^MTgm${AK_jzTsc$J1v2q zh!M?kmr}pLi8F1 z5;e4MhuXooGIrcIkJEGlGx@qvcl;LtU1NU)XOSFmcaeRRrxo<#ELn3Nqi^1SR2U(n zs4PaCnp<%0(f0!$4*BTad{1F2tFa9<);Kd%=11Nz|I=i5zw-TpYn+g+WU*#(24x2= zCbE6)P_y!DR*kI<@^$7+b7sXCd$2KZBK`23NR7VdB^J6*>dOwI*+11L3gmgHX#FDN zp&!x@uLl=Idzqdb9B@)pWgFY3-e{cqOQcrN!k4YWE7O$>^fTmsK>R$)qi(aJ$Nm4S zMT5SRbLkJS@qbOUbMM5{{f>X) z6urzEuuT_yB~tiO2J{|#AUG!5u}dW~f46%&D`;2uk9OkeiY)hynH`xTTkh^}&9-3a zQ)P*AS%}Vy`YJlTUq&G^wa|*wtrdFPC)l~FP4BqG>Th&RMWOBQqY<>uCp+;e^4L?a ztU@S1a1d~XdNK8VPOVmYZ5IGSJ6C>D+WoQsOX|}wVy7%Q4FznBB=2AQG7fV``?Inl zb(W*8kA+Vn!WwlkSx2NeR<;JftuZxE`4LOLy?z++hnPorEqT3FhF)Kr_Nr&jm`(3w zmtA<*R6AYvoN1^sc2a1yU{;0bgNuXMs0*+^ltmtu1%z~dkPlxiOA=cXh(0qkvR2k} zn0bq%k=rzyhVq42zw2vrYYX2p95kQ=IgC|Fz2!gE&Z zA?6OKTpS8}C)+VfW~V+3Qt)OiJK^4z3DM29ki(u2a{$;N&$l_g_l}qimC}|FP_=<$ zA&1>-SXC{lW%1Q>m*^CS@x%8gB@WM-7?xSiR{2j_+Tq#g$YEKsIsx&4!H{D8-FGVW z8OhkZKKxVO?9W{a-cVgOl{*Tp={or~6#>22-1(dyglq1BMa_z0!)bM)$W2nT*Yb>o zd)PuVCwJcPq~_ea;Mk>LsNLdd%O=+Qqz(#Fh`rW3n&LWt==?>S?*y{h{E)B0%}8kb zuwve(GN*91s?iMQL}^abX_=FFjqC6+x3;qRGFmvyW&It(M2sg*$|T0`hqjc`$>o!GdL!>U7NwC(pda#$=@wf*Xx%g9#$Yn2 zXI!;ZRQbJ9)J5o|I-*D_vLcUp7FiX47P2JlDwQZ|U<@%u)DB%GghD)_)C~Dvu z*3TcHz+6i+-rtuDLoO*AF9~BEB9r$5S5%obzku?zLk~amolAI@RsO=Dak~tY6BvqT zOS^X14nJ1XC<&1Hz26`wG!%QRdqw7R2!)|&VQlSK3U77tCGTl4-~uPBjIoDuDmn6- zGIc&_A{so1i=m-d)MnZ&f2>wXC~x&EQ72Nms+3D*EAl79!qa#(Q@y}9@L!f@Urc|i z_ZL^VWW1&Bhc)Vre*vI!Zi}W}pPb*uF@su9GHpCG+pvjO4cr789rT%gAM^U=FYa<8I}#(14Y08Y=pgLcMT$5AmAv~xfX(>h zX@fmDsgQf~I))0|JBIyVKD;=Lm_0cVbYv^KxJO|)GThA;?$WDYhi%IwzE(5Esi(cS zFJ)x>xTeH@s7UyDMcL^##SnJv>Q7`Fp zUM@w~T~ha2_5p;ilN^zQA))qXSt7TbR4@ft_4YHK(&F}H1jGT+gjP>UsRQTbNBG%? z{HNkZiXVi?h(y905z9tX|J%iKBR@bh3Wg#gzFsK_f^g+}c;v(o#{3jD_nKRepuFL~ z$ZN@Wal!CI8091Vzqm}wV^6nbyLEc$-bfr9Q{{)R^yOcpd6fqTI@^op_`XrZ*pXrA ztb->n|1BMq5=qelB%sey9yX_QbNmar$UyN(I9W+^bsMABy-a>GVrtSMhCnu3hcT#d z>c97ijfOC67Dl^Rr=z|Rs6SeH1ttT2IIF(#sAg*2zHYtQzHJYd1_KJ#pb0kNZGH0K z!H}Eu?!QZ7vnGDUrq>#g*xl~MsT)S+q)~;r9jxU>&;TDh?~wK0>X55+ZWGS@Q311- z0jRY-eTp3MZ1$=9734xU`;~MY@TtcqVL#@$&8Lnjvw*?D(wXW-R^I#S@6K1h8Jg9! zoS03@-hWfe{BBuN*c;OZ3P&)bS*21X^Ua~dQba{^X&U`&)mqyv_ybyM%uo@FUhSJ# z8jZUNH7vX$Dl1J@n1Fzw5`nv-Eq%*kRB2T!eD=!ilIfJ8xP8Zg+7GbK9%vPX0o^S( zho}AoKn0x2wyYIWvl~BDAFJQh>_j)b-NaG*1&BIm*5Re~nvI+|(Aaem!EQTK%|N^{ zRd2IaIW$jdNqTP^5NC>asAvOe2+p#d?DMdC+01GCee>W~)BeL0rKr=EKdZ!YQYmC` zQ@!HVdDqIB{)OM2p#L8}RE3Xqkg(irZ^hbgox($IwDQ{JaQ_jlLNOuLRcJlX&@M-4 zx9Nw}&u?1v6RuuBx$6n3p-$t-DgY*=XRVWG(cWG7sQ6rdO2dPOfF0*+b;m>=y$1oH zIWCPdXE#>t`s=W^JjlDYk+k9yu(a_qee`_?|GpTkGqYApp2&^D9bG3ms8JFZ7;?TM zeR#|ELCXYKdoO9T*FUMk*-VCHsmL>a&&}@225=`BLCjt%*P;GAcA5!2Ghiv7^YCwD z!-xiM7O1kCmk^MeHTd!z{kAs>2_Qkt<^qEK($My;s_+7iYo#&1UBqGrnS)lQ`BHDD zY=f$(0JAC+Td{-8%*mKFXsJ~SV6g*VEwuPV6Y^FJ<5_~O+YM;gw=U|0iUxg)#=V-H z^QQ6{k{c0yqnInBE*>BE(@G_BCVm%#?^Ozbk~R>N>3O&hc{H5t`R)4tWSBTf?0`%a zJ~;Qer&raitSYK@e+5YMUQa*$GxnIA>rS6iQkx7lO-&>0VLuTULdYEu4OiGY91F{V z(yew%scSI;2QKZkbKmZWr%Bs;NFooSQtQ_Bq6gh>?X|(y zB=7Wjm9zlVYW8Zn^KP$<+$;xEBAlbU3I!~12fg1a8)0l@ga{aUP%usxHL4U;=_^C# zuP3#>oWtBszIyLAY|(3)*x^pJ4p^L5QZ?7Jw!8=MLj>rQ&J_H5&0HZvk8BlD+p

z9)MK6c)4uTisSV0ZJy)Wij>jL9_QP$GlE4L6s_e4h%ZC1M!X~z#am29?^J?3Q7dfH zlgfSg#`hmt@2iu`f#gn=JGQN@1^t;WyM>?}^$5;sr!rZ`52#VP?<#eLGWX$1@3`h7 z8JWI75qxx8wK+I`O!H&QpOMhlaFfc9_vMW;&F9KVHI@Heri9m!Q$8E3K715(|4aSx zx<3`cLSZpC%0;pMjdfd1Coj6LD0KZ%tqPJT(pfK$6}1RJN4f*#O(`{+vS7o`aR+Ty z16Ls?iz=IPOz>XMq(@_X_1Y@g?FsUmxTd6r15w!B>F6n&9T&w()p722^_ttgP|M#p z6#b>gE30JpKxvvI^Nk+)AW(@WVfO#zpkbfy!+?&}i9I)eAA5STO)<8E{ix8GH?n@80_8I6<~xmUVM{7@v{_h_JtyUXATPO*+~% z2m4-!O?mvuJeI${hdh<@ERDar94+Q6sNXwK0~nyylZ&_ma17#EGmeDK{}&c|0XzF& zSSUScB|O)EI^E~)d-kgN5UoTD1D)Zsgc!J}Th`0Q}k)Azm zu=}H}(GvQ1&;G76zz%Zhk0K7p5aZ6;ac?aP|VuKvzE9{4T@fz?+#%4)p>o^B!mKKX80 z^=>{6*F%#x{@)?~!o+)qZBG3LOSVMC7YM31ZO`iy<=Im*rWUfy8EIEzZ7IJ876Wd3 z#vB*Af9&68@X)(9CGGHOF|pnnS4&eBiNKh)hpRNpu& z>J|e9=1~6zDNvQkzYEUwl+8>Hw8Yd zV3}!MIiEVg>#y~MalR&={)JVtuM%K(z*sydRfD6s*>4U(I;S(@2GIwmW${fiO;RQj zgD~bpu@!J?>Yezg1c$RKx?IEeD2wJa^2d~n-dt5Sp0~tgCHZ`q<}ODoua^3YRh;&K zw-%a6g^gmCi;o}rEnms(lh(xXFc>T@+4V@kv2`wX&mnVZ2xwM1RTkPJw=hsGmC{Jq zm<-+NQQWXEtFWq7FmvtWm69Lv$?-vVbx)NPk%t{#4izRqc#TUJPk+foKP?oeHJZL6 zc!aMFWX+%59u73C1M(}boW?8-%~(tlTvB=gF>v(l4W`ithJQ6m0|0Guj$qna{w0k2 zWTeg33qUPeQep%wu#`Ul(6#uxs+uaY3ZZ|D9rl=N&EJ^^=Yx6`+@G3A^^XVB4ktc% z{F6Y&vTB}(d{11GvO>+g!=PT0SS2A$teP;H4MOPtRxJHp-VL4GSTl(TFFf`mL7?oe zr77|HTf-KtIrfB|ruAW^QLt`+1uBchVEp(p|ExV>lo7g~H4}~f;Noi-#kcsp$M9PI z1vs_gtM)q*#@rE1iu5rVz0crnKjEc0=$di3SAf%eYfUg5MNP_vIbqiN`i5F^YyT-n znY2k0>AjwD<*t9$ciKX#?yAH6rdiE5Bu!=5mI6N zCXKfUrB!OXIA99OJ+Zv3?^`olSc^Joey+GxQX?~eaFF>4-#4tU0q!l(Q(PCp%8`-; zHU+4>?K8YNUpHQlk}D5~0qeP-%fYOmLAffSM;#O55g8yrJHysvfLZX?v_=Is!_K_` z{@rvP%p`|u9dh~sqH*ux8r1mek9u}_O=+u6vX;=;J_SU>uBHKI3P3_gHGj^m58<}Q z4IpogZnw34^A9ty{LAJTp%&7BY~XICAX|lcerZ=cEEqP7E>ppO^YyAYU6Yb%VQ*Yi zY0wN5#&{{#W&w7o1;k>bJBm|KWcBOw^2QmcAQ`!{VPqNyg zhOboH+8?m5EBqK+f#A75Y<#dba~>~%SO$3sS>)bba{yYDji-g7SLcal zNBKfRca?{pO(eGIKanPj9>z4sA$ski75{~FC{VQb6hT7uDqf9Bb}L`&HyfI%_jBX@ zBcUhTd>con+=m@cK{MW@jjxIso)9gwMx#G@U6y-&rE5_Yq)BHG9h$p%wERZi^*f`+ zeD!q$t@(I*rb*SW9TZKS_l*_`iVZ9G`6#4^>Y~j87Pc@a{PNR$1Q>mRFZUlXnwou+ zZxlz5z@c=OX2}&LRnq^cqbP+GvszBcq<%dj!!LU_t(0c$okXiIQD}x*Z}O(R$7e!h zNQ|C%YMXs4{(7wAN$>v$9961jw$;gPLL@Swkgr&}NCfci0}1*uCe+I*EQLB+iCu;ed41O~(EspHTe}HJ3u4q^(e-GNgzXWX^ zF0RJ9Pb!#*xT3|`ii)IZtn`1Wmv~uNMFlUt8R#Q{<*U?tOphCe4gZQpg zRBRHL&8lal2x*-Qg`E{kiH6uQd6A?eKjrw)$Gkz$0ImN zg{Wd?Ee1ks84|5xh`3Qwu&a+x-h;2?J%~6hUzmUds?+P6jegiTSyjmC{#CT_c=0>x z&@NB~3S&WodhIpYnUU@u&VH@vwW%VZA_}!1@fV1Zukfe>uf=}Nz3USy`wtf_J9$-I zroLWn`CnkPxA`kyHdKMv7No%%a31w4reZ3?uamn^ggsQ1vovlhC|JYdpgEw4#1lQaarZ*K;2o_Gk zL~zhcZC0|m!q|Tp6u~s(+Hb>U1cbGDab9lxrYvRX?p%6a=W`kUnBCBT|I)B8`G0cJ zI7T)(j^vjAlZ((|X$6%em z6ub`auDEUc==C8RL0uKLO00KVMFOQzC3y+f$(VN-10meaY+#qI;1zG>0ZU$aNQs0t z2DJ*MMXqTwfQoj_3#3A$>Mq7Ui5$KC1*O0Y3mvneOrL1~w zf^b5uOjj!W^iv+WLM1T$r

U3T+94S1;0JjQ^iqo?nAykH0F^5r2Grn+b3qr;4%Ip&0tjEI ze+_=99>fJ$)@EYLKKE^85}i4cDZ~aUq&835G=^JYsy=Y`U1(2xPUs)Gl^9dB)HNLN z8=O9_Q~u*ZVY8h!&*K3vp4X!Q#WRDk2`o!Stg}>-!E7zDni9ZI$Fv@@D_z{se|DQS z%)?6ipmxXxf0R*8O68)`h<P$Xgt}{-F)YF8PW=u+nYsSpZp7oXM%E6r4#v zBbp&*IVa}SV5-tlYWvKhS7GMjOqRh?V7e_y#N0tpmD*Bo8)li_GXVf1gO8(sm;OG&{@zsy8z}Ns8s#5Vz22A2*bH#n zn!MNW@bPVVlDV=9@bA1=Fb8C&mb|N{yebk~)vwl*=Tro>^8fQQc)0B7@@hG!zTXmG zJAFL={1(8`bB%NudE|1kpJe)A7I2tMvf??M1`P-u*tyQL9bWV+(e0~^R#Gnl&G5uu zz~3Dn_;qoesIQcMJy@A9&>EDbjSrC3L)UA@(d&}#3F@*m&0-d~_2NJ@_p?}CQMH1e z^WU)!5(%-(Syu7f_;kKG6fEIHEXZ1DMW%!uCc;zsJ0ex0%|=z`Ekd)w4bf1@?*{c4 z)uPrLW2>c>rDyX<52wP@(edWbZ0D2!t=Ls!^SKO~_jS-&_$*5Os+jYQBpkM8N($uM}%`X+6h-l~@pyWh(*tdnHTxACL=V%#x$} z->Ir|prnHPa{EG{{u=|}R?o1SCa4#vk7WQ6Cnx=pheKymGEj^72s@)`vq-Volz_r} zZ6In$$Gam^7C{HY`>h%;o>qGto5_&jy=`K#gNs*LKP(p%+&}*-?Q@!;ZmP{B>VxF? z%e}^4=pvz~s*eWSa)FwTPT@)OQG;Oy#}bsfDyy1QP0%LXE;(ZM>q-Fw8%#J7$ANhD z2}JG!L4M7{Hk|%(%GljK@XJDle1ftT4C>sE$3EhH|uK@TZa9Mgg75`)~iDGJMk|r?-F;X?Cmo zVV2{KB=7Vy*o@a+pe_mLWonn&$~gF=%oEK}b8r3Y%+Vsf=bMQRB4MFo!d%B_)v4hO zTN+Sepi^163)huBH`+B}&rYw@)Otcv@i_0z^0S(XRA?Xx`Hz&$&c{4e?+|qu=xB-@ zmq8)Z_NnRFLbW_@FjPSUxcr!RQT>REgztt%nsEQ=Kg{0=P)Gct>YD7#9g{w)S97|j z*7JWo6!|>@N(wMcFUj}fj%%smqKJowwje2~RPH%R=t;qe+<(B@lZm!#@w4**kN@H< zK5dEPV11rc!qjVyRqe(7FYr_eW>sZ^w>{pN;jwue{}91!T_RK4q2et~x4^HZz%wzn z^Q>O0;Bvo5{^NV*j@2bji1H`11JWOraO5x-ZHkK{%ha^29+;I5PfQ2Q+E~88dDzDO zLRu-MFJOFtuI7IcCvplM4v7Dw+Kh5v;4pI)2k!+a?Cfa^Dk%5_wmrG8a#axTu4Q#9 zX<4bf)VxxX!Zj{RXoSIWNaONg+b1!N z=*b;?Tb_w7Yo^1Grtcj}T43#QV69IVFK)Ev*}cgbWwL(>E=WUTakf1|XyBXL>7IGN)`iDE~e_3n85B}6f}p1*3$U<}Eh{VDky6!g+rEHZq55dgQ0#;|nh zE53v@zs6ggi|M?OOkQ@$NkE?=@O_t%8k~bXUYFi2U-M%gu8cso!H|l#-I2!*7ZTI% zt8Q%56Ch$xdA3+xOF)BurNRv-T(@L`21VI{Kih3X7p%Aqt^ zd{KkfXiP;^*GK$t373T7c&ji+WMBBeqXbD^A|Lv;qYN*BQSwAUka@Terl2fichq@bz| zSML3XTU-#i&$$J!wYWD+;X04o$Aa}Tm_2Vjp1$iDj$2>o9+-8u?y21SawoewDpZlmF?@(^ZO(k8An85^tsex|PnL>z&8n zM<`3W`HLCEv9){QGz8lVbDewmSABat7jy0}mQyp3gaY_fYJ(aM?eQ;sJ>MM=Y&zkb z;g)VJt0;*?*lCZ4`l4V&ce&EMq?l8@u~M}DzliOJ zxeY;96yvg&i>Mk)dNd;3IzQMMz+nZG(|Bkmfbcb;%m^~TYaTBM5g)7AHy2KF$EA%b zy#k}zRzautr7kFC_rfY?<76*!Vj;d&vo zI$Bc4i5L81bCu#mqXHWmrc{NkRVX$vl1A-OgAsADS_GI7+Ce6!6Bf;f@^3mL&1}8+LXFuqD!@`MN#E(|0@#J zgb5sQ*!nlcYF<=QxnIcb$5XEx5F^Oy;ENJ=MS3&M_1m;UgxCrhi_iR!@3qz1{5`3h z^;Y&;946;{;_r@jXimcnVp~iXN{l(R_9=S_Q|r0K&3)uGfn> zpmWyQ%94h04KxC~Dw_9zW7hMo@BAY*vqH}BN>2Ufc z^q?tJddp3G@>Q9*67)o1&0C-$z7|Mw{zFqx!Fv##q06NHHE3t$LTYd{Z*K>BI2zX=p zU?cG`=9Kq55lRAfqCoYBc$N+g)&UkDGmjt7$67deyF^)Ss8>a!oSz1W5PLhW-==3La(h**;-`ey`v=5y(^em~ zW!tAZ$~08avzpyuA?OC!di*Pq?eTxlxqAx(5C0Ex?!(vYJ=a?mHaKZr?UY?UkGIp0 z`^lKrBA@Z=J^C()hSQq8bi5K;)qO6vKpeEf{^TW|llG;=PR61qsm%glFDlr+%J6k& zN{(j$#j>O>yo!5>_;f6)X)&IC(X3NvpB8y*jG{Q zof%whmq=g}vaD&tKpsO1Z_PB2_z_tU%6&P~_f8LKie%&>B%SX!BtJ=!}q3lDhEb{vvIB2bgLc9ih7;HOH zOdcd-=U)xE;WzuM+L4pHRG__L2@jqrCdxK>J-RIXzXl+m2O$rMbVX~{p!ma$xyo6{ z2C3_Q97?V2H-+MZH#*#zbwT$N!#OspnN=p?D7D)v4ICrpG zYW_M-T;SZR5bHY zy5z|BKGBS*bvcgs1*HdXXMGbpj?%-LMLn&zGLh;XQk9d$VKgd~HU;fI!BVJbOrooC z{-MxGNkEca|NCp+VFq_eUAoI}BY+OWO;JCgD4d|$w9<4$2)$x$w~r-#Kq8**jY?k9 zc~9LWPWE&;*R5$3GU+KLtrOKXjH!x}To-(mY=@mIi zB;8jqGECp3v2wv|%Q>zVyIFub6`sf?-OEq8a0d#C8(lkPf`Ww?^qsIPlJLWhAH=|_ zcJLf^typ&XB_*2R?6Tgbh+N`C?4&yh0LL9ttB~=-sgd_X*t%<2Tn|eQ{o3b`fWYcT ze?P}*foYgwy>pQxTaekm5@?S+j-Gi#_~-k@oP&Iq{Q7WZNlHZ^u8--nJ+mq)HE=oMdUGmU4ViH#8I@e{D<4J&++<; z;$CCIF8RoYZtEiK%DBs=n=E(FIkr~8`)5;o#9GxdUYY-|i-@$JL3KH@Lpy&}Ph_Em z$7Ap?EubP>aL-~K@?LG@Xjbf5gXk150=XzO6Ff zM48JlhyyS^R;EDxpuCLuX2;QJ7w9Jj7BVHBa`XDp(n+@1rQ6m(p3@`RCa!q+{`7>e z@l5=5ox9feG2)Z|z=q`|aHlz|kw0>et>B5#Bi?iFaZTOOXmMI=-pSc+fsQPk4MYJU z+Wp{!W0tH|yⅇduu?;>^x4nS=c)Jdki1(3N{U-`-|H1w-k>v{=g)WN-@jNCfBo` z@d*=ow)*82^Zivz4QNoX6qIhfW}S+i49N=Kcq^l7Mt~+&TM)TdH_t1Q6Hz>+O>8x#*i{L$@kAfAdjU zw(_t-4ss66AueYlN`gnHuC*;JXbh@84a8~OzerKRfi?5!=S7-u=0;K2Wl#odSAK38|KL zz5yV`OFY7tAtiv2jNf2`pK{P-GhL-17h}n<`5j;G<6sZtoH~BRWs!`OQ5@2432L)6 zG{m^HNT;jK@-GnTfM?E<8P^7VMREIwq9#hnUVTtTlhZ8T96etK6pIC5!ChH?8Y17W zb%8I$G8WblqRtxl1fQM+7$sW^W11L_nr)e;29QHcL(r;od2=-?C~92uNiRU^Th2qg zueqiU(0b=){}S2}ls1-1Ecw8)&tx(MzTLg-Mngva6VR_kUand-Kk}Oo zO*IB9cBIp||F-Ikiyc+?n!_eHsO;KgS`v)b7JJ}@6933xQ4xB--S_mJGzLi~W`+J0 z4fiV~OuR88`}O3xsm#_g=dR1OfA;w5q!zfAK?uS_txtnALYL@PwD1KZ4Z@DQ+i8~R zu-tvMW67mLCUPohanvM}&Ca`H|Gj@ja~Tt)06Z`!NmQulKTd zBFf=idZb@#HXfcMdaYAF?BCM~|Kv;5?L^Ea%H{&Yiyqp@R3mN|rs{(AXaMSYF?HFg zp&2?c&z`F&H$-W*OSSgqnC$!(sk-g$nV6Tl6f_Wu-5(~7{TPOE6O0SyP~+hS!3C(= ze{1HvqMBN_J?>Tz*r=d;OF$4r+#n)FktS_#kS5*Gq&JC@&?7}iq7;!XB2q%s4I2;< zl7NI3KtPIwB0VAW4go?42|c;-oN>pv=iK{n?#mfxjPK!F-<)I2wI0@5WB%uFPW$8@ zDd59~D@-#w26j_H@P=x2qqQJ1Dk6kJzz&9N(-_0rx2&90}q)C^Cqh!B^ z=Cm4(PsEHX!UkF>-C$q9WyR-2tIM4 zaMs#<0+&uh{nqt9kgT_@>)pYxH%Gr2R`mPjKIUtDmpFTc%dAi1GhmWZIfyCjs;K>Z z;3gw#bLAm{w;b)l`@3o`r8C~g6g{0v(bpY(I_t-1CcVT~8;_1uCv#y_s^4@j-=?@K z)!AD$?Z7bBIA#qlEXUX#Ixbv}O^e0MR8e`Vfp^#Ch%%rjZb0q|2H0(R?S6CUvlW>6 zd1vQHZUr^6VH_pO-$uy^&Eyol-sHTkvuTDji~(}R1R;P)o*&1k04C|coif}A2q96T z*IObzl9Fd;r$A_a?Bl-4c=>JLDa3JU8W%xy@F4eEto%n9KL%K|qhibJWOJ|xDxD`! z9H(5%j{D3{EyNpC1)PQWdA!e7!eN+k@N@D3bxKxd!lDB^N1L#}j02~3Zg^Fy53Ix@z5oQkq`9;^yT4gGUDiXf~nuIl~}sc_P% zj@i>cqOVVe-XIQetXpry#~Ocj@Wd2?r^H|cXoOdQNjHaj;kF2bOS0s9+Wl`iNZzXo zc(&g1)&cr^$(UM46fAe0noa8yCXbEb@IDQ|qhmwwOisebUEQN+|1H;l$b#a%$*5=rZeKS4v2%eb>Jex9GhqZxj)d z;#~*9k<+Gxw=Y>g0}C|Ghi74dO%-JBtzBKwWKChLve4I6HPKBwYH3SbyH>f>Cs+r$ zH>rwWgJdR+1XNT_oe*^buX$N)f64GRy~W+48O2ktWrTrppcV}du%SnsyPqD#0aLn~ zrQu4vqoq4!<|gp%&J&lb{?fPeX*#{X+*(xnex=d`$DjCjdPYiCwRSntT%pc0BdMG? zpD*|Sx#X|F!hZkI-xe*0^MGQfqd90X@J55BDtisxcF%I9p+X+fo*h_BY0w!&9EpHi zP#<@?3>!VoYk&+_QaAc5$LFZRJn*8Yxe|GUs}fb`SyH^MSS@k+O?dCWc2n>&$m^p( zNf$X$=*N==qg{qvMrE;jOJ4K}9tiL;3S!qIM8x1<96NSO>Bn4v+oEf?N!^JuuY))r zi7wB21!pOw+mTkF>=Ks`GzBu*@`}j3I@&p+*+#gC3hQtk4M~9<0r7_Q-_6gFr+-xh zg?A))Qr^v~j9pG^z*F{#&x^xPQ>IM1)ItIiM=>naB^*uGHD*67n%K^gV+}ME~4B3eCgB;L+ z_?G>wU<9nyIX%^4e0r)85#4_rqVUMp`>yjtemmKo#gJrOUW~?H zRU*dTVNigh<>`ACf= z+q$O}w3oa>PThMhE6h+#S`U1Awd6H!!zL0^kUS?Jz_Q^RuZC%{E_EQj#03px%|7ES{l8t0q>a2Y-RW_`~~Ur$niD$}H`KMaD}JFcIASicJG;GFc#eO3ZoS z@YQ*}cr}O@w$>wK6ZDw;G(WgOLp_1h>tcN**Xr{N=t<5~^7kBP5fB^K<(YJ*<4t%G z#}iX`>g1NGvq*KMYO9#biva+L9~p}obBTd(LEoNR%IqaF+;<&9V@WNEv+;XSj?CEI zs~&$nXt>|+gz?)8Qjl{@L^k?HHg)q*LG`+~YKgIApx!mc zSK(mCwdBY~w^89gHpxIZCra=U>$tq1U3={U%n@4m5Hk1|?LFMB*Z}k(&*e!OpYmw~ z4}K@)>cDpXA8D3->Pb&!5@`u7LaKbjzqL3pzIN8A96#kx``H~VK)owou9(x!g-NF8 zBd#&dySz$n=lIbnzZIz+&kZ_@1eU_(Q%+(Z#YDb=?}ooCX#09o;o2!7t(vxy>&RjT zOPSz}cr%II;3w2PeDpct)Fm2UWRXtE%NWwnmQL#3HAA1gw#@=w?lc<~buoB8OM86s zXfNDS_ojn#qsvRQAmTr?ebEbU7qqXjO`iAUfN5*c>z#(iUM0;=Dh%Z_?#lhmWn!Fn zl2bAW8y+I4KTR<+2lV-5WFiH6Y$xyRi;S9A?x_(xf$z2cR-Ve{_Iqf5dgWZkS{4P-2K@+7>dV`lSK2Zy?b zmtfV46N+A!PqjD(D^5j33nIgcbGNdm?@4EjJKH5A6HQO=W$uvSaCwC3W>50QDbPUVIzN7>a{?HF;%ixmm8YX~#Bj;7n?=jhM*) z)Nu_tiNO}vBsL#VBc<@;;08iMc6~XbR zMaK=lD&#g=F+QcrF0d;clAcjc>5;lW=IC&~CgeF#vdj^maA)DL+t+rYL`mycM8Kku(UJxhd;B6ht8@Ons>ZGn0B$k?MV zKm7_UPC0xTBj2eJsr9-vseM;}BLiW~X%+alts{XxJB#be_@9q!^SZ{4TIBm(Junq< zgE~+2lZ~D~b&8OLaCvI-lk!hEMzwChs#Hpuvz?edH8r`|^_=tvEXOmGkxMJCMF&uMjRd7zQc7Xk0eOV zs5vI$Fms(nZKm2c=0*rsXtUFreA$D(OJu2n)2Lv&4vDo2K!Kqjl!EGPG0`K^5u27qFMq)M; z5hQrn;R-?E3)7z27Uo(&XD_4XK0`neC2Qt9n%!7k9&V{4L<4>$ru!{njBGV z3~>#G11Vx?R=`;@LaFh9GRju))?BYVTCQ*MXJ^f!b-2hAaY-NWsJ!@v^#F8ebR@f& z_D(1A{33Z`P8`Xe*M*I+*s0=Gpk$`XsAS)Ujy8K^_Q4WWAJ-9&!Ua*AcocOHSWD>S zdYN}D`e=tHd}jgF5zpQX7$c9mHl-Vt(Vdo3dXaNVQ@GyLdoE-a^j!v129%7I(_^+@t>s D>YRq( literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..b912383fa490ad326bb1a93f6dc0bedb461f58e2 GIT binary patch literal 20582 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/processConfig.h new file mode 100644 index 0000000000..47044dbe6a --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gg_ttxg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTXG_H +#define MG5_CONFIG_SIGMA_SM_GG_TTXG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 16; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTXG_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..46b5244f60c1a8e89d25de2834afaca59471bc3b GIT binary patch literal 17190 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/processConfig.h new file mode 100644 index 0000000000..fe66e4e760 --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gu_ttxu/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GU_TTXU_H +#define MG5_CONFIG_SIGMA_SM_GU_TTXU_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 5; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GU_TTXU_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..20f88674c1aeb2e3c81584495918cc0cc0bae1fc GIT binary patch literal 17238 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

!gx95=7J|>lcw0cj^16d}p|dn1}Hu zJoX7})Qd2}2}bh5LVi;?>IeMm6MF9TudN@uE|r1FNM#wZot+aA2Y^Nr8H)KV`T2<- zaY8Mw9!bcX)M4hON3L0Cyc3_{Q^eu31HxbI)+1uzO2H*;ku>k6csv0_+3gBYSx`rK^Ca{;(HrVZ$RU}(DD|U)+P;gBy+1W@p43tL{(ktW7 zqQ7)%$Zb4m+;{+0{#cGfUgL@{SQ{$)A-o_~Pu3a$sGEOnynx@^=Jje1g$HHgn%_aN z@f%(A<$tcank^>yhUzD&Djf_ig+@f~!N8WI*aKHe(ktQzfcy*a58ORK2n)#FGlAkBv+vB?j&_d< z8pEuul<+WSWofG;x0R*BXn%!Si6gKPf58i_Lhzy0dsT$M@D=U3DCTkSYn*9YB`(6= z9p}?Dn&x}yJd{jIMwhO3lQ1Df+IVW(bVFe+un=P&$NYKDY?t*{G)^Q#yo+Q01&;=> zsMA)9AXPAYV=u6=oXKOyR6#4l*q`C4B@T+R5L9}EB*;@&n{@tR8z5`%_JP_J^J(5! z)qgZ}n3HgFt{*uW!j_3(ZfEOOFisBlUo~`ar_Dr6C`5*RQK7S^E?s=-`H*HNn1u?j zQ`d6FwNL^O+5rpMr%p9N1LjSK;OyNI_%w>0M(yhGoZzT$$DbGt)L|IBYNJ6y<;1Me#94` zx)szxWdj^Ctak_U}1YcVwPkww4 zPMc^dS_7~Y8nU^yAb*KHgGJ>)a^S7?vvZ2hwo{KudW(BYHw!F@!~sbQ z|H7Fv5rIj%@1qg@{Yw(|f5r)Re`_E4tpudswHW#}Eded1tDt_ zEPvL)$YRp71fC`>$>d(|RVn zXD|UgKFJqMh5ld$wAnjoevwT}0V8LU(|Xy*VjHV~(74W*usX7D_P;AoCsLr7qvUP$ ze;h3Z&Zyr(7yHTW&t+8&#hm_>!HeOFq%4I=GAb2wNR{u#%fxlob~w$|35#h9XPmde zo!st|bF)LviU-#juAT2K_f!`6#qhH0HIXbh?^erbo}E*FOjfrv;(BKh`OM!Q%HhO<@%f|2KlhKCD}5IqH_qyYTE3 z?$4>ZqbiG!4i+05g)5GpXZDhLX!(2|t0?U^ahFPHs|<(?pmlxC0pPJ8SV&9LPRf%>CicE>B=35Mrw4G&mD$VcCMVFHL-F!z^z}NxHk%M4L*= zk7Uk`GJ84n+e&IFQb@|cl8au;*n~}0q>j#+doxrGSp`UQ!dNO>^KC4Y+U@5w_!jE7 z#F1ngS?WXMHN*?rb|#f+tA3LG&gPTZ4W*0PR&@GW@&n$q+W*k-0K3%CBid544fvog|Adh4a}o{=k`1 zIg`IeJLBdsWOAHCHAg)tZ5i6_CpC_QMka{!^BM^WNE}2iB?eR^PiVAWj-SQMQ8Ul8 z*eBf6#X_Vuo64F7?rUTu7~Ae2Cp(=cwSA!Ij23c;gj*NQb|<&m_ z?y~Z~LtahgQ@v$tf)H-yNW5=sQwEk1gRKOpHy6*-P%O@rH4Fu-NQyEPuNF+D3IF8400~&@uRl9w}Z}6AYa(`x%lS>#oUy^ zJdTTrk|GOi_M`MX^RMoxDQ3l-qClmM&8OS-`0br&W$Q*U(9hy7&E@a0OGvi3{hk_{ zyYwSsl`AmO+6hW?`H|;@-=lGu{q}?@XS&H(YUi{8Z|)^Wb0IV=$r8sYB+Fx^-OdP` z^8AD^M_tVbWEUb}usZ8*LT*l75@r-fvc(_*D+Yb^9loh+GBr|*>#d3CCsI~%z@`*U zG2}R7_AAPn&oQW)8DTO4{a8W{3gDg0yhn+K#Gq^8QO&ETI6+t$h)NHa-sjrHAWkt( z{AG<1bLg@X)GyHinrVo3;D3$ppJ<2!bmT;A3RNwtb*jD4Q2>Vzp@Sq#rT-!bIGe{k zwA=Ij^IuoFBmEi6YxIgcz2x@_mTR#gZs`rsJ2GcE3=9gyzg&QFy|8^@^YTj6pX(py z5aZW>zG`n#Z)$8baDIkILNt`jJ;)T`-H3{f1_TL@uko@wa(G$FH(az#6UlL0B+ndF zTk?LR<3cjBA-dMJNE7LgM`_=JaMPBAX%(&(5^nKNI$w{t0PHnzhp zz%D%XUiSXhRbP{`650AUZ}mx7X@0~nizLMER9JwkMP3g`^Vm382|G~S2@Em>Da&z& z)qV&m`l(4Vl-|9`a@v=bXox-UH>kzWA;+16SZD;{V`LPQjh%Pe)W1dQCmITZ^q}Mv z39%a$5m0Kony4frrP2`H$B^&eax8=#aKNJj%?62vk3muVZw1NvG?e~gF?b#FvqhqP z!0N^9CcE->(3WRkg*JWk+0KerJu-mfw}g?!89$dC{zN(LBpL<=wD(cumWVhU?I(QQ zb*Kqdy(zgow?WvAj-#cbkS~GCZ1i#0Zb#tGbxTd04Srhj*!`dCD69&!bpC})a#-Mu z>H9{pH=|rHNv1X8Z1=tjVkzeyOCEtcHaEL|y$3q2fOljUw3zJb-;j@I1S_-EvNoc; zy4%^cETCNOy64AdfYqf{)UzaoQW?05mMFlSxFKy=2}~+Mb4+1{I|H=0Jpva9InR~k zqEA=oT`-kn5Wg3?38oh5_c`+jnpO|e0?jwE3!b;JYw|;Wbub1hSM;LD==Kw8dQn_@ zS+yT?`>K6`02f#xCvC zAqFE3oJLl@ujT3${`$m_+KK`bS#3zOSSz};Nwy!VUGW1k>7tZN_bC915u zVsn1^1VzP8`ey|jr22eTKWhCAE}L`|Pdc-FMDnF{Y5(PmoZ7WU>VYNqhz1SX)W^?8 zXS9Un`0g?BNctWjm3L+6F^-UgXA_YVZ*{{AY?ve42*x28LT$$@ARQ@*Pyi_ zfTSrHEEu{-sCDR#8$AT8P5ObD26ByIfi3%TIozuy!aHV_Ns{&*#V&`=ku;qG!V-lm zs`rtgATsD96qWV)!em(K1bIZ{&DJR~wZe*S3>D5G8Zq+VEG~^$MxVVGbh>RlnA412 ziJF~g^+IQ?K7*|U#UXvZ%CX#^xwB$Xw`*6!0~bGCFs&`MDA$7GGMnn{Dde&Go(ucs_ner ziO)b7DxQ*0oK0lNN~rY6vqgl~GE2%0#bLcsYh%lVFvs{7-0vgOvl{d(#F~yl$ z+UQLDaEVn*6sXlE4y}4VWcjF0IDn?_W$e(5mWdy@KS?;SkJIMW%4(Az>&o09+m-VJ z{j#e=a`0|xxKd2o+l&Dhw=du5ses%}fgY@1h^0^qWVW`iD%||Qiqd|KGLWE|3BSnV z4j)|7n>L|RxBCIV4~pxr#=s7*%G5c~R{Yry@XARgSNvIqu6Z2NID`_;+2&Aq+S?cN zu2Eb1L+%4+Cz`#z4kv6-f7nW1>hgYgEE@X>M>+E8d2Jpk_la$ZF%OXCBHF4JvO0V4 z{wVkDOW9}^$NgR0Uy=9^y#3mzHN!!09xsV9dxSipU9K;4e7zKCUw(GUk%J@9$uqfC-7iRL)SPY1e4$RKE}myLXUDmqA?L2W1Mjn6aFO2pN=1;!N&H%VHR;y?(2^?7!oc-OHg+72RvEr?8=!bJQu(V%Wju8Ts3J5%yhf z+T|NW`ZGxJVVg9}Tf!`?qx>u`?=BM*C!zI*{q9@P)~{co2=A_A)Z8cV`R-Fl=7F)l z8-3H`j`8#BsSCpVef)lJPji=`wcg^=I%-P~AHt5^$1oB%*!}VS^|}8=@$jPW&>0f@ z9);RrZ$Tfg9;NO>0`Bh4Qok#9{of&$;+xRi4o~NOG~8)bx=cTB;?#d$ZU`c=ZWk4> zlQ=`BY)$?Aur;NRjoe=^^>ZBm0+RSrb1EWQzC80`>va5`MmvEjC?9`L;utw*0Y1#X zt}p4H2VHDHK>;&w_TD7h>x;rZ&Mp~&14KlOmuS(eQ%sZ7Rq*v(_5Q2f@;BTqE?E1V zKWu1kg1@ab21OtLy1&W$x2jzQHk}-==7QwzEB}a3shLuYgkE~zuJ1tt>cwF4CaYCi!-_%5?x*Ov@UG5-$Vp48jO+O+9pC?T0%_; z5(&7u7d-W59H^%k)oA+7J(ld>IXDeCx+DkAX&h!(IdbmWNZTW#h)Q{^?~8tAH;)Y< zsRr@{I_9qHCaSznUGIF~LhAod;H9r~v$SaFIGGrvq^j`$61zN#DOdlWj$QsAax`}c zEPp9R6|f*|Y;*RxBuY^n-FvzlEC}Fp|1ZVzFOZWSl&T6(Oe-1|7jRny1m+pXg<`wQ zG6*GKpi#vQt5(9p0>idKH6Irr~+3~?7$_O(s@Cy7F`vSAI zq;(klcN=7t!wl^y=C+f1Rl;IPh-Unr#)=@I2^z5t6Oq0G|K7&?BKm|K7a(}8+C$zw zF{|m(Ll--!8v*A=gO@?3lpxY;_|%b!`sw2LgfK=n2yIZMR$aVRrC(8rjP*(G$03`F zt6oNQvA7-zZ|@VF!LBLFk<|uDTnq1Udkr?`eyShZz7WUH->3DuE>s;X#c3;o`Vk~9 zE;Vru6FkpF=dakqwsQ<9^iSAoU73{RtMZs;BJc@H4pJ~9@lnSQ3Jj;b3 zX$4opUF0g`7gK^vxevT?Efr#iGVEMS(JG=anN!Zj<|EYVL`%-SGs{8dfU1Si-J-e? z%jDPox@~3WNeB7qr1+a_6d^A z8PAeJ%gs+HjdsxTaP-WTqUFzl?Ha*o{`I8c6`GAcu>MC`?4{G9ZIC(dYVGig=)g1a zCj8hM1+REZ$t5KlTYAA!TK)=H{kls(HI!Yhg=(9)wS^*EGfduM8Mp{Trl;Zt>2_5v zBG`sLvkfh=ZPl>l|6;rOB$PXXrJvtXN}eG3a@$j7r`h{wvq!|fu9GPXRTztUU|5&# zmufn&9O)RI&R99GZRuIrML>06r@A$a%`{&ZMP5ZET}2hJ(X4Ff^6g)Z+Ct~L*M?=i zZSWs(v{E0N=?E2BqU03BxrMEzg$=4B1lJKlE9UFA(LO$nSg@`8-nb08k!HLy=Kjlk z`dlw~*5H?USnjW#hDSm47cu%C@$}=+R6r8+#FKP!#7~Zm;CCPsSq)2AtVpj7Sf{d=+b9Fa3aC~7YUJTY?k}mb z$OvO@S4$UqF;Y5!?WXm|nBQ1W+QmEj>{SOwk@;%0m076ZleP?2o1VzPI_p@!RG!SE zmQTzIV;ebSUwvh{;Oak17TV(7NIest?WWf6{29mdPv=Rx;gzjTPZ_$aDcUp`?<0>j zWP3vdD_Wu-H?Jvc*x7+5xM5X~yo7<(VS$tlq%bNeSPp3eDNr~QL4KQRti6t)Tn=m} zZBf*Lb^L~sw)D!vZg|B(ZgFYWdr_C*0mM==f?O5P_!XlEKC5dFY_zeZJHn0^O6qIM zI4{(U8{dJtkuR+$%DN36Y*xP7Yi8qA$`4;ot!wKike9V!FUzF8(!As?p+JwQcLWDGf;#}Rf?Dg%@9n>lnn>2;kEGg7?Tio*=s~uZ ztDTc|r8Me~#d56~c&?L*m7DIRb`FeBa%|$gfDx00MmFvg*FFOs)zJy+>4(>bV+{?| zS-*y>_nsVf+rs2PEADC5GA0_PS^Wvb*$_HNaneO4RyQLfP?yi%WkAkkf~T(b2yR~= zLg|pAmLCaVk})}LR;H*6-S0|&?$>j-bj6^QFOhQ_D&?))Q%7#|Qa0v34O&1IjnGbE zv!=j%4&ruh{*tYk>)}89mRq1mB6s&v3h|bFw=o}g;PaPiyt6NkcxT+b`6AYWm>lP0 zHC#1>AvR(82A$ytfav`lay%NfQ(N77#k#JR2`XZh`(Nyna!r&(pU%ndjUcrlg_+5J z9)UaOFiW?tY)<94i&LMN@uem5COXCS;}Se3hfllmfPRx7_Mv6x&4$DWP^Mc0c~JQlUdE(Fqu;+u zDx~_yVXyzXcWt7t8*jtsjI$fWE?PqZrXwt*7R`W z;rK8UOX)S5deT?FUx7dD!w1EJ%e#}GV$Xwc{ao4WDm&J8h@5wBam$XKYnqX~k4Rq% z9w^!FsXuL5WvlC%K&1`hS46UQ^d0;}bFzEeAI^K#%x$Y%;oRv6!?yFZa|5FYSyMJh zqdTU)tohh`OOG^^Qa77o{(QggnB=(5jz_P4?NfDFZxMI8)4tFpdz^zSKhT;$9MAr{ zhX6_uPdwN4yN8K^BFR#0Y%KgG@I>tVx2_SEtm$LW{LKzE0;hp=9p4IA?tR%nP+!s^ zbf?|bw&=^Eu3+y$KUejjjY^Tf;bOT?8MjAgX-k!{l=UQ|^5Ay3jp;yJ`*{($_PA_$ z&QiqLTqM5pfR6GhQ`1?Rv`$U7R1tS_t)=VJ7UJXF6@H?;ifHf!Twimb>ZsV|;AAot znKL+exldhiyFCKwGty^-ncO8a>nG3#jp*}LELMyCl-X=xNRAmUN<`Xtb!3} z=6at5AOEnr3MC^g&~wKxH?;Z---^N&q237?}PopcN=$S`)3Do$#UGS7P$T8LCJIR3GjVikMubL<_<-miywuQe}kzC^hb879hZRg>fg5{Aw;qt-b zv_JnnvjaZ6q*}JHG^Uz)@iaIfuJJ#?kflgoRsQ+%MPQGMOTL=7iAjgY-mpaaV$}5x zyQQDv5klNB*wgan!zlTJlhXjW^)BenSId5Sv8Trqnd4)aU;%uvj%2tKFj1gV}ok36UODy~JC~lzZ8@Fg<^?p)-%q;)%!GJ`v<3$p#145M>UB9ioESbF z!IvV{NHU4$>%0C4WRlkfp@PoLf-Jq%T=M>i-tRB%esa9u3b|MfTW&ol9qMwLmoW0> z#exm752+=#Tyv{kFQUV3r=Sh}fZM2jwU&k8i?G94k#ErZOCqP6OUxvva!=sRddyy< zAIJ5f>ipaWXim>mDCDNL`A_iQzAa+}b>NxKP0dZu%u8hOqKKab_vu6V%;D0NUU}qD znZ(tP+j*BoQ*;XYym!7h4iYBuMJk{@I^>8dro4>_2LG7b4w%S{{jH$>v_KrpP9s68O$x@BLkbVy*sX7951 zNb13Q7CJvT0f(Elfm&L`b@VbWK+6H}-wViZK^=?vE)trFsA~DmG2K1DEO!?4&gJgh z`ye;*Mr(c%zG!g0*WPvTZcF@dr>-ez{*+ih!1P6yjaZAgrpWoc)%TfUNMe;)x?dx8 zi)9z#Gf>^O@_1Y0K$j0OOCW6N?}pB>rn$z(K!(0vAg`X^^}bHS{lLX{JoJUO|8;II d?mS>#xFtW`v{i(o?}K6}$g0ZJNtu26-vC)7B2WMT literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/processConfig.h new file mode 100644 index 0000000000..89823b9d1d --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_gux_ttxux/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H +#define MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 5; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GUX_TTXUX_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P1_uux_ttxg/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..62bceaf1b9cb495c2d0055d48d2ffc861a41ebb3 GIT binary patch literal 17758 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxgg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..db89ede876ce39b43c0b3d7f0ee9831a69c54b92 GIT binary patch literal 24929 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..0acf23f492ab6d385bf797527b9d45688fb1b20a GIT binary patch literal 19456 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 L&!=$9;S0Y4;CK@0 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/processConfig.h new file mode 100644 index 0000000000..e51eb2c6c2 --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gg_ttxuux/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTXUUX_H +#define MG5_CONFIG_SIGMA_SM_GG_TTXUUX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 36; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTXUUX_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..b417fbef659905e02af8bd2fd2f1f647b1003e90 GIT binary patch literal 20542 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

rw1^OhDQ8`?+ z=Vt$VX884NMrnO@qFtI!!8h_~)wt)bhK-LzX?+}mY(DoGC&RYDI6n#e>WzZt^H|;k zz^D7ynpL27jdWB&fi;pL`E2O3mo<$ijL*E2S}MP1Md6hIvi!`oADj8&*Q!5!j0)`gqz85tA0lme**)Pvzr|x&+WYoLyhN?mBsDx~Gm-n7REr$>(PMXC zfN5Hm+8^wx!HE;A+#fQyou`#KOy%EPq4Ao^Su|h1f50ecqYkmVXi$L@KvlJDdKn%3 zDaj3Q1kgU?lM;d2cH6+186KBg4o8B^82p44PGHRvv;3Z#HES%TnrnE+w#8^BNUnph zfx{2X4kX?*$h+77CN8mA=VUlyWa_CutNMEUG+PYHar(l`s^d}?m_mGgA>WVkQwm?( zCPOK;@laE(5^0FhKpkUedTRhmy4)4^_Gd^9%w|%5IR6GC4E#RR8QG4x612Z*dB_-a z^hPUo`y5n_;>cqH!Cw5_CMKxRf@XBS*zC!jn_IJV2|@nxVaYU0x-CA*0s^i8jc);ZPoN22%KE^V-Ga}Q4KsOEk4 zScXyb&vG4u@YH6T14=9E4xL@u8kk1{!)V=$!&G&efBRIk5-=QA*onOq?~opCykkAs zT2u@*)k17w$-+T%UL%U<@n92>!IE@zo1r`AG<)QF9#@>}V2BpK62f*tvO1#f=8{oC@- zF=8WMQ|BDxygbC!hy#F5GLc#z{M;bMG^}`3PAi4}eQTJ8HYXyhq@^=2Ifvb)ku7Mx zHg*16hd)j}WXvgf*rHLmt%vD8PzLoS$fDPir^`Zh;pY3WOY(4tE>J((Sr&Egu?~q? z?3oGMj+>3sOniT>3cuYX(-T^U+%(ra_nF9%T6~TLZ~zle?@hNg@QJHQSAfMNamf>` zt0sU{_1-2{5D&tKd9PX(-e7d+v@q9Vyk*d&e;QfAR zv!{pa^J#0%n+1eVball)U!e_Vc1iBF$iF<=hgc^HMr6KG;%~9}49o`?=dABfF9wd} zcIzidKZkKfZ%A=kiSCq4Awb{`*e~CG7?ikM>#S42?i9D(#cFzP7ta{>V@zX4!U`|r z4NVVTrV7InZ}d@)Cf*nwXncadifAIGG&R+sbK#A_FO3w1j5mkoHH1zLy9CL0X91NJ zhsBrcwn}eR5T3A|T^dimE=32*HxVQA<=R3SyWb9cAS0*h&Z{*{^%{>^_#^WbB!-DT>U^G!8>PdV8viXgcxz`NFdexR@@RTS zKldN3%97VW6?qB<%E2*%fKg*BfRnAK*fy|j*0)PBS>Pbc+(X7HXX=2oTY+CQfbOE%#G!_~x2?=e#lenG92RozZ-jV6(!Sdmd}wwUWIH6j z`_(hP(Ozl@@O|%jn;CNGL!5gdOnTj=W_0&EXbgib=NG1dU`ySJxA*y9SEoddrH`e& zYN#bmymSP)v4Ix=nK~iLo1|Kj@a@?R0s-EDixdmzSQ%j&5Sjnk-tMa`0vXQ(I$}1K z)fPvqeV?b_osMTC?exl>BtrLFmk$eREUpx$#HkK)7z@|-rqHSo(9Jff!Ez_mnPn7O zSd%dP=pI#wTDEX8`054JIkws%8tOpWCCl39!z0Y;I+N|?T4-$jcz!SX32?Gv0G^gk zv*SfrS-TJK#Q^C3RY|n1U@I#%pMxlSv`(%WU+di2lu8 zldG~&sr`liBw$>XOvi42O=}xUuTH;hn(E>I611Qr@cM@;(Iue(V=athK3C=u{M*4f z`<}b_{|)?YV}_d^sUjhDQ78qiz%@}!ayh7pKkD@?AWR+4EbU#t5FXBcg|D#Z9mx7E zV&MLp>{>dNvuubOKH`)AnkM%aB4_U(fgMl{)Vk!99r6cetg}lvA3K#b>Sw^BpTY!6)~w~{E9U$*)ouIS9heOdwtAn#K5#j zuXro-MHF``0UXkt3O;NhZ>E=1Y1v_5N2CZVj`am{v zeq=9K{17KpWd!GeDar0dn5y^>9XZY7CP+vGEz@tjl=-}c;m~rK8_-yB=L{XL(WoJ1 zVMkm<(&T`m7DM7+P%!mRBe@kcRv?1XY*?5T=venbQ-H}ac~GwDsU(?T;FTA;VUXHdKOR>8w3z~UM2A=G)(hL6~tuXDHP*+7%ha6lI?Y*{PB zsp>Dw%`w_GU?d=qjAN0xoUq2~b8Y&Pre66s_1MYuwWk?O^EN=r{6zev7Q-Mlj;@ho zy_j+OZmRZeb%;d8>B~Qo@0hCUI7!=!L7Px^pnkJHMeBv>9$Ikd*w*IAs-v;i3FOMd zZjFZPblBmbG8@|6Dlu`#8}wLfmiz5tOw^M5O8D8k_J&}Y9VhCHLCk{1u3q}LU#E!E z{+OdIqhb0`&lZ2DnCzpW%42Uq(p=;;X3j;}B<eJ50b}(ZjV)%oZo3i`$<*{6z#+?PfR@k@i}6 z(rSa}B*`~W;#S>Zm4dfPLo~A9?wFKS+w>|%B~!NIZvjrD75uV68`zHO$6gQE;~K6> zZvuS`cX5huaby|{M*8eKHWldztX-wUnd{_|Odza3l+Vsyv#CUkSME3`WZp#loNo#_ z5*3=IY$a}0Zg#*}V)o)61J(0)*iIKpf2`=W@&oo}>C1l756NjdLfhKxHQ z1V%xS!@Yk=!k5Rq{}IYW*lFVepM#96s?&ePEEGWc`t(_P2&T)g{^jLK9ZNhy1g{A! zpXQ5rZBD*;CMxrz&dR5V zQW8$YEt(GdK|a_DnrTPzGM^C_C4pA;PLl_*l0BkJ=nk?0r`$*GJR0zlnd+uQeh)mr zQzz{Q`3SqLT13d0KOc#eShvkZL;L7=*;!w$^X+eOt4xB5t%7XSv83!v4sPdO!Ng%( zpy8v?PCCEySe3%J`=mSR&#{9Ab>;Y&u@<^!pD<5 z+H%e1cG%ds)GJahEGVzoDI+-dScHspVc5!6K(IdSVOV1?q;`^l}%*mZ{u=f3L3fwzWoT2QXFw`%55^L$CTgJ1FNa#1b;4QN9j1i>71i-q zn%eNgORW)dEEh$Pg?Xrapx$BR*1MzGaWlzS({q=Vq6d^Ge9V(xE*sDak>Laq~w~hNX-k2?k`XvPIY(ej~aA>fLVy zrpt!w1(42*ZleZb5cNhQXYn-6Z!d@db0Pdy1MDIOz=SG%&YJL)#Ul9klV2nAjW>-q zv_#cV5tetlg3%7^th#;uA(A*E7E7)5bKFM)x*W@UwfV){>%S-&08rL6tyExac@2?L zu-%3?DgklY5$QxmNgarHWgLbbw0gXnwW=|VT!-52|+n*zO zHIR-%ao5(#%YSa67sR!Ksx$6n@NM!yY)u`J36p>J1fH43fD`vB zvQ9txW%m;G*%pV!T7|t9W%Q+_GcgZwJ!N~X8o#I?O^>|n8I{XRY9Fb7cRWo)^syDC zo+tmR5=_MTAXuj8lR`0BXRQ50K~RM7|Iz}8QLDz3%wVnZ9x$$2q>ksJEN!$NFMT)@ z69Ro^n-h`xDH6oWo-nOG@MccKudQN1L@KY7|K`ICPyw{U5cR&SM$zEuqyMVE+k^Tx zP1@1b%O8bh|Ge2!Dc3k)^m*2&+ocF)8$)$i#Y;G2(>+7Uzdn-VVOc(n6uiGV?nd zGpvN&G}~CLy^~@``2LkE*A8u+>)wM{+@9N3DyuqTzUNQW-TIO$Av>W9z%;=QO^9&* zD6yE?mm%kXBgbX6cS?2Re&Rz89HkEYI>8-q@@_JEOfk?2DUwC#nD)t6Be0$)q$yD5 z>vYcD6w_eJ)D}vNr!sWZ3U13QQ+dLDjz_Bl4P)gM`+4vRk>i$Q1hAzFyNJjMKM$P& z&7C^3CLP&w#zeRrVWEtUH>!5PI%w}c(-H^UzccrmK>(M56umsm0%6>Q%LBUJ$-Poi zWoEmIc_2%EuM=Zva#e{nTWBB`a2iP}Josc51miFZe>3Fhb-L3$i372 z#{M{hOhnf{C%EK5ZVTqT+3rbXy&}YfSZ_OjEF$3a^Is`@=0tVW33P^ZJcPFro%p-V zXHd{PK{`RCiDkLS1b?GVm{15F2;p%_$=pt!`^z>uU%YNyZ~hv5?I|_-$t{DPkeAL4 z+SDC#38&q_XzTtio@LiRf&Z16yS?MLXZPoEsn3dP_AwIA%&OR(M``%4CKtW3Ma(!^ z+jR49glTW9NW<{={dBW)r7SrGHK*D-?Ookp7{av);T1vD_^l<^DGAPU&-~Y7Et^s9 ze}i|fj1PZ&?8tGRnIR7zRQGnx6p+tQuUJUd`E+}YO49|Az{%j*P+OWStA7VXyD5YGJcjWT_ol>EdEOk^2-#m>K_v$nd`l z7&UI!0=L31Y2)v&C?HYqfHCkdvJBALN#jaW&CfBPf;b=6G3NKE*IlN)EhwHtRBZiW zmpQ=4HEQ^uEt}p3@D~8Oq0scg1dYUAE0*0g^r~-`uP_kAM`OPoTHwR64ESw&OFM@Xw6C1V^^`VAq^yA#fFvfYP?TmZD{7`=Pz59 zA=z}&aU2RBQJWr$Y0=oocN=BUPY)126CD&Ys>FPcGIQS*K8ax)On)%{IeA1_>E~%E zey*$T@Oe%2fZJu~yQO$PF`T1W>S>go>iX2y^*W&e#XQ*d%&jU^H(cL`v3t8QG8{04 z&0?ht@B>kJS^GSWI8~DhCF$WF@hLWhrb`ICFj^>Xp<{nvzq7Ct5lAQBO(-iS89qOD z@(tS=L?3I1Wq7=JpP`d=)@v@Un-q#`=WOp&u9L;?kVaNXKe8RaIDb1I+_QCC^vL+D z{w?m&BF@$ug1UF~mgoFdEiJCbkxnh0tJv-^3u;|T%NX-7e8ip0Tj)S0^oBJB1K_eo zmX+anjS3D6Uud^eW72qMz$d+>eW>+zOFI9z@<(*8>D%u5zIR%32F?TB@!;C4u-o0$6Iau$ z!##RU&G~b>8HC?Dvver5=V+KLS-m}&8}f|M0pG&`5)tp{^&tXAkTHuXiRPkHIHguO z$g!Z&W4f>U4555}ypUZgWA*?G2de{6S>h#@a0qz?9Fs?-bV-yrh@YGu;4r=Z+**Wj z!O4T=e1nJV?(c6EGc_#Y>-&Qxm1v&Zn}Vq-+0FfItZHG(pdHz!%z`@~ z1hu9$M}yat;=fz&QxM*hb+P8v^NgjQAJFsms(KVDtTNTJ;4Q^`TDyB{jT&zPZr|Rw zex27Lz_&AaiA$%u?3QHB#NR5yXnvmYPxzAF$PyB9jsurd4R>df{Wp_Hv1#DNONBS)b1Fc#pXhI;7dX<7MY73}QsSD0~Z;VWC zpe5?S@DLf9a_pE5cE9tUXTvaItW;a;$#1)+dr=XQ4&f+;)fQ({iOvO*PlR+EbAxCv z0G2#Z`$H3Gr^ANC>3_ij_id9c5ATAiPOhb2WPUN!-H{f*#v)~T`f{$d!H^>LOG%M^ zNyJpkPYQmU06M-6#nKekM+l^vdikukQ7jQtKzp67@_XplUlBXZm?Ffltli1M z2M&vaZTSBrfmFgvr|2gGon*EBC%<1o9|lq>mTHK7^iz&zdYYg9K4V6Kx4_@!H{E?| z=LJ7~1bmHG;n(<_*DQZ7MhDo$l>BDnIvh3}PcBy@PcLVu)0?!SrguwJ2}*C5;;n>*eCwR4a(_u3zaK6QI-*h*Ch_@k{_?9s z`PtFTSvGMft?%DY%e;yP=>*6lO@*Od?VV5jMsg#(|0M~;fauEuj(5Rk^-m-lyD#>6 z9!|gfI9e_|02bPfx$Q}Px(1)dmnT+lgNZTZ&U1IL)-UsYnigy>-d}NFBF1Kp6Zq2H z-?d4GfH(%Vip`#e_QwS*IWkG5Hz}IzP*#4A8}xEUyrOu%s>i1qGSSl*;h6=|J zoLrw2nrEe@dJMPn<>f6sD0$zfG%DmMq!m*~p;P*@Kb6-?&2tZvDv&f{1t%`YD_hBI*F zqKm#><8iVSd8@@q0u=^stTu(0Q-Zd7)5O(UKx?uk7Pd?f!S{hI?MCmRPXBb2J$pFH z&cGlR?&Q(!y>_H-9w$VA23sh4^f=5Vh#C4*oi%gV6kP$&RD5&?a#{xuK;N!I+|yLN zR11a+HcX9I$Mt&0O2}{3db}L{gS_49WWJiuZc0}&16PH3r;+_Ive@j})p zg8H`tL_s{w#>*isSLA-JoR-XsQB2)E{p&F({;u|E#q&B!2J;vdKO-OFW8X9xMxKk zQ(m@ElsvfwN1`81K$xC7WdUKeTkiTztPY5`o zE>lj-WM>mH4zd?RB%q@tx7N)(%N~iMJ7T1Sf=*P;Z1AKXo;$UFw^bXRqsNKX9sYMG zQod@lESCf3#fzNBqFO<|#%iCHh+e&2HtAX7Sq5tBI&a*=R^VG?bTD{?KHbti!}Mq9V{ksEF9v)N?{2HOn>PzECRa9PP*4TB{|xA7JY0 za_OLkWzAa8|1QhrAAhl%*u| zefZAQD`m_BOsVYcU$WRjljBUR-viI|;7m+eLGVgOiE#SS6X9~tRhw(>co+i%pArol zHIV_M^=a2QXP>7g+>Dq;pE1Zje9q>Srl1O6q+FA1w_m?>0#Kg)1yQnFPS%*52T~hD z_cdcovWqYeBTGj!&on{EeMm#I0NR zteSMZjMy}ul1yF?Kj(z)+T!$GUHvR;jn&HWoZkbQOn*4e5Y@x8XfMM#&^=ycW}K{J z@7mSZEwSJ?zF<-BB+Qfg*(eEjEm(om7{8@x#)PK*dm;;uwL}6i{ibmQLO$2@6j7a>mNVo%yz4_fdjyr*F5p_q}IhRUaBS1 z{On)+Vb5}|G}aVzyG0T3g4x_z;e%NrZ)0u#yknQ(YYrYh*peAn3#d<>572b}HdVn4 zKVVIbl$fK@g*CfCPnft=JNxx|JzvI?EF;@r;-(f*?%7MD=$x~&mxM<2sRUUqOYL7- zK=Hv2Rb-^r_sWF{H#YQiQp=uHmp)Py%1mG7K*M!wmiU8e&+1^b3E0`)y|PnI=cls~ zgKLub7+&<{`c#?YmOnF2e3C&e5+>~%pvavtSGd(#oJB&_q*Lu!07IVSZv0{l|O^UD#M%7d-^k%v-a457j zfl(D$3lhk7j=od5PX7ZBu@+Q98-rhjkd%A&6Zu) zFQJ#*s8@P^u&J<17j?UP zrxMN1L7Ehh)^{FDm3X@LT>W@${LUaZRnI`C4nAH(Q$g zjX^W6fnB|bMsI}8=3{yMd~lty)}+<)Zw+`@ z`4{Nfa42m>kCc3HeX*?^v&Jp0y){+&+R@&xYD~Y!I$4n7dGgR&T|LNr77MweZ#y4@ zqD00TaEG%1vw8T$+@b=phNgOJf$R93c*gWj_GgBh?<+u*YAdBlrW;$Zhz-c=l2#># zRi^9>8%aP*a1NT#_Nac9=V}p-o-l>S4N@%n#uRe% z4-$v_HjaiGfN~lHJ*W<>W|TNm-Y`uS51utj)Rl{aI<7OC2U(c|2-V6#xLStz*XkCD z9Ld6z^e(Q9Ae<6TDJJA<#a=Z+H9`=n$Fz*~ww7fgdos^Rq$t-z)>xoYKrvk zv3Px+2;Qf_LQKLNeKwxT-WX+vHmOEwtmaXO=8R)nNIjPnq#%?8^zFn17^^7-+Hp$K z@aB})I(jAqmz=4sp7T{Z#iy{;Jfgw*4}mPa$x8tqvJo;tY|Kg90>Se8M>9 zhJ!|WS(!{2pKR|})Qry+qwSislXCeI72l*wO850>YI{nJ~Mj z*w-&lcV3n`qS+G3zsUrOvS!_Jn_)**z++q#GK5E=U8^NaDdY8k=0{W2h$Eu*X4 zDIA&}dw zB38gh8F2+O8;g-2p76?$+!%EyK;&x_Yy0Q?z++|@{QVOj(zo|5a1{Z^#*{mYChT-^ zYByK%IbabzWZ_H=<$F!cs90oOx*aDPQ@G2YL2_;aJ3)++xiI+S)*uX_9Qiy+d}(;6 zSQ7$0iw0E>E8HtJEY6j=((-uST#>}iLw5waohdl;VlFILgF%i(>;O*bdC$MEU_bGh zYm?+jKeaH9;9=rP zuQR8^!qhtwhmUP*@)F)jzx&N5G-x`iKpI80C4y=VDyv(WU03MS@Flax1p1yC9adbl z%LI)JFTwR-iFN?~(V7~kGcn^cBcN{pSpvb>mZY4L19uBm-6#UnIuSK9oxc`4GsNLq zjCXV!%?$icsws1ph&sBXL0szP0_Eba2i|xz9!gN@32`p)u(ZK8u@)!GW5Lpv{EBW= zosL924cNqr4h_SBh9j+>bAzzL(O}$hXAF8%fdWNR&}ge?(etw7xt4~ir!_hQToRDe z0d}9-@oCxh9=pw>n`Y%WLNxYR*i(tGqwb|90ASK0fIasP6td?O(Ihe<@u%(UY)}8_s!}v z|BtP8u+QBN0RJBzcbW2@`$^!oIo1A#kkPWl91~AGn)*JMDLqFgeYOx41%_l71QB1H zHwD8p)md3aWd8fPUXJF$H4dtr6KRWnyi^wt{@cNjV*J5-#lGQ2j~v+t+zp(_W9}uj zs=gsJ=KUiB*NZHR%;=0?0zs!qA<2E-HILCcr8G>RyzZZLG(k6?N2i>~jJx_M6u2jB zikcAW;|q|c%HdOGecyZ;t%RK)e8}Ou-dxwzDsJZm@dWMC zs_o+)!xNMKWeK~;J!y111 z_4yl<^8F(vG4#MGR#q?d*Gnfxb|)ogRRlxZ9oDPte{a?~4ehul>Iq!tVP{|t6e9y> zdAZr14tqC*^CKV@HvVpTH1$fNDUnh&xh;6|3jN-J2BAp!hW-^>BES1LwiJC~2yphUUeH zN@wt1O+!-S?QqTmI*IWqY;nD9M>6}{Gf-@E5}qJaO+BUcj4ZiDLSK+NmI$LZHb)yf zJb0zV^(Ygvl9xTuzFYEnO>s3fY62kmn5nlxnE8o)Yhk#631X+jM7}4KoZaI2Uk>BO z$c#V5ZShn$EaeTpo!B2O7Ah*_OU+u!Mxmjjs5UPR3r$-Rv6xa{Rg)EE2j8N7AfQK@?Rp?jqU`%fgjp$`C&AblTe7cpGxAuhod z0|yY&@mjY?-*>Uwh0QobY%?>}x-rfznhlXlKCV8eTsY0J#TVgxgswO3%EI3Q0hFLwI^a7Z%C0o?2O*(QJp7e!W7T=#>MyR8AP8!!b!%7Q0 zkWj)cl+WuPkaXi_L49M2kzVEg&-+q>BJ_zX+@sk1Pne5;l*su1(dd({3>2#WPGQ8y zalrPp&7{_N!l(F|jp5P!s!M7?Up6PUYNpB`lG%jqih8i<9Z#V5S$e?nQf85rG0 z9AUP8LnozgSp?eI$V$fu@t&6Vj4OS>Ue$E<4%7~)16rGwP)2kSURGptSLk85dDY`4 zEav1oipL+fUE5~9Mp&wSCR=UhJ;rk#D9lo+#6 zZAb%S;;CY5%BL|d;dv)hBqS`0R}ZNW6G){h7%wL$0Rk>BNcrWtaH5a%O}OE(91dlD zCTWxtVwH#lJD`vN<3n;%rP5Au8yt9sG1kPHvV+N7tx>L;#R?j-^`UnD+<0l`Y^V&T znkv*E1L|fq#1MGsz-C4%fCy~$E!RFFnlGwqEiD_j0|+SXY_W!G`+7>Q?g8jCD8zv8 zJI0`y=V4ZOzMU;vmC?Ognx9LMigfqaEfW-=tw62dbAHp{!S3 zx!UEvu6jtOjMt^1Y2yg%)MCsGRy^~b_h#nR1||lP%PrW|Lr9+E1w7;DaWk}+bj=A1 zJZd>5u&uM;rk&(dZ6VclFYQ6&G#q(bma-bg)_M(3w4A+2z{#gya=IP8Uc#YGXqDa^ z3?9w8+tlYX#8nm5q3+**?p>JQ0MaF1)_#rZcSfdMEgTgzO#7Lbbc0QYcap-qD?ngj wuPXgJ?V~!RV+{sR!5#ZUiz{O8j%Z-l96lOt_O(Fk>Ob_3dix))|0N>pU&C+)d;kCd literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/processConfig.h new file mode 100644 index 0000000000..f7b8795d98 --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gu_ttxgu/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GU_TTXGU_H +#define MG5_CONFIG_SIGMA_SM_GU_TTXGU_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 36; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GU_TTXGU_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..f10365fe0f8b7839180f46c9775d8652ee143dc9 GIT binary patch literal 20567 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_gux_ttxgux/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..da244d34ca086b6d87be0917d6d56f776646fda2 GIT binary patch literal 19683 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/processConfig.h new file mode 100644 index 0000000000..9a17b225fd --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uc_ttxuc/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_UC_TTXUC_H +#define MG5_CONFIG_SIGMA_SM_UC_TTXUC_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 7; + +} + +#endif // MG5_CONFIG_SIGMA_SM_UC_TTXUC_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..b68fcd17d9d4836111b94810c1d1314fba41ff91 GIT binary patch literal 18274 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_ucx_ttxucx/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..24af0c85c640c99e933590d6d6e72cf08a36a684 GIT binary patch literal 7487 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/processConfig.h new file mode 100644 index 0000000000..8f10a6d734 --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uu_ttxuu/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_UU_TTXUU_H +#define MG5_CONFIG_SIGMA_SM_UU_TTXUU_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 14; + +} + +#endif // MG5_CONFIG_SIGMA_SM_UU_TTXUU_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..e5baa92655aaa09406413acd395959cf8c265474 GIT binary patch literal 20883 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..c3aeba1bd6883f92fef0a9aedcb37c0cde4ca46c GIT binary patch literal 7614 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/processConfig.h new file mode 100644 index 0000000000..2dfae1920f --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxccx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_UUX_TTXCCX_H +#define MG5_CONFIG_SIGMA_SM_UUX_TTXCCX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 7; + +} + +#endif // MG5_CONFIG_SIGMA_SM_UUX_TTXCCX_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..a033774c895663d339f9642a9a0a8fa3cc184d33 GIT binary patch literal 22040 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 ZG`#U;{;6d>ZKByZJ#8bcn)~*z{|EF6S@i$_ literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..d53c251baaa8e438da15eafadc96fd2bd88ef0e7 GIT binary patch literal 21919 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 Apa1{> literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/processConfig.h new file mode 100644 index 0000000000..25081a00da --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxgg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_UUX_TTXGG_H +#define MG5_CONFIG_SIGMA_SM_UUX_TTXGG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 36; + +} + +#endif // MG5_CONFIG_SIGMA_SM_UUX_TTXGG_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..5281cf97ff83358aaf2ccdd4893924dca68a2567 GIT binary patch literal 20683 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uux_ttxuux/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..816068689ed89c116b894d83b41cd3e88b37d6e7 GIT binary patch literal 18714 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/processConfig.h new file mode 100644 index 0000000000..7adcbeb7fc --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxcx_ttxuxcx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_UXCX_TTXUXCX_H +#define MG5_CONFIG_SIGMA_SM_UXCX_TTXUXCX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 7; + +} + +#endif // MG5_CONFIG_SIGMA_SM_UXCX_TTXUXCX_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..6b16e3b82c2b65b1af5cddf60933baaf09144012 GIT binary patch literal 17830 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 HOhf(`<+>p2 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix12.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..9a97e91cb06be29ef3c2ec7e226da65b7c621d5c GIT binary patch literal 18910 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/processConfig.h new file mode 100644 index 0000000000..368fc584e6 --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P2_uxux_ttxuxux/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_UXUX_TTXUXUX_H +#define MG5_CONFIG_SIGMA_SM_UXUX_TTXUXUX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 14; + +} + +#endif // MG5_CONFIG_SIGMA_SM_UXUX_TTXUXUX_H \ No newline at end of file diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/card.png b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/card.png new file mode 100644 index 0000000000000000000000000000000000000000..e1361e8acf85923782d97063888c3c76a817c106 GIT binary patch literal 21871 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix11.png b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..17cb9b92cfc1cf933e60da7e0100c047722749fd GIT binary patch literal 25904 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix12.png b/epochX/cudacpp/smeft_gg_tttt.mad/SubProcesses/P1_gg_ttxttx/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f3bdf0b794d23d843b155cbeb14b5ba3bf1d2b GIT binary patch literal 24042 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 K)r%`W5B?6$^8KR# literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/processConfig.h b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/processConfig.h new file mode 100644 index 0000000000..998cb0ade6 --- /dev/null +++ b/epochX/cudacpp/susy_gg_t1t1.mad/SubProcesses/P1_gg_t1t1x/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_T1T1X_H +#define MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_T1T1X_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 6; + +} + +#endif // MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_T1T1X_H \ No newline at end of file diff --git a/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/processConfig.h b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/processConfig.h new file mode 100644 index 0000000000..998cb0ade6 --- /dev/null +++ b/epochX/cudacpp/susy_gg_t1t1.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_t1t1x/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_T1T1X_H +#define MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_T1T1X_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 6; + +} + +#endif // MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_T1T1X_H \ No newline at end of file diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/card.png b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/card.png new file mode 100644 index 0000000000000000000000000000000000000000..03ecfdfe1691d524e4a258a01594bb90244af5b9 GIT binary patch literal 3052 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h new file mode 100644 index 0000000000..04a79dca0d --- /dev/null +++ b/epochX/cudacpp/susy_gg_tt.mad/SubProcesses/P1_gg_ttx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_TTX_H +#define MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_TTX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 3; + +} + +#endif // MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_TTX_H \ No newline at end of file diff --git a/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/processConfig.h b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/processConfig.h new file mode 100644 index 0000000000..04a79dca0d --- /dev/null +++ b/epochX/cudacpp/susy_gg_tt.sa/SubProcesses/P1_Sigma_MSSM_SLHA2_gg_ttx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_TTX_H +#define MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_TTX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 3; + +} + +#endif // MG5_CONFIG_SIGMA_MSSM_SLHA2_GG_TTX_H \ No newline at end of file

5ZJ*)J+^;xwU8Rt~K8Qa$>NQ*9kSVTX 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 AxBvhE literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/processConfig.h new file mode 100644 index 0000000000..6724b700f9 --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_gux_ttxwmdx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_GUX_TTXWMDX_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_GUX_TTXWMDX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 12; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_GUX_TTXWMDX_H \ No newline at end of file diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix11.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a0271f745d625747bfa7387b922ad27b051927 GIT binary patch literal 20526 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix12.png b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/matrix12.png new file mode 100644 index 0000000000000000000000000000000000000000..3580d41f535e62bfd5121764c2e7037966bdaee4 GIT binary patch literal 20438 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 N(bo0+o1c8{{RcRtp$Py0 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/processConfig.h b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/processConfig.h new file mode 100644 index 0000000000..59ab03987d --- /dev/null +++ b/epochX/cudacpp/nobm_pp_ttW.mad/SubProcesses/P1_udx_ttxwpg/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_NO_B_MASS_UDX_TTXWPG_H +#define MG5_CONFIG_SIGMA_SM_NO_B_MASS_UDX_TTXWPG_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 12; + +} + +#endif // MG5_CONFIG_SIGMA_SM_NO_B_MASS_UDX_TTXWPG_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..9017b25979386db577e894d7cce56d620de1b198 GIT binary patch literal 13057 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 literal 0 HcmV?d00001 diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/processConfig.h b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/processConfig.h new file mode 100644 index 0000000000..8f6a27f796 --- /dev/null +++ b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_gg_ttx/processConfig.h @@ -0,0 +1,16 @@ +// Copyright (C) 2025 CERN and UCLouvain. +// Licensed under the GNU Lesser General Public License (version 3 or later). +// Created by: S. Roiser (May 2025) for the MG5aMC CUDACPP plugin. +// Further modified by: ... for the MG5aMC CUDACPP plugin. + + +#ifndef MG5_CONFIG_SIGMA_SM_GG_TTX_H +#define MG5_CONFIG_SIGMA_SM_GG_TTX_H 1 + +namespace processConfig { + + constexpr int ndiagrams = 3; + +} + +#endif // MG5_CONFIG_SIGMA_SM_GG_TTX_H \ No newline at end of file diff --git a/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/matrix11.png b/epochX/cudacpp/pp_tt012j.mad/SubProcesses/P0_uux_ttx/matrix11.png new file mode 100644 index 0000000000000000000000000000000000000000..e55364c1a65da4f74f335728bb74e2468730acef GIT binary patch literal 7672 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

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "

\ Postscript Diagrams for $proc\<\/A\> \ \n"; for($j=1;$j<$pages;$j++){ - print PAGE "\\"Page \ \n"; + print PAGE "\\"Page \ \n"; }#end of for # -# In case I didn't include all of the diagrams as jpeg, warn user +# In case I didn't include all of the diagrams as PNG, warn user # - if (-e "matrix$imatrix$max_jpg.jpg" ) { - print PAGE "