11const unsigned char MinorBase::ti2[8] = { 0, 1, 3, 6, 10, 15, 21, 28 };
12const unsigned char MinorBase::ti3[8] = { 0, 1, 4, 10, 20, 35, 56, 84 };
13const unsigned char MinorBase::ti4[8] = { 0, 1, 5, 15, 35, 70, 126, 210 };
14const unsigned char MinorBase::ti5[8] = { 0, 1, 6, 21, 56, 126, 252, 0 };
37 m3eps *= factor * factor;
115 while ( ic < 3 && nc < 3 )
117 if ( free[nc] == set[ic] )
119 for (
int cc = nc; cc < 3; cc++ ) { free[cc]++; }
135 : kinem( k ), pm5( mptr5 ), ps(
s ), pt(
t ), pu( u ), offs( is ) {
150 : kinem( k ), pm5( mptr5 ), ps(
s ), pt(
t ), offs( is ) {
168 : kinem( k ), pm5( mptr5 ), ps(
s ), offs( is ) {
185double Minor5::M4ii(
int u,
int v,
int i ) {
189double Minor5::M4ui(
int u,
int v,
int i ) {
193double Minor5::M4vi(
int u,
int v,
int i ) {
197double Minor5::M4uu(
int u,
int v,
int i ) {
201double Minor5::M4vu(
int u,
int v,
int i ) {
205double Minor5::M4vv(
int u,
int v,
int i ) {
213#define k5s1 s12, p3, p4, p5, s45, s34, m2, m3, m4, m5
214#define k5s2 p1, s23, p4, p5, s45, s15, m1, m3, m4, m5
215#define k5s3 p1, p2, s34, p5, s12, s15, m1, m2, m4, m5
216#define k5s4 p1, p2, p3, s45, s12, s23, m1, m2, m3, m5
217#define k5s5 p2, p3, p4, s15, s23, s34, m2, m3, m4, m1
219#define k5st12 s45, p4, p5, m3, m4, m5
220#define k5st13 s12, s34, p5, m2, m4, m5
221#define k5st14 s12, p3, s45, m2, m3, m5
222#define k5st15 p3, p4, s34, m3, m4, m2
223#define k5st23 p1, s15, p5, m1, m4, m5
224#define k5st24 p1, s23, s45, m1, m3, m5
225#define k5st25 s23, p4, s15, m3, m4, m1
226#define k5st34 p1, p2, s12, m1, m2, m5
227#define k5st35 p2, s34, s15, m2, m4, m1
228#define k5st45 p2, p3, s23, m2, m3, m1
230#define k5stu123 p5, m4, m5
231#define k5stu124 s45, m3, m5
232#define k5stu125 p4, m4, m3
233#define k5stu134 s12, m2, m5
234#define k5stu135 s34, m4, m2
235#define k5stu145 p3, m3, m2
236#define k5stu234 p1, m1, m5
237#define k5stu235 s15, m4, m1
238#define k5stu245 s23, m3, m1
239#define k5stu345 p2, m2, m1
241#define m5create4( s ) \
243 Kinem4 k4 = Kinem4( k5s##s ); \
244 Minor4::Ptr minor = Minor4::create( k4, self, s, offs ); \
245 MCache::insertMinor4( k4, minor ); \
248#define m5create3( s, t ) \
250 Kinem3 k3 = Kinem3( k5st##s##t ); \
251 Minor3::Ptr minor = Minor3::create( k3, self, s, t, offs ); \
252 MCache::INSERTMINOR3( k3, minor ); \
255#define m5create2( s, t, u ) \
257 Kinem2 k2 = Kinem2( k5stu##s##t##u ); \
258 Minor2::Ptr minor = Minor2::create( k2, self, s, t, u, offs ); \
259 MCache::INSERTMINOR2( k2, minor ); \
266Minor5::Minor5(
const Kinem5& k ) : kinem( k ), smax( 5 ), pmaxS4(), pmaxS3() {
267#ifdef USE_GOLEM_MODE_6
270 const double p1 = kinem.p1();
271 const double p2 = kinem.p2();
272 const double p3 = kinem.p3();
273 const double p4 = kinem.p4();
274 const double p5 = kinem.p5();
275 const double s12 = kinem.s12();
276 const double s23 = kinem.s23();
277 const double s34 = kinem.s34();
278 const double s45 = kinem.s45();
279 const double s15 = kinem.s15();
280 const double m1 = kinem.m1();
281 const double m2 = kinem.m2();
282 const double m3 = kinem.m3();
283 const double m4 = kinem.m4();
284 const double m5 = kinem.m5();
289 Cay[3] =
m1 + m3 - s23;
290 Cay[4] =
m2 + m3 - p3;
292 Cay[6] =
m1 + m4 - s15;
293 Cay[7] =
m2 + m4 - s34;
294 Cay[8] = m3 + m4 - p4;
296 Cay[10] =
m1 + m5 -
p1;
297 Cay[11] =
m2 + m5 - s12;
298 Cay[12] = m3 + m5 - s45;
299 Cay[13] = m4 + m5 - p5;
303 Ptr self = Ptr(
this );
341Minor5::Minor5(
const Kinem4& k ) : smax( 1 ), pmaxS4(), pmaxS3() {
342#ifdef USE_GOLEM_MODE_6
346 const double p3 = k.
p2();
347 const double p4 = k.
p3();
348 const double p5 = k.
p4();
349 const double s12 = k.
p1();
350 const double s34 = k.
s23();
351 const double s45 = k.
s12();
352 const double m2 = k.
m1();
353 const double m3 = k.
m2();
354 const double m4 = k.
m3();
355 const double m5 = k.
m4();
356 kinem =
Kinem5( 0., 0., p3, p4, p5, s12, 0., s34, s45, 0., 0.,
m2, m3, m4, m5 );
362 Cay[4] =
m2 + m3 - p3;
365 Cay[7] =
m2 + m4 - s34;
366 Cay[8] = m3 + m4 - p4;
369 Cay[11] =
m2 + m5 - s12;
370 Cay[12] = m3 + m5 - s45;
371 Cay[13] = m4 + m5 - p5;
375 Ptr self = Ptr(
this );
406void Minor5::maxCay() {
407 for (
int i = 1; i <=
DCay - 1; i++ )
409 for (
int ip = i + 1; ip <=
DCay - 1; ip++ )
411 const double m1 = kinem.mass( i );
412 const double m2 = kinem.mass( ip );
413 const double maxM =
m1 >
m2 ?
m1 :
m2;
414 pmaxM2[
im2( i, ip ) - 5] = maxM >
meps ? maxM :
meps;
418 for (
int i = 1; i <=
DCay - 1; i++ )
420 for (
int j = i; j <=
DCay - 1; j++ )
422 const double cay = fabs(
Cay[
nss( i, j )] );
423 for (
int s = 1;
s <= smax;
s++ )
425 if (
s == i ||
s == j )
continue;
426 if ( pmaxS4[
s - 1] < cay ) pmaxS4[
s - 1] = cay;
427 for (
int t =
s + 1;
t <=
DCay - 1;
t++ )
429 if (
t == i ||
t == j )
continue;
430 const int idx =
im2(
s,
t ) - 5;
431 if ( pmaxS3[idx] < cay ) pmaxS3[idx] = cay;
436 if ( not fEval[E_M1] ) { evalM1(); }
438 for (
int s = 1;
s <= smax;
s++ )
440 pmaxS4[
s - 1] = fabs( pmaxS4[
s - 1] *
M1(
s,
s ) /
M2( 0,
s, 0,
s ) );
441 for (
int t =
s + 1;
t <=
DCay - 1;
t++ )
443 const int idx =
im2(
s,
t ) - 5;
447 for (
int ii = 1; ii <=
DCay - 1; ii++ )
449 if ( i ==
s || i ==
t )
continue;
450 const double val = fabs(
M3( 0,
s,
t, ii,
s,
t ) );
459 const double maxcay3 = pmaxS3[idx];
460 const double dstst =
M2(
s,
t,
s,
t );
461 const double ds0ts0t =
M3( 0,
s,
t, 0,
s,
t );
463 pmaxS3[idx] = fabs( ( maxcay3 * dstst ) / ds0ts0t );
464 pmaxT3[idx] = fabs( ds0ts0t / ( maxcay3 *
M3( 0,
s,
t, i,
s,
t ) ) );
465 pmaxU3[idx] = fabs( dstst /
M3( 0,
s,
t, i,
s,
t ) );
482 if ( sign == 0 )
return 0;
484 int uidx =
im2( i, j );
485 int lidx =
im2( l, m );
487 return pM2[
is( uidx, lidx )] * sign;
496 if ( sign == 0 )
return 0;
498 int uidx =
im3( i, j, k );
499 int lidx =
im3( l, m,
n );
501 return pM3[
is( uidx, lidx )] * sign;
508void Minor5::evalM1() {
509 if ( not fEval[E_M2] ) { evalM2(); }
511 for (
int i = 0; i <=
DCay - 1; i++ )
513 for (
int l = 0; l <= i; l++ )
514 { pM1[
iss( l, i )] = std::numeric_limits<double>::quiet_NaN(); }
527 for (
int m = 1; m <=
DCay - 1; m++ ) { m1ele +=
M2( i, j, l, m ) *
Cay[
nss( j, m )]; }
528 pM1[
is( i, l )] = m1ele;
532 for (
int i = 1; i <= smax; i++ )
534 for (
int l = 0; l <= i; l++ )
537 for (
int m = 1; m <=
DCay - 1; m++ ) { m1ele +=
M2( i, j, l, m ); }
538 pM1[
iss( l, i )] = m1ele;
550 if ( fabs(
p1 ) > fabs(
p2 ) )
552 if ( fabs(
p1 ) > fabs( p3 ) )
554 const double diff = (
p1 -
p2 - p3 );
555 const double subs = ( -4. ) *
p2 * p3;
556 g3 = diff * diff + subs;
560 const double diff = ( p3 -
p2 -
p1 );
561 const double subs = ( -4. ) *
p2 *
p1;
562 g3 = diff * diff + subs;
567 if ( fabs(
p2 ) > fabs( p3 ) )
569 const double diff = (
p2 -
p1 - p3 );
570 const double subs = ( -4. ) *
p1 * p3;
571 g3 = diff * diff + subs;
575 const double diff = ( p3 -
p2 -
p1 );
576 const double subs = ( -4. ) *
p2 *
p1;
577 g3 = diff * diff + subs;
587void Minor5::evalM2() {
588 if ( not fEval[E_M3] ) { evalM3(); }
590 for (
int i = 0; i <=
DCay - 1; i++ )
592 for (
int j = i + 1; j <=
DCay - 1; j++ )
594 const int uidx =
im2( i, j );
595 for (
int l = 0; l <=
DCay - 1; l++ )
597 for (
int m = l + 1; m <=
DCay - 1; m++ )
599 int lidx =
im2( l, m );
600 if ( lidx > uidx )
continue;
601 pM2[
is( uidx, lidx )] = std::numeric_limits<double>::quiet_NaN();
610 for (
int j = i + 1; j <=
DCay - 1; j++ )
612 const int uidx =
im2( i, j );
613 const int k = ( j == 1 ? 2 : 1 );
614 for (
int l = 0; l <= smax; l++ )
616 for (
int m = l + 1; m <=
DCay - 1; m++ )
618 int lidx =
im2( l, m );
619 if ( lidx > uidx )
continue;
621 double m2ele =
M3( i, j, k, l, m, 0 );
622 for (
int n = 1;
n <
DCay;
n++ )
623 { m2ele +=
M3( i, j, k, l, m,
n ) *
Cay[
ns( k,
n )]; }
624 pM2[
is( uidx, lidx )] = m2ele;
630 for (
int i = 1; i <= smax; i++ )
632 for (
int j = i + 1; j <=
DCay - 1; j++ )
634 const int uidx =
im2( i, j );
635 for (
int l = 0; l <= smax; l++ )
637 for (
int m = l + 1; m <=
DCay - 1; m++ )
639 int lidx =
im2( l, m );
640 if ( lidx > uidx )
continue;
643 for (
int n = 1;
n <
DCay;
n++ ) { m2ele +=
M3( i, j, k, l, m,
n ); }
644 pM2[
is( uidx, lidx )] = m2ele;
656void Minor5::evalM3() {
658 for (
int i = 0; i <=
DCay - 1; i++ )
660 for (
int j = i + 1; j <=
DCay - 1; j++ )
662 for (
int k = j + 1; k <=
DCay - 1; k++ )
664 const int uidx =
im3( i, j, k );
665 for (
int l = 0; l <=
DCay - 1; l++ )
667 for (
int m = l + 1; m <=
DCay - 1; m++ )
669 for (
int n = m + 1;
n <=
DCay - 1;
n++ )
671 int lidx =
im3( l, m,
n );
672 if ( lidx > uidx )
continue;
673 pM3[
is( uidx, lidx )] = std::numeric_limits<double>::quiet_NaN();
684 for (
int j = i + 1; j <=
DCay - 2; j++ )
686 for (
int k = j + 1; k <=
DCay - 1; k++ )
688 const int uidx =
im3( i, j, k );
692 for (
int m = l + 1; m <=
DCay - 2; m++ )
694 for (
int n = m + 1;
n <=
DCay - 1;
n++ )
696 int lidx =
im3( l, m,
n );
697 if ( lidx > uidx )
continue;
699 int iu[3] = { i, j, k };
703 int id[3] = { l, m,
n };
707 int powsign = -2 * ( ( i + j + k + l + m +
n ) & 0x1 ) + 1;
710 pM3[
is( uidx, lidx )] =
711 powsign * ( +( +
Kay( nu[0], nd[1] ) *
Kay( nu[1], nd[2] ) -
712 Kay( nu[0], nd[2] ) *
Kay( nu[1], nd[1] ) ) *
713 Kay( nu[2], nd[0] ) +
714 ( +
Kay( nu[0], nd[2] ) *
Kay( nu[1], nd[0] ) -
715 Kay( nu[0], nd[0] ) *
Kay( nu[1], nd[2] ) ) *
716 Kay( nu[2], nd[1] ) +
717 ( +
Kay( nu[0], nd[0] ) *
Kay( nu[1], nd[1] ) -
718 Kay( nu[0], nd[1] ) *
Kay( nu[1], nd[0] ) ) *
719 Kay( nu[2], nd[2] ) );
723 for (
int l = 1; l <= smax; l++ )
725 for (
int m = l + 1; m <=
DCay - 2; m++ )
727 for (
int n = m + 1;
n <=
DCay - 1;
n++ )
729 int lidx =
im3( l, m,
n );
730 if ( lidx > uidx )
continue;
732 int iu[3] = { i, j, k };
736 int id[3] = { l, m,
n };
740 int powsign = -2 * ( ( i + j + k + l + m +
n ) & 0x1 ) + 1;
743 pM3[
is( uidx, lidx )] =
745 ( +( +
Kay( nu[0], nd[1] ) *
Kay( nu[1], nd[2] ) -
746 Kay( nu[0], nd[2] ) *
Kay( nu[1], nd[1] ) ) +
747 ( +
Kay( nu[0], nd[2] ) -
Kay( nu[1], nd[2] ) ) *
Kay( nu[2], nd[1] ) +
748 ( +
Kay( nu[1], nd[1] ) -
Kay( nu[0], nd[1] ) ) *
Kay( nu[2], nd[2] ) );
756 for (
int i = 1; i <= smax; i++ )
758 for (
int j = i + 1; j <=
DCay - 2; j++ )
760 for (
int k = j + 1; k <=
DCay - 1; k++ )
762 const int uidx =
im3( i, j, k );
766 for (
int m = l + 1; m <=
DCay - 2; m++ )
768 for (
int n = m + 1;
n <=
DCay - 1;
n++ )
770 int lidx =
im3( l, m,
n );
771 if ( lidx > uidx )
continue;
773 int iu[3] = { i, j, k };
777 int id[3] = { l, m,
n };
781 int powsign = -2 * ( ( i + j + k + l + m +
n ) & 0x1 ) + 1;
784 pM3[
is( uidx, lidx )] =
786 ( +( +
Kay( nu[1], nd[2] ) -
Kay( nu[1], nd[1] ) ) *
Kay( nu[2], nd[0] ) +
787 ( +
Kay( nu[1], nd[0] ) -
Kay( nu[1], nd[2] ) ) *
Kay( nu[2], nd[1] ) +
788 ( +
Kay( nu[1], nd[1] ) -
Kay( nu[1], nd[0] ) ) *
Kay( nu[2], nd[2] ) );
792 for (
int l = 1; l <= smax; l++ )
794 for (
int m = l + 1; m <=
DCay - 2; m++ )
796 for (
int n = m + 1;
n <=
DCay - 1;
n++ )
798 int lidx =
im3( l, m,
n );
799 if ( lidx > uidx )
continue;
801 int iu[3] = { i, j, k };
805 int id[3] = { l, m,
n };
809 int powsign = -2 * ( ( i + j + k + l + m +
n ) & 0x1 ) + 1;
812 pM3[
is( uidx, lidx )] = powsign * ( +
Kay( nu[1], nd[2] ) -
Kay( nu[1], nd[1] ) +
813 Kay( nu[2], nd[1] ) -
Kay( nu[2], nd[2] ) );
835 if ( not fEval[E_I4s +
ep] ) { I4sEval(
ep ); }
836 return pI4s[
ep][
s - 1];
838void Minor5::I4sEval(
int ep )
841 double p1 = kinem.
p1();
842 double p2 = kinem.
p2();
843 double p3 = kinem.
p3();
844 double p4 = kinem.
p4();
845 double p5 = kinem.
p5();
846 double s12 = kinem.
s12();
847 double s23 = kinem.
s23();
848 double s34 = kinem.
s34();
849 double s45 = kinem.
s45();
850 double s15 = kinem.
s15();
851 double m1 = kinem.
m1();
852 double m2 = kinem.
m2();
853 double m3 = kinem.
m3();
854 double m4 = kinem.
m4();
855 double m5 = kinem.
m5();
857 pI4s[
ep][1 - 1] =
ICache::getI4(
ep,
Kinem4( s12, p3, p4, p5, s45, s34, m5,
m2, m3, m4 ) );
860 pI4s[
ep][2 - 1] =
ICache::getI4(
ep,
Kinem4(
p1, s23, p4, p5, s45, s15, m5,
m1, m3, m4 ) );
861 pI4s[
ep][3 - 1] =
ICache::getI4(
ep,
Kinem4(
p1,
p2, s34, p5, s12, s15, m5,
m1,
m2, m4 ) );
862 pI4s[
ep][4 - 1] =
ICache::getI4(
ep,
Kinem4(
p1,
p2, p3, s45, s12, s23, m5,
m1,
m2, m3 ) );
863 pI4s[
ep][5 - 1] =
ICache::getI4(
ep,
Kinem4(
p2, p3, p4, s15, s23, s34,
m1,
m2, m3, m4 ) );
865 fEval[E_I4s +
ep] =
true;
875 if ( not fEval[E_I3st +
ep] ) { I3stEval(
ep ); }
876 int idx =
im2(
s,
t ) - 5;
877 return pI3st[
ep][idx];
880void Minor5::I3stEval(
int ep ) {
882 double p1 = kinem.
p1();
883 double p2 = kinem.
p2();
884 double p3 = kinem.
p3();
885 double p4 = kinem.
p4();
886 double p5 = kinem.
p5();
887 double s12 = kinem.
s12();
888 double s23 = kinem.
s23();
889 double s34 = kinem.
s34();
890 double s45 = kinem.
s45();
891 double s15 = kinem.
s15();
892 double m1 = kinem.
m1();
893 double m2 = kinem.
m2();
894 double m3 = kinem.
m3();
895 double m4 = kinem.
m4();
896 double m5 = kinem.
m5();
912 fEval[E_I3st +
ep] =
true;
920 assert(
t != u && u !=
s &&
s !=
t );
921 if (
ep >= 2 )
return 0;
923 if ( not fEval[E_I2stu +
ep] ) { I2stuEval(
ep ); }
924 int idx =
im3(
s,
t, u ) - 10;
925 return pI2stu[
ep][idx];
928void Minor5::I2stuEval(
int ep ) {
930 double p1 = kinem.
p1();
931 double p2 = kinem.
p2();
932 double p3 = kinem.
p3();
933 double p4 = kinem.
p4();
934 double p5 = kinem.
p5();
935 double s12 = kinem.
s12();
936 double s23 = kinem.
s23();
937 double s34 = kinem.
s34();
938 double s45 = kinem.
s45();
939 double s15 = kinem.
s15();
940 double m1 = kinem.
m1();
941 double m2 = kinem.
m2();
942 double m3 = kinem.
m3();
943 double m4 = kinem.
m4();
944 double m5 = kinem.
m5();
960 fEval[E_I2stu +
ep] =
true;
975 if (
ep != 0 )
return 0;
976 if ( not fEval[E_I4Ds +
ep] ) { I4DsEval(
ep ); }
977 return pI4Ds[
ep][
s - 1];
980void Minor5::I4DsEval(
const int ep ) {
982 for (
int s = 1;
s <= smax;
s++ )
984 const double dss =
M1(
s,
s );
985 const double d0s0s =
M2( 0,
s, 0,
s );
989 for (
int t = 1;
t <= 5;
t++ )
991 if (
t ==
s )
continue;
994 sum1 += d0s0s *
I4s(
ep,
s );
997 const double x = dss / d0s0s;
998 if ( pmaxS4[
s - 1] <=
deps1 )
1006 for (
int t = 1;
t <= 5;
t++ )
1008 if (
t ==
s )
continue;
1009 dsts0[
t] =
M2(
s,
t,
s, 0 );
1010 sum1 += dsts0[
t] *
I3Dst( 0,
s,
t );
1017 sum[0] = sump = sum1;
1019#define stepI4D( n, a, b ) \
1022 for ( int t = 1; t <= 5; t++ ) \
1024 if ( t == s ) continue; \
1025 dv += dsts0[t] * ( a * I3D##n##st( 0, s, t ) - b * I3D##n##st( 1, s, t ) ); \
1031 fabs( sum1.
imag() *
teps ) >= fabs( dv.
imag() ) ) break;
1032 sum[1] = sump = sum1;
1033 s21 = sum[1] - sum[0];
1035 stepI4D( 3, 15., 16. ) sump = sum1;
1045 ivalue = sump / d0s0s;
1047 pI4Ds[
ep][
s - 1] = ivalue;
1049 fEval[E_I4Ds +
ep] =
true;
1058 if (
s == i )
return 0;
1059 if ( not fEval[E_I4Dsi +
ep] ) { I4DsiEval(
ep ); }
1060 return pI4Dsi[
ep][i - 1][
s - 1];
1063void Minor5::I4DsiEval(
int ep ) {
1064 for (
int s = 1;
s <= smax;
s++ )
1066 for (
int i = 1; i <=
CIDX; i++ )
1068 if (
s == i )
continue;
1071 if ( pmaxS4[
s - 1] <=
deps1 ||
1072 ( fabs(
M1(
s,
s ) ) < 1e-11 && fabs(
M2( 0,
s, 0,
s ) ) > 0 ) )
1075 for (
int t = 1;
t <= 5;
t++ )
1077 if (
t ==
s )
continue;
1081 ivalue = sum1 /
M2( 0,
s, 0,
s );
1086 for (
int t = 1;
t <= 5;
t++ )
1088 if (
t ==
s )
continue;
1092 ivalue = sum1 /
M1(
s,
s );
1094 pI4Dsi[
ep][i - 1][
s - 1] = ivalue;
1097 fEval[E_I4Dsi +
ep] =
true;
1113 if (
ep == 1 )
return -0.5;
1114 else if (
ep == 2 )
return 0;
1115 if ( not fEval[E_I3Dst +
ep] ) { I3DstEval(
ep ); }
1116 int idx =
im2(
s,
t ) - 5;
1117 return pI3Dst[
ep][idx];
1120void Minor5::I3DstEval(
int ep ) {
1122 for (
int s = 1;
s <= smax;
s++ )
1124 for (
int t =
s + 1;
t <= 5;
t++ )
1126 int idx =
im2(
s,
t ) - 5;
1127 const double dstst =
M2(
s,
t,
s,
t );
1128 const double d0st0st =
M3( 0,
s,
t, 0,
s,
t );
1131 if ( pmaxT3[idx] != 0 && ( pmaxT3[idx] <=
epsir1 && pmaxU3[idx] <=
epsir1 ) )
1135 int iu[3] = { i - 1,
s - 1,
t - 1 };
1137 tswap( iu[0], iu[2], tmp );
1138 tswap( iu[1], iu[2], tmp );
1139 tswap( iu[0], iu[1], tmp );
1144 const double Dii = M4ii( u,
v, i );
1145 const double Dui = M4ui( u,
v, i );
1146 const double Dvi = M4vi( u,
v, i );
1150 ivalue = 0.5 * sum1 /
M3( 0,
s,
t, i,
s,
t );
1152 else if ( pmaxS3[idx] <=
ceps )
1155 const double x = dstst / d0st0st;
1160 for (
int u = 1; u <= 5; u++ )
1162 if ( u ==
t || u ==
s )
continue;
1163 dstust0[u] =
M3(
s,
t, u,
s,
t, 0 );
1164 sum1 += dstust0[u] *
I2Dstu( 0,
s,
t, u );
1171 sum[0] = sump = sum1;
1173#define stepI3D( n, a, b ) \
1176 for ( int u = 1; u <= 5; u++ ) \
1178 if ( u == t || u == s ) continue; \
1179 dv += dstust0[u] * ( a * I2D##n##stu( 0, s, t, u ) - b * I2D##n##stu( 1, s, t, u ) ); \
1185 fabs( sum1.
imag() *
teps ) >= fabs( dv.
imag() ) ) break;
1186 sum[1] = sump = sum1;
1187 s21 = sum[1] - sum[0];
1189 stepI3D( 3, 24., 20. ) sump = sum1;
1196 ivalue = sump / d0st0st;
1202 for (
int u = 1; u <= 5; u++ )
1204 if ( u ==
t || u ==
s )
continue;
1207 sum1 += d0st0st *
I3st(
ep,
s,
t );
1208 ivalue = sum1 / ( 2 * dstst ) - 0.5;
1210 pI3Dst[
ep][idx] = ivalue;
1213 fEval[E_I3Dst +
ep] =
true;
1221 if (
ep == 1 )
return 1. / 6.;
1222 else if (
ep == 2 )
return 0;
1223 if ( not fEval[E_I4D2s +
ep] ) { I4D2sEval(
ep ); }
1224 return pI4D2s[
ep][
s - 1];
1227void Minor5::I4D2sEval(
int ep ) {
1228 for (
int s = 1;
s <= smax;
s++ )
1230 const double dss =
M1(
s,
s );
1231 const double d0s0s =
M2( 0,
s, 0,
s );
1235 for (
int t = 1;
t <= 5;
t++ )
1237 if (
t ==
s )
continue;
1240 sum1 += d0s0s *
I4Ds(
ep,
s );
1241 ivalue = sum1 / ( 3 * dss ) + 1. / 9.;
1243 const double x = dss / d0s0s;
1244 if ( pmaxS4[
s - 1] <=
deps2 )
1252 for (
int t = 1;
t <= 5;
t++ )
1254 if (
t ==
s )
continue;
1255 dsts0[
t] =
M2(
s,
t,
s, 0 );
1263 sum[0] = sump = sum1;
1265#define stepI4D( n, a, b ) \
1268 for ( int t = 1; t <= 5; t++ ) \
1270 if ( t == s ) continue; \
1271 dv += dsts0[t] * ( a * I3D##n##st( 0, s, t ) - b * I3D##n##st( 1, s, t ) ); \
1277 fabs( sum1.
imag() *
teps ) >= fabs( dv.
imag() ) ) break;
1278 sum[1] = sump = sum1;
1279 s21 = sum[1] - sum[0];
1281 stepI4D( 4, 35., 24. ) sump = sum1;
1290 ivalue = sump / d0s0s;
1292 pI4D2s[
ep][
s - 1] = ivalue;
1294 fEval[E_I4D2s +
ep] =
true;
1309 if (
s == i )
return 0;
1310 if (
ep != 0 )
return 0;
1311 if ( not fEval[E_I4D2si +
ep] ) { I4D2siEval(
ep ); }
1312 return pI4D2si[
ep][i - 1][
s - 1];
1315void Minor5::I4D2siEval(
int ep ) {
1316 for (
int s = 1;
s <= smax;
s++ )
1318 for (
int i = 1; i <=
CIDX; i++ )
1320 if (
s == i )
continue;
1323 if ( pmaxS4[
s - 1] <=
deps2 ||
1324 ( fabs(
M1(
s,
s ) ) < 1e-11 && fabs(
M2( 0,
s, 0,
s ) ) > 0 ) )
1327 for (
int t = 1;
t <= 5;
t++ )
1329 if (
t ==
s )
continue;
1332 sum1 +=
M2( 0,
s, i,
s ) * ( -3. *
I4D2s(
ep,
s ) + 1. / 3. );
1333 ivalue = sum1 /
M2( 0,
s, 0,
s );
1338 for (
int t = 1;
t <= 5;
t++ )
1340 if (
t ==
s )
continue;
1344 ivalue = sum1 /
M1(
s,
s );
1357 pI4D2si[
ep][i - 1][
s - 1] = ivalue;
1360 fEval[E_I4D2si +
ep] =
true;
1369 assert(
s !=
t &&
s != i &&
t != i );
1370 if ( not fEval[E_I3Dsti +
ep] ) { I3DstiEval(
ep ); }
1371 int idx =
im2(
s,
t ) - 5;
1372 return pI3Dsti[
ep][i - 1][idx];
1375void Minor5::I3DstiEval(
int ep ) {
1376 for (
int i = 1; i <=
CIDX; i++ )
1378 for (
int s = 1;
s <= smax;
s++ )
1380 if ( i ==
s )
continue;
1381 for (
int t =
s + 1;
t <= 5;
t++ )
1383 if ( i ==
t )
continue;
1384 int idx =
im2(
s,
t ) - 5;
1386 const double ds0ts0t =
M3(
s, 0,
t,
s, 0,
t );
1387 if (
ep != 0 && fabs( ds0ts0t ) >
m3eps )
1389 pI3Dsti[
ep][i - 1][idx] = 0;
1396 ( ( pmaxT3[idx] == 0 || ( pmaxT3[idx] >
epsir2 || pmaxU3[idx] >
epsir2 ) ) &&
1397 pmaxS3[idx] >
ceps ) )
1401 for (
int u = 1; u <= 5; u++ )
1403 if ( u ==
t || u ==
s )
continue;
1407 ivalue = sum1 /
M2(
s,
t,
s,
t );
1412 int iu[3] = { i - 1,
s - 1,
t - 1 };
1414 tswap( iu[0], iu[2], tmp );
1415 tswap( iu[1], iu[2], tmp );
1416 tswap( iu[0], iu[1], tmp );
1430 I2stui(
ep,
s,
t, u, i,
v ) + 2. * I2stui(
ep + 1,
s,
t, u, i,
v );
1432 I2stui(
ep,
s,
t,
v, i, u ) + 2. * I2stui(
ep + 1,
s,
t,
v, i, u );
1435 const double Dii = M4ii( u,
v, i );
1436 const double Dui = M4ui( u,
v, i );
1437 const double Dvi = M4vi( u,
v, i );
1438 sum1 += +Dii * ( I3term )
1440 + Dvi * ( I2Vterm );
1444 const double Dui = M4ui( u,
v, i );
1445 const double Duu = M4uu( u,
v, i );
1446 const double Dvu = M4vu( u,
v, i );
1447 sum1 += +Dui * ( I3term )
1449 + Dvu * ( I2Vterm );
1454 const double Dvi = M4vi( u,
v, i );
1455 const double Dvu = M4vu( u,
v, i );
1456 const double Dvv = M4vv( u,
v, i );
1457 sum1 += +Dvi * ( I3term )
1459 + Dvv * ( I2Vterm );
1461 ivalue = sum1 / (
M3(
s, 0,
t,
s, j,
t ) );
1467 const double Dii = M4ii( u,
v, i );
1468 const double Dui = M4ui( u,
v, i );
1469 const double Dvi = M4vi( u,
v, i );
1473 sum1 +=
M3(
s, 0,
t,
s, i,
t ) *
1475 ivalue = sum1 / ds0ts0t;
1478 pI3Dsti[
ep][i - 1][idx] = ivalue;
1482 fEval[E_I3Dsti +
ep] =
true;
1491 if (
s == i ||
s == j )
return 0;
1492 if ( not fEval[E_I4D2sij +
ep] ) { I4D2sijEval(
ep ); }
1493 return pI4D2sij[
ep][
is( i - 1, j - 1 )][
s - 1];
1496void Minor5::I4D2sijEval(
int ep ) {
1497 for (
int s = 1;
s <= smax;
s++ )
1500 for (
int i = 1; i <=
CIDX; i++ )
1502 if (
s == i )
continue;
1503 for (
int j = i; j <=
CIDX; j++ )
1505 if (
s == j )
continue;
1508 if ( pmaxS4[
s - 1] <=
deps2 ||
1509 ( fabs(
M1(
s,
s ) ) < 1e-11 && fabs(
M2( 0,
s, 0,
s ) ) > 0 ) )
1512 for (
int t = 1;
t <= 5;
t++ )
1514 if (
t ==
s ||
t == i )
continue;
1519 ivalue = sum1 /
M2( 0,
s, 0,
s );
1524 for (
int t = 1;
t <= 5;
t++ )
1526 if (
t ==
s ||
t == i )
continue;
1531 ivalue = sum1 /
M1(
s,
s );
1533 pI4D2sij[
ep][
iss( i - 1, j - 1 )][
s - 1] = ivalue;
1537 fEval[E_I4D2sij +
ep] =
true;
1552 assert(
t != u && u !=
s &&
s !=
t );
1553 if (
ep == 2 )
return 0;
1554 if ( not fEval[E_I2Dstu +
ep] )
1556 I2DstuEval( 0,
ep, 1, 2, 3, 4, 5, kinem.p5() );
1557 I2DstuEval( 1,
ep, 1, 2, 4, 3, 5, kinem.s45() );
1558 I2DstuEval( 2,
ep, 1, 2, 5, 3, 4, kinem.p4() );
1560 I2DstuEval( 3,
ep, 1, 3, 4, 2, 5, kinem.s12() );
1561 I2DstuEval( 4,
ep, 1, 3, 5, 2, 4, kinem.s34() );
1563 I2DstuEval( 5,
ep, 1, 4, 5, 2, 3, kinem.p3() );
1567 I2DstuEval( 6,
ep, 2, 3, 4, 1, 5, kinem.p1() );
1568 I2DstuEval( 7,
ep, 2, 3, 5, 1, 4, kinem.s15() );
1570 I2DstuEval( 8,
ep, 2, 4, 5, 1, 3, kinem.s23() );
1572 I2DstuEval( 9,
ep, 3, 4, 5, 1, 2, kinem.p2() );
1575 fEval[E_I2Dstu +
ep] =
true;
1577 int idx =
im3(
s,
t, u ) - 10;
1578 return pI2Dstu[
ep][idx];
1581void Minor5::I2DstuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq ) {
1585 const double dstustu = -2 * qsq;
1587 const double msq1 = kinem.
mass( m );
1588 const double msq2 = kinem.
mass(
n );
1589 const double s_cutoff =
seps1 * pmaxM2[
im2( m,
n ) - 5];
1591 if ( fabs( dstustu ) <= s_cutoff )
1593 const double mm12 = msq1 - msq2;
1597 sum1 = -0.25 * ( msq1 + msq2 ) + 0.5 *
1609 const double ds0tu =
1611 sum1 += sumX * ds0tu;
1613 const double dsvtuY =
1615 sum1 -= sumY * dsvtuY;
1617 const double dsvtuZ =
1619 sum1 -= sumZ * dsvtuZ;
1621 sum1 /= 9 * dstustu;
1629 pI2Dstu[
ep][idx] = sum1;
1638 if (
ep == 2 )
return 0;
1639 if ( not fEval[E_I3D2st +
ep] ) { I3D2stEval(
ep ); }
1640 int idx =
im2(
s,
t ) - 5;
1641 return pI3D2st[
ep][idx];
1644void Minor5::I3D2stEval(
int ep ) {
1645 for (
int s = 1;
s <= smax;
s++ )
1647 for (
int t =
s + 1;
t <= 5;
t++ )
1649 int idx =
im2(
s,
t ) - 5;
1654 const double dstst =
M2(
s,
t,
s,
t );
1655 const double d0st0st =
M3( 0,
s,
t, 0,
s,
t );
1657 if ( pmaxT3[idx] != 0 && ( pmaxT3[idx] <=
epsir1 && pmaxU3[idx] <=
epsir1 ) )
1661 int iu[3] = { i - 1,
s - 1,
t - 1 };
1663 tswap( iu[0], iu[2], tmp );
1664 tswap( iu[1], iu[2], tmp );
1665 tswap( iu[0], iu[1], tmp );
1670 const double Dii = M4ii( u,
v, i );
1671 const double Dui = M4ui( u,
v, i );
1672 const double Dvi = M4vi( u,
v, i );
1677 ivalue = 0.25 * sum1 /
M3( 0,
s,
t, i,
s,
t );
1679 else if ( pmaxS3[idx] <=
ceps )
1682 const double x = dstst / d0st0st;
1687 for (
int u = 1; u <= 5; u++ )
1689 if ( u ==
t || u ==
s )
continue;
1690 dstust0[u] =
M3(
s,
t, u,
s,
t, 0 );
1691 sum1 += dstust0[u] *
I2D2stu( 0,
s,
t, u );
1698 sum[0] = sump = sum1;
1700#define stepI3D( n, a, b ) \
1703 for ( int u = 1; u <= 5; u++ ) \
1705 if ( u == t || u == s ) continue; \
1706 dv += dstust0[u] * ( a * I2D##n##stu( 0, s, t, u ) - b * I2D##n##stu( 1, s, t, u ) ); \
1712 fabs( sum1.
imag() *
teps ) >= fabs( dv.
imag() ) ) break;
1713 sum[1] = sump = sum1;
1714 s21 = sum[1] - sum[0];
1716 stepI3D( 4, 48., 28. ) sump = sum1;
1725 ivalue = sump / d0st0st;
1731 for (
int u = 1; u <= 5; u++ )
1733 if ( u ==
t || u ==
s )
continue;
1737 ivalue = sum1 / ( 4 * dstst ) +
I3D2st(
ep + 1,
s,
t ) * 0.5;
1743 int iu[3] = { 0,
s,
t };
1746 ivalue = (
Cay[
nss( nu[0], nu[0] )] +
Cay[
nss( nu[1], nu[1] )] +
1748 Cay[
nss( nu[0], nu[2] )] +
Cay[
nss( nu[1], nu[2] )] ) /
1751 pI3D2st[
ep][idx] = ivalue;
1754 fEval[E_I3D2st +
ep] =
true;
1762 if (
ep == 2 )
return 0;
1763 if ( not fEval[E_I4D3s +
ep] ) { I4D3sEval(
ep ); }
1764 return pI4D3s[
ep][
s - 1];
1766void Minor5::I4D3sEval(
int ep ) {
1767 for (
int s = 1;
s <= smax;
s++ )
1769 const double dss =
M1(
s,
s );
1770 const double d0s0s =
M2( 0,
s, 0,
s );
1776 for (
int t = 1;
t <= 5;
t++ )
1778 if (
t ==
s )
continue;
1782 ivalue = sum1 / ( 5 * dss ) + 2. *
I4D3s(
ep + 1,
s ) / 5.;
1784 const double x = dss / d0s0s;
1785 if ( pmaxS4[
s - 1] <=
deps3 )
1793 for (
int t = 1;
t <= 5;
t++ )
1795 if (
t ==
s )
continue;
1796 dsts0[
t] =
M2(
s,
t,
s, 0 );
1804 sum[0] = sump = sum1;
1806#define stepI4D( n, a, b ) \
1809 for ( int t = 1; t <= 5; t++ ) \
1811 if ( t == s ) continue; \
1812 dv += dsts0[t] * ( a * I3D##n##st( 0, s, t ) - b * I3D##n##st( 1, s, t ) ); \
1818 fabs( sum1.
imag() *
teps ) >= fabs( dv.
imag() ) ) break;
1819 sum[1] = sump = sum1;
1820 s21 = sum[1] - sum[0];
1822 stepI4D( 5, 63., 32. ) sump = sum1;
1833 ivalue = sump / d0s0s;
1840 for (
int i = 1; i <= 5; i++ )
1842 if ( i ==
s )
continue;
1843 for (
int j = i; j <= 5; j++ )
1845 if ( j ==
s )
continue;
1846 sum1 +=
Cay[
nss( i, j )];
1849 ivalue = -sum1 / 120.;
1851 pI4D3s[
ep][
s - 1] = ivalue;
1853 fEval[E_I4D3s +
ep] =
true;
1861 assert(
s !=
t &&
s != i &&
t != i );
1862 if (
ep == 1 )
return 1. / 6.;
1863 else if (
ep == 2 )
return 0.;
1864 if ( not fEval[E_I3D2sti +
ep] ) { I3D2stiEval(
ep ); }
1865 int idx =
im2(
s,
t ) - 5;
1866 return pI3D2sti[
ep][i - 1][idx];
1869void Minor5::I3D2stiEval(
int ep ) {
1870 for (
int i = 1; i <=
CIDX; i++ )
1872 for (
int s = 1;
s <= smax;
s++ )
1874 if ( i ==
s )
continue;
1875 for (
int t =
s + 1;
t <= 5;
t++ )
1877 if ( i ==
t )
continue;
1878 int idx =
im2(
s,
t ) - 5;
1881 if ( ( pmaxT3[idx] == 0 || ( pmaxT3[idx] >
epsir2 || pmaxU3[idx] >
epsir2 ) ) &&
1882 pmaxS3[idx] >
ceps )
1886 for (
int u = 1; u <= 5; u++ )
1888 if ( u ==
t || u ==
s )
continue;
1892 ivalue = sum1 /
M2(
s,
t,
s,
t );
1897 int iu[3] = { i - 1,
s - 1,
t - 1 };
1899 tswap( iu[0], iu[2], tmp );
1900 tswap( iu[1], iu[2], tmp );
1901 tswap( iu[0], iu[1], tmp );
1920 const double Dii = M4ii( u,
v, i );
1921 const double Dui = M4ui( u,
v, i );
1922 const double Dvi = M4vi( u,
v, i );
1923 sum1 += +Dii * ( I3term )
1925 + Dvi * ( I2Vterm );
1929 const double Dui = M4ui( u,
v, i );
1930 const double Duu = M4uu( u,
v, i );
1931 const double Dvu = M4vu( u,
v, i );
1932 sum1 += +Dui * ( I3term )
1934 + Dvu * ( I2Vterm );
1939 const double Dvi = M4vi( u,
v, i );
1940 const double Dvv = M4vv( u,
v, i );
1941 const double Dvu = M4vu( u,
v, i );
1942 sum1 += +Dvi * ( I3term )
1944 + Dvv * ( I2Vterm );
1946 ivalue = sum1 / ( 3 *
M3(
s, 0,
t,
s, j,
t ) );
1951 const double Dii = M4ii( u,
v, i );
1952 const double Dui = M4ui( u,
v, i );
1953 const double Dvi = M4vi( u,
v, i );
1958 sum1 +=
M3(
s, 0,
t,
s, i,
t ) *
1960 ivalue = sum1 /
M3(
s, 0,
t,
s, 0,
t );
1963 pI3D2sti[
ep][i - 1][idx] = ivalue;
1967 fEval[E_I3D2sti +
ep] =
true;
1975 if (
s == i )
return 0;
1976 if (
ep == 1 )
return -1. / 24.;
1977 else if (
ep == 2 )
return 0;
1978 if ( not fEval[E_I4D3si +
ep] ) { I4D3siEval(
ep ); }
1979 return pI4D3si[
ep][i - 1][
s - 1];
1982void Minor5::I4D3siEval(
int ep ) {
1983 for (
int s = 1;
s <= smax;
s++ )
1985 for (
int i = 1; i <=
CIDX; i++ )
1987 if (
s == i )
continue;
1990 if ( pmaxS4[
s - 1] <=
deps3 )
1993 for (
int t = 1;
t <= 5;
t++ )
1995 if (
t ==
s )
continue;
1999 ivalue = sum1 /
M2( 0,
s, 0,
s );
2004 for (
int t = 1;
t <= 5;
t++ )
2006 if (
t ==
s )
continue;
2010 ivalue = sum1 /
M1(
s,
s );
2012 pI4D3si[
ep][i - 1][
s - 1] = ivalue;
2015 fEval[E_I4D3si +
ep] =
true;
2023 if (
s == i ||
s == j )
return 0;
2024 else if (
ep != 0 )
return 0;
2025 if ( not fEval[E_I4D3sij +
ep] ) { I4D3sijEval(
ep ); }
2026 return pI4D3sij[
ep][
is( i - 1, j - 1 )][
s - 1];
2029void Minor5::I4D3sijEval(
int ep ) {
2030 for (
int s = 1;
s <= smax;
s++ )
2033 for (
int i = 1; i <=
CIDX; i++ )
2035 if (
s == i )
continue;
2036 for (
int j = i; j <=
CIDX; j++ )
2038 if (
s == j )
continue;
2041 if ( pmaxS4[
s - 1] <=
deps3 )
2044 for (
int t = 1;
t <= 5;
t++ )
2046 if (
t ==
s ||
t == i )
continue;
2052 ivalue = sum1 /
M2( 0,
s, 0,
s );
2057 for (
int t = 1;
t <= 5;
t++ )
2059 if (
t ==
s ||
t == i )
continue;
2064 ivalue = sum1 /
M1(
s,
s );
2066 pI4D3sij[
ep][
iss( i - 1, j - 1 )][
s - 1] = ivalue;
2070 fEval[E_I4D3sij +
ep] =
true;
2078 assert(
s !=
t &&
t != u && u !=
s &&
s != i &&
t != i && u != i );
2080 if (
ep == 2 )
return 0;
2081 if ( not fEval[E_I2Dstui +
ep] )
2083 I2DstuiEval(
ep, 1, 4, 5, 2, 3, kinem.p3() );
2084 I2DstuiEval(
ep, 1, 3, 5, 2, 4, kinem.s34() );
2085 I2DstuiEval(
ep, 1, 3, 4, 2, 5, kinem.s12() );
2086 I2DstuiEval(
ep, 1, 4, 5, 3, 2, kinem.p3() );
2087 I2DstuiEval(
ep, 1, 2, 5, 3, 4, kinem.p4() );
2088 I2DstuiEval(
ep, 1, 2, 4, 3, 5, kinem.s45() );
2089 I2DstuiEval(
ep, 1, 3, 5, 4, 2, kinem.s34() );
2090 I2DstuiEval(
ep, 1, 2, 5, 4, 3, kinem.p4() );
2091 I2DstuiEval(
ep, 1, 2, 3, 4, 5, kinem.p5() );
2092#ifdef USE_ZERO_CHORD
2093 I2DstuiEval(
ep, 1, 3, 4, 5, 2, kinem.s12() );
2094 I2DstuiEval(
ep, 1, 2, 4, 5, 3, kinem.s45() );
2095 I2DstuiEval(
ep, 1, 2, 3, 5, 4, kinem.p5() );
2100 I2DstuiEval(
ep, 3, 4, 5, 1, 2, kinem.p2() );
2101 I2DstuiEval(
ep, 2, 4, 5, 1, 3, kinem.s23() );
2102 I2DstuiEval(
ep, 2, 3, 5, 1, 4, kinem.s15() );
2103 I2DstuiEval(
ep, 2, 3, 4, 1, 5, kinem.p1() );
2104 I2DstuiEval(
ep, 3, 4, 5, 2, 1, kinem.p2() );
2105 I2DstuiEval(
ep, 2, 4, 5, 3, 1, kinem.s23() );
2106 I2DstuiEval(
ep, 2, 3, 5, 4, 1, kinem.s15() );
2107#ifdef USE_ZERO_CHORD
2108 I2DstuiEval(
ep, 2, 3, 4, 5, 1, kinem.p1() );
2112 fEval[E_I2Dstui +
ep] =
true;
2114 int ip = 15 -
s -
t - u - i;
2115 return pI2Dstui[
ep][i - 1][ip - 1];
2118void Minor5::I2DstuiEval(
int ep,
int s,
int t,
int u,
int i,
int ip,
double qsq ) {
2122 const double dstustu = -2 * qsq;
2123 const double msq1 = kinem.
mass( i );
2124 const double msq2 = kinem.
mass( ip );
2125 const double s_cutoff =
seps1 * pmaxM2[
im2( i, ip ) - 5];
2127 if ( fabs( dstustu ) <= s_cutoff )
2129 const double mm12 = msq1 - msq2;
2130 if ( fabs( mm12 ) <
meps )
2138 sum1 = ( msq1 + msq2 ) / ( 4 * msq1 - 4 * msq2 ) -
2141 ( 2 * mm12 * mm12 );
2155 if ( fabs( qsq ) <
meps && fabs( kinem.mass( i ) ) <
meps &&
2156 fabs( kinem.mass( ip ) ) <
meps )
2158 else { sum1 = -0.5; }
2160 pI2Dstui[
ep][i - 1][ip - 1] = sum1;
2169 assert(
s !=
t &&
s != i &&
s != j &&
t != i &&
t != j );
2170 if ( not fEval[E_I3D2stij +
ep] ) { I3D2stijEval(
ep ); }
2171 int idx =
im2(
s,
t ) - 5;
2172 return pI3D2stij[
ep][
is( i - 1, j - 1 )][idx];
2175void Minor5::I3D2stijEval(
int ep ) {
2176 for (
int s = 1;
s <= smax;
s++ )
2178 for (
int t =
s + 1;
t <= 5;
t++ )
2180 int idx =
im2(
s,
t ) - 5;
2182 const double ds0ts0t =
M3(
s, 0,
t,
s, 0,
t );
2183 if (
ep != 0 && fabs( ds0ts0t ) >
m3eps )
2185 for (
int ij =
iss( 1 - 1, 1 - 1 ); ij <=
iss(
CIDX - 1,
CIDX - 1 ); ij++ )
2186 { pI3D2stij[
ep][ij][idx] = 0; }
2190 const double dstst =
M2(
s,
t,
s,
t );
2192 for (
int i = 1; i <=
CIDX; i++ )
2194 if ( i ==
s || i ==
t )
continue;
2195 for (
int j = i; j <=
CIDX; j++ )
2197 if ( j ==
s || j ==
t )
continue;
2200 if ( pmaxS3[idx] >
ceps ||
ep != 0 )
2204 for (
int u = 1; u <= 5; u++ )
2206 if ( u ==
t || u ==
s || u == i )
continue;
2211 ivalue = sum1 / dstst;
2216 int iu[3] = { j - 1,
s - 1,
t - 1 };
2218 tswap( iu[0], iu[2], tmp );
2219 tswap( iu[1], iu[2], tmp );
2220 tswap( iu[0], iu[1], tmp );
2225 const double Djj = M4ii( u,
v, j );
2226 const double Duj = M4ui( u,
v, j );
2227 const double Dvj = M4vi( u,
v, j );
2228 if ( fabs( ds0ts0t ) > 0. )
2243 sum1 +=
M3(
s, 0,
t,
s, j,
t ) *
2246 ivalue = sum1 / ds0ts0t;
2250 ivalue = std::numeric_limits<double>::quiet_NaN();
2254 pI3D2stij[
ep][
iss( i - 1, j - 1 )][idx] = ivalue;
2259 fEval[E_I3D2stij +
ep] =
true;
2268 if (
s == i ||
s == j ||
s == k )
return 0;
2269 if ( not fEval[E_I4D3sijk +
ep] ) { I4D3sijkEval(
ep ); }
2270 return pI4D3sijk[
ep][
is( i - 1, j - 1, k - 1 )][
s - 1];
2273void Minor5::I4D3sijkEval(
int ep ) {
2274 for (
int s = 1;
s <= smax;
s++ )
2277 for (
int i = 1; i <=
CIDX; i++ )
2279 if ( i ==
s )
continue;
2280 for (
int j = i; j <=
CIDX; j++ )
2282 if ( j ==
s )
continue;
2283 for (
int k = j; k <=
CIDX; k++ )
2285 if ( k ==
s )
continue;
2288 if ( pmaxS4[
s - 1] <=
deps3 )
2291 for (
int t = 1;
t <= 5;
t++ )
2293 if (
s ==
t ||
t == i ||
t == j )
continue;
2300 sum1 +=
M2(
s, 0,
s, k ) *
2307 ivalue = sum1 /
M2(
s, 0,
s, 0 );
2312 for (
int t = 1;
t <= 5;
t++ )
2314 if (
t ==
s ||
t == i ||
t == j )
continue;
2319 M2(
s, i,
s, k ) *
I4D2si(
ep,
s, j ) +
M2(
s, j,
s, k ) *
I4D2si(
ep,
s, i );
2320 ivalue = sum1 /
M1(
s,
s );
2322 pI4D3sijk[
ep][
iss( i - 1, j - 1, k - 1 )][
s - 1] = ivalue;
2327 fEval[E_I4D3sijk +
ep] =
true;
2342 assert(
t != u && u !=
s &&
s !=
t );
2343 if (
ep == 2 )
return 0;
2344 if ( not fEval[E_I2D2stu +
ep] )
2346 I2D2stuEval( 0,
ep, 1, 2, 3, 4, 5, kinem.p5() );
2347 I2D2stuEval( 1,
ep, 1, 2, 4, 3, 5, kinem.s45() );
2348 I2D2stuEval( 2,
ep, 1, 2, 5, 3, 4, kinem.p4() );
2350 I2D2stuEval( 3,
ep, 1, 3, 4, 2, 5, kinem.s12() );
2351 I2D2stuEval( 4,
ep, 1, 3, 5, 2, 4, kinem.s34() );
2353 I2D2stuEval( 5,
ep, 1, 4, 5, 2, 3, kinem.p3() );
2357 I2D2stuEval( 6,
ep, 2, 3, 4, 1, 5, kinem.p1() );
2358 I2D2stuEval( 7,
ep, 2, 3, 5, 1, 4, kinem.s15() );
2360 I2D2stuEval( 8,
ep, 2, 4, 5, 1, 3, kinem.s23() );
2362 I2D2stuEval( 9,
ep, 3, 4, 5, 1, 2, kinem.p2() );
2365 fEval[E_I2D2stu +
ep] =
true;
2367 int idx =
im3(
s,
t, u ) - 10;
2368 return pI2D2stu[
ep][idx];
2371void Minor5::I2D2stuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq ) {
2375 const double dstustu = -2 * qsq;
2376 const double msq1 = kinem.
mass( m );
2377 const double msq2 = kinem.
mass(
n );
2378 const double s_cutoff =
seps1 * pmaxM2[
im2( m,
n ) - 5];
2380 if ( fabs( dstustu ) <= s_cutoff )
2382 const double mm12 = msq1 - msq2;
2383 if ( fabs( mm12 ) <
meps )
2387 sum1 = 5 * ( msq1 * msq1 + msq1 * msq2 + msq2 * msq2 ) / 36 +
2399 const double ds0tu =
2401 sum1 += sumX * ds0tu;
2403 const double dsvtuY =
2405 sum1 -= sumY * dsvtuY;
2407 const double dsvtuZ =
2409 sum1 -= sumZ * dsvtuZ;
2411 sum1 /= 25 * dstustu;
2417 const double y11 =
Cay[
nss( m, m )];
2418 const double y12 =
Cay[
nss( m,
n )];
2419 const double y22 =
Cay[
nss(
n,
n )];
2420 sum1 = ( 3 * ( y11 * ( y11 + y12 ) + ( y12 + y22 ) * y22 ) + 2 * y12 * y12 + y11 * y22 ) /
2423 pI2D2stu[
ep][idx] = sum1;
2432 if (
ep == 2 )
return 0;
2433 if ( not fEval[E_I3D3st +
ep] ) { I3D3stEval(
ep ); }
2434 int idx =
im2(
s,
t ) - 5;
2435 return pI3D3st[
ep][idx];
2438void Minor5::I3D3stEval(
int ep ) {
2439 for (
int s = 1;
s <= smax;
s++ )
2441 for (
int t =
s + 1;
t <= 5;
t++ )
2443 int idx =
im2(
s,
t ) - 5;
2448 const double dstst =
M2(
s,
t,
s,
t );
2449 const double d0st0st =
M3( 0,
s,
t, 0,
s,
t );
2451 if ( pmaxT3[idx] != 0 && ( pmaxT3[idx] <=
epsir1 && pmaxU3[idx] <=
epsir1 ) )
2455 int iu[3] = { i - 1,
s - 1,
t - 1 };
2457 tswap( iu[0], iu[2], tmp );
2458 tswap( iu[1], iu[2], tmp );
2459 tswap( iu[0], iu[1], tmp );
2464 const double Dii = M4ii( u,
v, i );
2465 const double Dui = M4ui( u,
v, i );
2466 const double Dvi = M4vi( u,
v, i );
2471 ivalue = sum1 / ( 6 *
M3( 0,
s,
t, i,
s,
t ) );
2473 else if ( pmaxS3[idx] <=
ceps )
2476 const double x = dstst / d0st0st;
2483 for (
int u = 1; u <= 5; u++ )
2485 if ( u ==
t || u ==
s )
continue;
2486 dstust0[u] =
M3(
s,
t, u,
s,
t, 0 );
2487 sum1 += dstust0[u] *
I2D3stu( 0,
s,
t, u );
2494 sum[0] = sump = sum1;
2496#define stepI3D( n, a, b ) \
2499 for ( int u = 1; u <= 5; u++ ) \
2501 if ( u == t || u == s ) continue; \
2502 dv += dstust0[u] * ( a * I2D##n##stu( 0, s, t, u ) - b * I2D##n##stu( 1, s, t, u ) ); \
2508 fabs( sum1.
imag() *
teps ) >= fabs( dv.
imag() ) ) break;
2509 sum[1] = sump = sum1;
2510 s21 = sum[1] - sum[0];
2512 stepI3D( 5, 80., 36. ) sump = sum1;
2522 ivalue = sump / d0st0st;
2528 for (
int u = 1; u <= 5; u++ )
2530 if ( u ==
t || u ==
s )
continue;
2534 ivalue = sum1 / ( 6 * dstst ) +
I3D3st(
ep + 1,
s,
t ) / 3.;
2540 int iu[3] = { 0,
s,
t };
2543 const double y11 =
Cay[
nss( nu[0], nu[0] )];
2544 const double y12 =
Cay[
nss( nu[0], nu[1] )];
2545 const double y13 =
Cay[
nss( nu[0], nu[2] )];
2546 const double y22 =
Cay[
nss( nu[1], nu[1] )];
2547 const double y23 =
Cay[
nss( nu[1], nu[2] )];
2548 const double y33 =
Cay[
nss( nu[2], nu[2] )];
2549 ivalue = -( +3 * ( y11 * ( y11 + y12 + y13 ) + y22 * ( y12 + y22 + y23 ) +
2550 y33 * ( y13 + y23 + y33 ) ) +
2551 2 * ( y12 * ( y12 + y23 ) + y13 * ( y12 + y13 ) + y23 * ( y13 + y23 ) ) +
2552 ( y11 * ( y22 + y23 ) + y22 * ( y13 + y33 ) + y33 * ( y11 + y12 ) ) ) /
2555 pI3D3st[
ep][idx] = ivalue;
2558 fEval[E_I3D3st +
ep] =
true;
2566 if (
ep == 2 )
return 0;
2567 if ( not fEval[E_I4D4s +
ep] ) { I4D4sEval(
ep ); }
2568 return pI4D4s[
ep][
s - 1];
2571void Minor5::I4D4sEval(
int ep ) {
2572 for (
int s = 1;
s <= smax;
s++ )
2574 const double dss =
M1(
s,
s );
2575 const double d0s0s =
M2( 0,
s, 0,
s );
2581 for (
int t = 1;
t <= 5;
t++ )
2583 if (
t ==
s )
continue;
2587 ivalue = sum1 / ( 7 * dss ) + 2. *
I4D4s(
ep + 1,
s ) / 7.;
2589 const double x = dss / d0s0s;
2590 if ( pmaxS4[
s - 1] <=
deps3 )
2598 for (
int t = 1;
t <= 5;
t++ )
2600 if (
t ==
s )
continue;
2601 dsts0[
t] =
M2(
s,
t,
s, 0 );
2609 sum[0] = sump = sum1;
2611#define stepI4D( n, a, b ) \
2614 for ( int t = 1; t <= 5; t++ ) \
2616 if ( t == s ) continue; \
2617 dv += dsts0[t] * ( a * I3D##n##st( 0, s, t ) - b * I3D##n##st( 1, s, t ) ); \
2623 fabs( sum1.
imag() *
teps ) >= fabs( dv.
imag() ) ) break;
2624 sum[1] = sump = sum1;
2625 s21 = sum[1] - sum[0];
2627 stepI4D( 6, 99., 40. ) sump = sum1;
2640 ivalue = sump / d0s0s;
2647 for (
int i = 1; i <= 5; i++ )
2649 if ( i ==
s )
continue;
2650 for (
int j = i; j <= 5; j++ )
2652 if ( j ==
s )
continue;
2653 for (
int k = j; k <= 5; k++ )
2655 if ( k ==
s )
continue;
2656 for (
int l = k; l <= 5; l++ )
2658 if ( l ==
s )
continue;
2666 ivalue = sum1 / 5040.;
2668 pI4D4s[
ep][
s - 1] = ivalue;
2670 fEval[E_I4D4s +
ep] =
true;
2678 if (
s == i )
return 0;
2679 if (
ep == 2 )
return 0;
2680 if ( not fEval[E_I4D4si +
ep] ) { I4D4siEval(
ep ); }
2681 return pI4D4si[
ep][i - 1][
s - 1];
2684void Minor5::I4D4siEval(
int ep ) {
2685 for (
int s = 1;
s <= smax;
s++ )
2687 for (
int i = 1; i <=
CIDX; i++ )
2689 if (
s == i )
continue;
2694 if ( pmaxS4[
s - 1] <=
deps3 )
2697 for (
int t = 1;
t <= 5;
t++ )
2699 if (
t ==
s )
continue;
2703 ivalue = sum1 /
M2( 0,
s, 0,
s );
2708 for (
int t = 1;
t <= 5;
t++ )
2710 if (
t ==
s )
continue;
2722 sum1 +=
Cay[
nss( i, i )];
2723 for (
int j = 1; j <= 5; j++ )
2725 if ( j ==
s )
continue;
2726 sum1 +=
Cay[
ns( i, j )];
2727 for (
int k = j; k <= 5; k++ )
2729 if ( k ==
s )
continue;
2730 sum1 +=
Cay[
nss( j, k )];
2733 ivalue = sum1 / 720.;
2735 pI4D4si[
ep][i - 1][
s - 1] = ivalue;
2738 fEval[E_I4D4si +
ep] =
true;
2746 assert(
s !=
t &&
s != i &&
t != i );
2747 if (
ep == 2 )
return 0.;
2748 if ( not fEval[E_I3D3sti +
ep] ) { I3D3stiEval(
ep ); }
2749 int idx =
im2(
s,
t ) - 5;
2750 return pI3D3sti[
ep][i - 1][idx];
2753void Minor5::I3D3stiEval(
int ep ) {
2754 for (
int i = 1; i <=
CIDX; i++ )
2756 for (
int s = 1;
s <= smax;
s++ )
2758 if ( i ==
s )
continue;
2759 for (
int t =
s + 1;
t <= 5;
t++ )
2761 if ( i ==
t )
continue;
2762 int idx =
im2(
s,
t ) - 5;
2767 if ( ( pmaxT3[idx] == 0 || ( pmaxT3[idx] >
epsir2 || pmaxU3[idx] >
epsir2 ) ) &&
2768 pmaxS3[idx] >
ceps )
2772 for (
int u = 1; u <= 5; u++ )
2774 if ( u ==
t || u ==
s )
continue;
2778 ivalue = sum1 /
M2(
s,
t,
s,
t );
2783 int iu[3] = { i - 1,
s - 1,
t - 1 };
2785 tswap( iu[0], iu[2], tmp );
2786 tswap( iu[1], iu[2], tmp );
2787 tswap( iu[0], iu[1], tmp );
2806 const double Dii = M4ii( u,
v, i );
2807 const double Dui = M4ui( u,
v, i );
2808 const double Dvi = M4vi( u,
v, i );
2809 sum1 += +Dii * ( I3term )
2811 + Dvi * ( I2Vterm );
2815 const double Dui = M4ui( u,
v, i );
2816 const double Duu = M4uu( u,
v, i );
2817 const double Dvu = M4vu( u,
v, i );
2818 sum1 += +Dui * ( I3term )
2820 + Dvu * ( I2Vterm );
2825 const double Dvi = M4vi( u,
v, i );
2826 const double Dvv = M4vv( u,
v, i );
2827 const double Dvu = M4vu( u,
v, i );
2828 sum1 += +Dvi * ( I3term )
2830 + Dvv * ( I2Vterm );
2832 ivalue = sum1 / ( 5 *
M3(
s, 0,
t,
s, j,
t ) );
2837 const double Dii = M4ii( u,
v, i );
2838 const double Dui = M4ui( u,
v, i );
2839 const double Dvi = M4vi( u,
v, i );
2844 sum1 +=
M3(
s, 0,
t,
s, i,
t ) *
2846 ivalue = sum1 /
M3(
s, 0,
t,
s, 0,
t );
2853 int iu[3] = { 0,
s,
t };
2856 int j = nu[1] == i ? nu[0] : nu[1];
2857 int k = nu[2] == i ? nu[0] : nu[2];
2858 ivalue = -( 3 *
Cay[
nss( i, i )] + 2 * (
Cay[
ns( i, j )] +
Cay[
ns( i, k )] ) +
2862 pI3D3sti[
ep][i - 1][idx] = ivalue;
2866 fEval[E_I3D3sti +
ep] =
true;
2874 if (
s == i ||
s == j )
return 0;
2875 if (
ep == 1 )
return ( i == j ? 1. / 60. : 1. / 120. );
2876 else if (
ep == 2 )
return 0;
2877 if ( not fEval[E_I4D4sij +
ep] ) { I4D4sijEval(
ep ); }
2878 return pI4D4sij[
ep][
is( i - 1, j - 1 )][
s - 1];
2881void Minor5::I4D4sijEval(
int ep ) {
2882 for (
int s = 1;
s <= smax;
s++ )
2885 for (
int i = 1; i <=
CIDX; i++ )
2887 if (
s == i )
continue;
2888 for (
int j = i; j <=
CIDX; j++ )
2890 if (
s == j )
continue;
2893 if ( pmaxS4[
s - 1] <=
deps3 )
2896 for (
int t = 1;
t <= 5;
t++ )
2898 if (
t ==
s ||
t == i )
continue;
2904 ivalue = sum1 /
M2( 0,
s, 0,
s );
2909 for (
int t = 1;
t <= 5;
t++ )
2911 if (
t ==
s ||
t == i )
continue;
2919 pI4D4sij[
ep][
iss( i - 1, j - 1 )][
s - 1] = ivalue;
2923 fEval[E_I4D4sij +
ep] =
true;
2931 assert(
s !=
t &&
t != u && u !=
s &&
s != i &&
t != i && u != i );
2932 if (
ep == 2 )
return 0;
2933 if ( not fEval[E_I2D2stui +
ep] )
2935 I2D2stuiEval(
ep, 1, 4, 5, 2, 3, kinem.p3() );
2936 I2D2stuiEval(
ep, 1, 3, 5, 2, 4, kinem.s34() );
2937 I2D2stuiEval(
ep, 1, 3, 4, 2, 5, kinem.s12() );
2938 I2D2stuiEval(
ep, 1, 4, 5, 3, 2, kinem.p3() );
2939 I2D2stuiEval(
ep, 1, 2, 5, 3, 4, kinem.p4() );
2940 I2D2stuiEval(
ep, 1, 2, 4, 3, 5, kinem.s45() );
2941 I2D2stuiEval(
ep, 1, 3, 5, 4, 2, kinem.s34() );
2942 I2D2stuiEval(
ep, 1, 2, 5, 4, 3, kinem.p4() );
2943 I2D2stuiEval(
ep, 1, 2, 3, 4, 5, kinem.p5() );
2944#ifdef USE_ZERO_CHORD
2945 I2D2stuiEval(
ep, 1, 3, 4, 5, 2, kinem.s12() );
2946 I2D2stuiEval(
ep, 1, 2, 4, 5, 3, kinem.s45() );
2947 I2D2stuiEval(
ep, 1, 2, 3, 5, 4, kinem.p5() );
2952 I2D2stuiEval(
ep, 3, 4, 5, 1, 2, kinem.p2() );
2953 I2D2stuiEval(
ep, 2, 4, 5, 1, 3, kinem.s23() );
2954 I2D2stuiEval(
ep, 2, 3, 5, 1, 4, kinem.s15() );
2955 I2D2stuiEval(
ep, 2, 3, 4, 1, 5, kinem.p1() );
2956 I2D2stuiEval(
ep, 3, 4, 5, 2, 1, kinem.p2() );
2957 I2D2stuiEval(
ep, 2, 4, 5, 3, 1, kinem.s23() );
2958 I2D2stuiEval(
ep, 2, 3, 5, 4, 1, kinem.s15() );
2959#ifdef USE_ZERO_CHORD
2960 I2D2stuiEval(
ep, 2, 3, 4, 5, 1, kinem.p1() );
2964 fEval[E_I2D2stui +
ep] =
true;
2966 int ip = 15 -
s -
t - u - i;
2967 return pI2D2stui[
ep][i - 1][ip - 1];
2970void Minor5::I2D2stuiEval(
int ep,
int s,
int t,
int u,
int i,
int ip,
double qsq ) {
2974 const double dstustu = -2 * qsq;
2975 const double msq1 = kinem.
mass( i );
2976 const double msq2 = kinem.
mass( ip );
2977 const double s_cutoff =
seps1 * pmaxM2[
im2( i, ip ) - 5];
2979 if ( fabs( dstustu ) <= s_cutoff )
2981 const double mm12 = msq1 - msq2;
2986 sum1 = ( 4 * msq1 * msq1 - 5 * ( msq1 + msq2 ) * msq2 ) / ( 36 * mm12 ) +
2987 ( msq1 * ( 2 * msq1 - 3 * msq2 ) *
ICache::getI1(
ep, Kinem1( msq1 ) ) +
2989 ( 6 * mm12 * mm12 );
2995 sum1 += -0.5 * msq1 * (
ICache::getI1(
ep, Kinem1( msq1 ) ) + 0.5 * msq1 );
2996 sum1 += +0.5 * msq2 * (
ICache::getI1(
ep, Kinem1( msq2 ) ) + 0.5 * msq2 );
3003 if ( fabs( qsq ) <
meps && fabs( kinem.mass( i ) ) <
meps &&
3004 fabs( kinem.mass( ip ) ) <
meps )
3006 else { sum1 = ( 3 *
Cay[
nss( i, i )] + 2 *
Cay[
ns( i, ip )] +
Cay[
nss( ip, ip )] ) / 24.; }
3008 pI2D2stui[
ep][i - 1][ip - 1] = sum1;
3016 assert(
s !=
t &&
s != i &&
s != j &&
t != i &&
t != j );
3017 if (
ep == 1 )
return ( i == j ? -1. / 12. : -1. / 24. );
3018 else if (
ep == 2 )
return 0;
3019 if ( not fEval[E_I3D3stij +
ep] ) { I3D3stijEval(
ep ); }
3020 int idx =
im2(
s,
t ) - 5;
3021 return pI3D3stij[
ep][
is( i - 1, j - 1 )][idx];
3024void Minor5::I3D3stijEval(
int ep ) {
3025 for (
int s = 1;
s <= smax;
s++ )
3027 for (
int t =
s + 1;
t <= 5;
t++ )
3029 int idx =
im2(
s,
t ) - 5;
3030 const double dstst =
M2(
s,
t,
s,
t );
3032 for (
int i = 1; i <=
CIDX; i++ )
3034 if ( i ==
s || i ==
t )
continue;
3035 for (
int j = i; j <=
CIDX; j++ )
3037 if ( j ==
s || j ==
t )
continue;
3040 if ( ( pmaxT3[idx] == 0 || ( pmaxT3[idx] >
epsir2 || pmaxU3[idx] >
epsir2 ) ) &&
3041 pmaxS3[idx] >
ceps )
3045 for (
int u = 1; u <= 5; u++ )
3047 if ( u ==
t || u ==
s || u == i )
continue;
3052 ivalue = sum1 / dstst;
3057 int iu[3] = { j - 1,
s - 1,
t - 1 };
3059 tswap( iu[0], iu[2], tmp );
3060 tswap( iu[1], iu[2], tmp );
3061 tswap( iu[0], iu[1], tmp );
3067 const double Djj = M4ii( u,
v, j );
3068 const double Duj = M4ui( u,
v, j );
3069 const double Dvj = M4vi( u,
v, j );
3088 const double Duu = M4uu( u,
v, j );
3089 const double Duv = M4vu( u,
v, j );
3099 const double Dvv = M4vv( u,
v, j );
3100 const double Dvu = M4vu( u,
v, j );
3129 const double Duu = M4uu( u,
v, j );
3130 const double Duv = M4vu( u,
v, j );
3138 const double Dvv = M4vv( u,
v, j );
3139 const double Dvu = M4vu( u,
v, j );
3150 const double Duu = M4uu( u,
v, j );
3151 const double Duv = M4vu( u,
v, j );
3159 const double Dvv = M4vv( u,
v, j );
3160 const double Dvu = M4vu( u,
v, j );
3167 ivalue = sum1 / ( 4 *
M3(
s, 0,
t,
s, k,
t ) );
3185 sum1 +=
M3(
s, 0,
t,
s, j,
t ) *
3187 ivalue = sum1 /
M3(
s, 0,
t,
s, 0,
t );
3190 pI3D3stij[
ep][
iss( i - 1, j - 1 )][idx] = ivalue;
3195 fEval[E_I3D3stij +
ep] =
true;
3203 if (
s == i ||
s == j ||
s == k )
return 0;
3204 if (
ep == 2 )
return 0;
3205 if ( not fEval[E_I4D4sijk +
ep] ) { I4D4sijkEval(
ep ); }
3206 return pI4D4sijk[
ep][
is( i - 1, j - 1, k - 1 )][
s - 1];
3209void Minor5::I4D4sijkEval(
int ep ) {
3210 for (
int s = 1;
s <= smax;
s++ )
3213 for (
int i = 1; i <=
CIDX; i++ )
3215 if ( i ==
s )
continue;
3216 for (
int j = i; j <=
CIDX; j++ )
3218 if ( j ==
s )
continue;
3219 for (
int k = j; k <=
CIDX; k++ )
3221 if ( k ==
s )
continue;
3224 if ( pmaxS4[
s - 1] <=
deps3 )
3227 for (
int t = 1;
t <= 5;
t++ )
3229 if (
s ==
t ||
t == i ||
t == j )
continue;
3235 sum1 +=
M2(
s, 0,
s, k ) *
3238 ivalue = sum1 /
M2(
s, 0,
s, 0 );
3243 for (
int t = 1;
t <= 5;
t++ )
3245 if (
t ==
s ||
t == i ||
t == j )
continue;
3250 M2(
s, i,
s, k ) *
I4D3si(
ep,
s, j ) +
M2(
s, j,
s, k ) *
I4D3si(
ep,
s, i );
3251 ivalue = sum1 /
M1(
s,
s );
3253 pI4D4sijk[
ep][
iss( i - 1, j - 1, k - 1 )][
s - 1] = ivalue;
3258 fEval[E_I4D4sijk +
ep] =
true;
3266 assert(
s !=
t &&
t != u && u !=
s &&
s != i &&
t != i && u != i &&
s != j &&
t != j &&
3268 if (
ep == 2 )
return 0;
3269 if ( not fEval[E_I2D2stuij +
ep] )
3271 I2D2stuijEval(
ep, 1, 2, 3, 4, 5, kinem.p5() );
3272 I2D2stuijEval(
ep, 1, 2, 4, 3, 5, kinem.s45() );
3273 I2D2stuijEval(
ep, 1, 2, 5, 3, 4, kinem.p4() );
3274 I2D2stuijEval(
ep, 1, 2, 5, 4, 3, kinem.p4() );
3276 I2D2stuijEval(
ep, 1, 3, 4, 2, 5, kinem.s12() );
3277 I2D2stuijEval(
ep, 1, 3, 5, 2, 4, kinem.s34() );
3278 I2D2stuijEval(
ep, 1, 3, 5, 4, 2, kinem.s34() );
3280 I2D2stuijEval(
ep, 1, 4, 5, 2, 3, kinem.p3() );
3281 I2D2stuijEval(
ep, 1, 4, 5, 3, 2, kinem.p3() );
3283#ifdef USE_ZERO_CHORD
3284 I2D2stuijEval(
ep, 1, 2, 3, 5, 4, kinem.p5() );
3285 I2D2stuijEval(
ep, 1, 2, 4, 5, 3, kinem.s45() );
3286 I2D2stuijEval(
ep, 1, 3, 4, 5, 2, kinem.s12() );
3290 I2D2stuijEval(
ep, 2, 3, 4, 1, 5, kinem.p1() );
3291 I2D2stuijEval(
ep, 2, 3, 5, 1, 4, kinem.s15() );
3292 I2D2stuijEval(
ep, 2, 3, 5, 4, 1, kinem.s15() );
3293 I2D2stuijEval(
ep, 2, 4, 5, 1, 3, kinem.s23() );
3294 I2D2stuijEval(
ep, 2, 4, 5, 3, 1, kinem.s23() );
3295 I2D2stuijEval(
ep, 3, 4, 5, 1, 2, kinem.p2() );
3296 I2D2stuijEval(
ep, 3, 4, 5, 2, 1, kinem.p2() );
3297#ifdef USE_ZERO_CHORD
3298 I2D2stuijEval(
ep, 2, 3, 4, 5, 1, kinem.p1() );
3302 fEval[E_I2D2stuij +
ep] =
true;
3304 int ip = 15 -
s -
t - u - i;
3305 return pI2D2stuij[
ep][i - 1][ip - 1][i == j ? 0 : 1];
3308void Minor5::I2D2stuijEval(
int ep,
int s,
int t,
int u,
int i,
int ip,
double qsq ) {
3313 const double dstustu = -2 * qsq;
3314 const double msq1 = kinem.
mass( i );
3315 const double msq2 = kinem.
mass( ip );
3316 const double s_cutoff =
seps2 * pmaxM2[
im2( i, ip ) - 5];
3318 if ( fabs( dstustu ) <= s_cutoff )
3320 const double mm12 = msq1 - msq2;
3321 if ( fabs( mm12 ) <
meps )
3331 ( ( -4 * msq1 * msq1 + 5 * msq1 * msq2 + 5 * msq2 * msq2 ) / 6. +
3332 ( ( msq1 * msq1 - 3 * msq1 * msq2 + 3 * msq2 * msq2 ) *
3336 ( 6. * mm12 * mm12 );
3337 sum1 = ( -( msq1 * msq1 + 10 * msq1 * msq2 + msq2 * msq2 ) / 6. +
3341 ( 6. * mm12 * mm12 );
3364 if ( fabs( qsq ) <
meps && fabs( kinem.mass( i ) ) <
meps &&
3365 fabs( kinem.mass( ip ) ) <
meps )
3376 pI2D2stuij[
ep][i - 1][ip - 1][0] = sum0;
3377 pI2D2stuij[
ep][i - 1][ip - 1][1] = sum1;
3386 assert(
s !=
t &&
s != i &&
s != j &&
s != k &&
t != i &&
t != j &&
t != k );
3387 if ( not fEval[E_I3D3stijk +
ep] ) { I3D3stijkEval(
ep ); }
3388 int idx =
im2(
s,
t ) - 5;
3389 return pI3D3stijk[
ep][
is( i - 1, j - 1, k - 1 )][idx];
3392void Minor5::I3D3stijkEval(
int ep ) {
3393 for (
int s = 1;
s <= smax;
s++ )
3395 for (
int t =
s + 1;
t <= 5;
t++ )
3397 int idx =
im2(
s,
t ) - 5;
3399 const double ds0ts0t =
M3(
s, 0,
t,
s, 0,
t );
3400 if (
ep != 0 && fabs( ds0ts0t ) >
m3eps )
3402 for (
int ijk =
iss( 1 - 1, 1 - 1, 1 - 1 ); ijk <=
iss(
CIDX - 1,
CIDX - 1,
CIDX - 1 );
3404 { pI3D3stijk[
ep][ijk][idx] = 0; }
3408 const double dstst =
M2(
s,
t,
s,
t );
3409 for (
int i = 1; i <=
CIDX; i++ )
3411 if ( i ==
s || i ==
t )
continue;
3412 for (
int j = i; j <=
CIDX; j++ )
3414 if ( j ==
s || j ==
t )
continue;
3415 for (
int k = j; k <=
CIDX; k++ )
3417 if ( k ==
s || k ==
t )
continue;
3420 if ( pmaxS3[idx] >
ceps ||
ep != 0 )
3424 for (
int u = 1; u <= 5; u++ )
3426 if ( u ==
s || u ==
t || u == i || u == j )
continue;
3427 sum1 +=
M3(
s, u,
t,
s, k,
t ) *
I2D2stuij(
ep,
s,
t, u, i, j );
3432 ivalue = sum1 / dstst;
3437 int iu[3] = { k - 1,
s - 1,
t - 1 };
3439 tswap( iu[0], iu[2], tmp );
3440 tswap( iu[1], iu[2], tmp );
3441 tswap( iu[0], iu[1], tmp );
3446 const double Dkk = M4ii( u,
v, k );
3447 const double Duk = M4ui( u,
v, k );
3448 const double Dvk = M4vi( u,
v, k );
3449 if ( fabs( ds0ts0t ) > 0. )
3500 ivalue = sum1 / ds0ts0t;
3504 ivalue = std::numeric_limits<double>::quiet_NaN();
3508 pI3D3stijk[
ep][
iss( i - 1, j - 1, k - 1 )][idx] = ivalue;
3514 fEval[E_I3D3stijk +
ep] =
true;
3523 if (
s == i ||
s == j ||
s == k ||
s == l )
return 0;
3524 if ( not fEval[E_I4D4sijkl +
ep] ) { I4D4sijklEval(
ep ); }
3525 return pI4D4sijkl[
ep][
is( i - 1, j - 1, k - 1, l - 1 )][
s - 1];
3528void Minor5::I4D4sijklEval(
int ep ) {
3529 for (
int s = 1;
s <= smax;
s++ )
3532 for (
int i = 1; i <=
CIDX; i++ )
3534 if (
s == i )
continue;
3535 for (
int j = i; j <=
CIDX; j++ )
3537 if (
s == j )
continue;
3538 for (
int k = j; k <=
CIDX; k++ )
3540 if (
s == k )
continue;
3541 for (
int l = k; l <=
CIDX; l++ )
3543 if (
s == l )
continue;
3546 if ( pmaxS4[
s - 1] <=
deps3 )
3549 for (
int t = 1;
t <= 5;
t++ )
3551 if (
s ==
t ||
t == i ||
t == j ||
t == k )
continue;
3552 sum1 +=
M3(
s, 0,
t,
s, 0, l ) *
I3D3stijk(
ep,
s,
t, i, j, k );
3566 ivalue = sum1 /
M2(
s, 0,
s, 0 );
3571 for (
int t = 1;
t <= 5;
t++ )
3573 if (
t ==
s ||
t == i ||
t == j ||
t == k )
continue;
3580 ivalue = sum1 /
M1(
s,
s );
3582 pI4D4sijkl[
ep][
iss( i - 1, j - 1, k - 1, l - 1 )][
s - 1] = ivalue;
3588 fEval[E_I4D4sijkl +
ep] =
true;
std::complex< double > ncomplex
double imag(const EvtComplex &c)
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
static ncomplex getI2(int ep, const Kinem2 &k)
static ncomplex getI4(int ep, const Kinem4 &k)
static ncomplex getI3(int ep, const Kinem3 &k)
static ncomplex getI1(int ep, const Kinem1 &k)
ncomplex I2stu(int ep, int s, int t, int u)
double M2(int i, int j, int l, int m) PURE
ncomplex I2D2stui(int ep, int s, int t, int u, int i)
ncomplex I4D3sijk(int ep, int s, int i, int j, int k)
ncomplex I4D3s(int ep, int s)
ncomplex I3st(int ep, int s, int t)
ncomplex I2D3stu(int ep, int s, int t, int u)
ncomplex I4D2si(int ep, int s, int i)
ncomplex I3D3stijk(int ep, int s, int t, int i, int j, int k)
ncomplex I4D3sij(int ep, int s, int i, int j)
ncomplex I3Dsti(int ep, int s, int t, int i)
ncomplex I3D3sti(int ep, int s, int t, int i)
ncomplex I3D2sti(int ep, int s, int t, int i)
ncomplex I3D2stij(int ep, int s, int t, int i, int j)
ncomplex I4D4sijk(int ep, int s, int i, int j, int k)
ncomplex I4s(int ep, int s)
double M1(int i, int l) PURE
double gram3(double p1, double p2, double p3) PURE
ncomplex I4D3si(int ep, int s, int i)
ncomplex I3D3st(int ep, int s, int t)
ncomplex I4D2sij(int ep, int s, int i, int j)
ncomplex I4D4sij(int ep, int s, int i, int j)
ncomplex I2D2stuij(int ep, int s, int t, int u, int i, int j)
ncomplex I4D4si(int ep, int s, int i)
ncomplex I4Ds(int ep, int s)
ncomplex I2D2stu(int ep, int s, int t, int u)
ncomplex I2Dstui(int ep, int s, int t, int u, int i)
ncomplex I4D4s(int ep, int s)
ncomplex I4D4sijkl(int ep, int s, int i, int j, int k, int l)
ncomplex I4Dsi(int ep, int s, int i)
ncomplex I2Dstu(int ep, int s, int t, int u)
double M3(int i, int j, int k, int l, int m, int n) PURE
ncomplex I3D4st(int ep, int s, int t)
ncomplex I3D2st(int ep, int s, int t)
ncomplex I3D3stij(int ep, int s, int t, int i, int j)
ncomplex I4D2s(int ep, int s)
ncomplex I3Dst(int ep, int s, int t)
static const double epsir1
static int iss(int i, int j) CONST
static void Rescale(double factor)
static const double seps1
static const unsigned char idxtbl[64]
static void freeidxM3(int set[], int free[])
static int signM3ud(int i, int j, int k, int l, int m, int n) CONST
static int nss(int i, int j) CONST
static const double deps2
static int im2(int i, int j) CONST
static const double epsir2
static const double seps2
static int is(int i, int j) CONST
static int signM2ud(int i, int j, int l, int m) CONST
static const double deps3
static const double deps1
static int im3(int i, int j, int k) CONST
double Kay(int i, int j) PURE
double Cay[(DCay - 1) *(DCay)/2]
#define m5create2(s, t, u)