89 G4double*
const alg = simulator->alg;
94 der[13] = coeff * (alg[2] * x[16] - alg[1] * x[20]);
95 der[14] = ((alg[2] * x[17] - x[21] * alg[1]) * coeff) / 2;
96 der[15] = (coeff * (alg[2] * x[18] - x[22] * alg[1])) / 3;
98 der[17] = coeff * (alg[0] * x[20] - alg[2] * x[12]);
99 der[18] = ((alg[0] * x[21] - alg[2] * x[13]) * coeff) / 2;
100 der[19] = (coeff * (alg[0] * x[22] - alg[2] * x[14])) / 3;
102 der[21] = coeff * (alg[1] * x[12] - alg[0] * x[16]);
103 der[22] = (coeff * (x[13] * alg[1] - alg[0] * x[17])) / 2;
104 der[23] = (coeff * (alg[1] * x[14] - x[18] * alg[0])) / 3;
107 der[13] = coeff * (alg[2] * x[16] - alg[1] * x[20]);
108 der[14] = ((alg[2] * x[17] - x[21] * alg[1]) * coeff) / 2;
109 der[15] = (coeff * (alg[2] * x[18] - x[22] * alg[1])) / 3;
111 der[17] = coeff * (alg[0] * x[20] - alg[2] * x[12]);
112 der[18] = ((alg[0] * x[21] - alg[2] * x[13]) * coeff) / 2;
113 der[19] = (coeff * (alg[0] * x[22] - alg[2] * x[14])) / 3;
115 der[21] = coeff * (alg[1] * x[12] - alg[0] * x[16]);
116 der[22] = (coeff * (x[13] * alg[1] - alg[0] * x[17])) / 2;
117 der[23] = (coeff * (alg[1] * x[14] - x[18] * alg[0])) / 3;
120 der[13] = coeff * (alg[2] * x[16] - alg[1] * x[20]);
121 der[14] = ((alg[2] * x[17] - x[21] * alg[1]) * coeff) / 2;
122 der[15] = (coeff * (alg[2] * x[18] - x[22] * alg[1])) / 3;
124 der[17] = coeff * (alg[0] * x[20] - alg[2] * x[12]);
125 der[18] = ((alg[0] * x[21] - alg[2] * x[13]) * coeff) / 2;
126 der[19] = (coeff * (alg[0] * x[22] - alg[2] * x[14])) / 3;
128 der[21] = coeff * (alg[1] * x[12] - alg[0] * x[16]);
129 der[22] = (coeff * (x[13] * alg[1] - alg[0] * x[17])) / 2;
130 der[23] = (coeff * (alg[1] * x[14] - x[18] * alg[0])) / 3;
137 der[17] = coeff * (alg[0] * x[20] - alg[2] * x[12]);
138 der[18] = ((alg[0] * x[21] - alg[2] * x[13]) * coeff) / 2;
139 der[19] = (coeff * (alg[0] * x[22] - alg[2] * x[14])) / 3;
141 der[21] = coeff * (alg[1] * x[12] - alg[0] * x[16]);
142 der[22] = (coeff * (x[13] * alg[1] - alg[0] * x[17])) / 2;
143 der[23] = (coeff * (alg[1] * x[14] - x[18] * alg[0])) / 3;
150 der[13] = coeff * (alg[2] * x[16] - alg[1] * x[20]);
151 der[14] = ((alg[2] * x[17] - x[21] * alg[1]) * coeff) / 2;
152 der[15] = (coeff * (alg[2] * x[18] - x[22] * alg[1])) / 3;
154 der[21] = coeff * (alg[1] * x[12] - alg[0] * x[16]);
155 der[22] = (coeff * (x[13] * alg[1] - alg[0] * x[17])) / 2;
156 der[23] = (coeff * (alg[1] * x[14] - x[18] * alg[0])) / 3;
163 der[13] = coeff * (alg[2] * x[16] - alg[1] * x[20]);
164 der[14] = ((alg[2] * x[17] - x[21] * alg[1]) * coeff) / 2;
165 der[15] = (coeff * (alg[2] * x[18] - x[22] * alg[1])) / 3;
167 der[17] = coeff * (alg[0] * x[20] - alg[2] * x[12]);
168 der[18] = ((alg[0] * x[21] - alg[2] * x[13]) * coeff) / 2;
169 der[19] = (coeff * (alg[0] * x[22] - alg[2] * x[14])) / 3;
313 static const G4double sqrt3 = std::sqrt(3);
315 if ((coeff[3] == 0) || (1000 * std::fabs(coeff[3]) < std::fabs(coeff[2])))
319 else if (coeff[0] == 0)
323 mpr = -coeff[2] / coeff[3];
336 G4double val = coeff[2] / 3 / coeff[3];
337 G4double cf32 = coeff[3] * coeff[3];
338 G4double cf22 = coeff[2] * coeff[2];
340 G4double denr = 6 * coeff[3] * denq;
341 G4double rcomm = 9 * coeff[3] * coeff[2] * coeff[1] - 2 * cf22 * coeff[2];
343 q = (3 * coeff[3] * coeff[1] - cf22) / denq;
346 r = (rcomm - 27 * cf32 * coeff[0]) / denr;
353 sd = std::sqrt(disc);
358 sx = -std::cbrt(std::fabs(rsd));
365 t = -std::cbrt(std::fabs(rsd));
370 if (r1 > 0) { mpr = r1; }
375 G4double rho, th, rho13, costh3, sinth3, spt, smti32, r1;
376 rho = std::sqrt(-q3);
377 th = std::acos(r / rho);
378 rho13 = std::cbrt(rho);
379 costh3 = std::cos(th / 3);
380 sinth3 = std::sin(th / 3);
381 spt = rho13 * 2 * costh3;
382 smti32 = -rho13 * sinth3 * sqrt3;
384 if (r1 > 0) { mpr = r1; }
385 r1 = -spt / 2 - val + smti32;
386 if ((r1 > 0) && (r1 < mpr)) { mpr = r1; }
387 r1 = r1 - 2 * smti32;
388 if ((r1 > 0) && (r1 < mpr)) { mpr = r1; }
400 if (coeff[2] == 0 || (1000 * std::fabs(coeff[2])) < std::fabs(coeff[1]))
408 mpr = -coeff[0] / coeff[1];
409 mpr2 = -cf0Alt / coeff[1];
410 if (mpr < 0 || (mpr2 > 0 && mpr2 < mpr)) { mpr = mpr2; }
417 G4double cf1_2 = coeff[1] * coeff[1];
419 G4double disc1 = cf1_2 - cf2_4 * coeff[0];
420 G4double disc2 = cf1_2 - cf2_4 * cf0Alt;
423 if (
unlikely(disc1 < 0 && disc2 < 0))
430 sd = std::sqrt(disc1);
431 r1 = (-coeff[1] + sd) / cf2_d2;
437 r1 = (-coeff[1] - sd) / cf2_d2;
438 if ((r1 > 0) && (r1 < mpr)) { mpr = r1; }
443 sd = std::sqrt(disc2);
444 r1 = (-coeff[1] + sd) / cf2_d2;
450 r1 = (-coeff[1] - sd) / cf2_d2;
451 if ((r1 > 0) && (r1 < mpr)) { mpr = r1; }
456 sd1 = std::sqrt(disc1);
457 sd2 = std::sqrt(disc2);
458 r1 = (-coeff[1] + sd1) / cf2_d2;
459 r2 = (-coeff[1] + sd2) / cf2_d2;
466 r1 = (-coeff[1] - sd1) / cf2_d2;
467 if ((r1 > 0) && (r1 < mpr)) { mpr = r1; }
469 if (r2 > 0 && r2 < mpr) { mpr = r2; }
470 r2 = (-coeff[1] - sd2) / cf2_d2;
471 if ((r2 > 0) && (r2 < mpr)) { mpr = r2; }
481 static const G4double sqrt3 = std::sqrt(3);
483 if ((coeff[3] == 0) || (1000 * std::fabs(coeff[3]) < std::fabs(coeff[2])))
487 else if (coeff[0] == 0)
495 mpr2 = -coeff[2] / coeff[3];
505 if (mpr2 > 0 && mpr2 < mpr) { mpr = mpr2; }
507 else if (cf0Alt == 0)
514 mpr2 = -coeff[2] / coeff[3];
524 if (mpr2 > 0 && mpr2 < mpr) { mpr = mpr2; }
528 G4double q, r, rAlt, disc, discAlt, q3;
529 G4double val = coeff[2] / 3 / coeff[3];
530 G4double cf32 = coeff[3] * coeff[3];
531 G4double cf22 = coeff[2] * coeff[2];
533 G4double denr = 6 * coeff[3] * denq;
534 G4double rcomm = 9 * coeff[3] * coeff[2] * coeff[1] - 2 * cf22 * coeff[2];
536 q = (3 * coeff[3] * coeff[1] - cf22) / denq;
539 r = (rcomm - 27 * cf32 * coeff[0]) / denr;
540 rAlt = (rcomm - 27 * cf32 * cf0Alt) / denr;
543 discAlt = q3 + rAlt * rAlt;
549 sd = std::sqrt(disc);
554 sx = -std::cbrt(std::fabs(rsd));
561 t = -std::cbrt(std::fabs(rsd));
566 if (r1 > 0) { mpr = r1; }
570 G4double sdAlt, sAlt, tAlt, r1Alt, rsdAlt;
571 sdAlt = std::sqrt(discAlt);
572 rsdAlt = rAlt + sdAlt;
574 sAlt = std::cbrt(rsdAlt);
576 sAlt = -std::cbrt(std::fabs(rsdAlt));
579 rsdAlt = rAlt - sdAlt;
581 tAlt = std::cbrt(rsdAlt);
583 tAlt = -std::cbrt(std::fabs(rsdAlt));
586 r1Alt = sAlt + tAlt - val;
588 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
592 G4double rho, th, rho13, costh3, sinth3, spt, smti32, r1Alt;
594 rho = std::sqrt(-q3);
595 th = std::acos(rAlt / rho);
596 rho13 = std::cbrt(rho);
597 costh3 = std::cos(th / 3);
598 sinth3 = std::sin(th / 3);
599 spt = rho13 * 2 * costh3;
600 smti32 = -rho13 * sinth3 * sqrt3;
602 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
603 r1Alt = -spt / 2 - val + smti32;
604 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
605 r1Alt = r1Alt - 2 * smti32;
606 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
611 G4double rho, th, rho13, costh3, sinth3, spt, smti32, r1;
613 rho = std::sqrt(-q3);
614 th = std::acos(r / rho);
615 rho13 = std::cbrt(rho);
616 costh3 = std::cos(th / 3);
617 sinth3 = std::sin(th / 3);
618 spt = rho13 * 2 * costh3;
619 smti32 = -rho13 * sinth3 * sqrt3;
621 if (r1 > 0) { mpr = r1; }
622 r1 = -spt / 2 - val + smti32;
623 if ((r1 > 0) && (r1 < mpr)) { mpr = r1; }
624 r1 = r1 - 2 * smti32;
625 if ((r1 > 0) && (r1 < mpr)) { mpr = r1; }
629 G4double sdAlt, sAlt, tAlt, r1Alt, rsdAlt;
630 sdAlt = std::sqrt(discAlt);
631 rsdAlt = rAlt + sdAlt;
633 sAlt = std::cbrt(rsdAlt);
635 sAlt = -std::cbrt(std::fabs(rsdAlt));
638 rsdAlt = rAlt - sdAlt;
640 tAlt = std::cbrt(rsdAlt);
642 tAlt = -std::cbrt(std::fabs(rsdAlt));
645 r1Alt = sAlt + tAlt - val;
647 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
651 G4double thAlt, costh3Alt, sinth3Alt, sptAlt, smti32Alt, r1Alt;
652 thAlt = std::acos(rAlt / rho);
653 costh3Alt = std::cos(thAlt / 3);
654 sinth3Alt = std::sin(thAlt / 3);
655 sptAlt = rho13 * 2 * costh3Alt;
656 smti32Alt = -rho13 * sinth3Alt * sqrt3;
657 r1Alt = sptAlt - val;
658 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
659 r1Alt = -sptAlt / 2 - val + smti32Alt;
660 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
661 r1Alt = r1Alt - 2 * smti32Alt;
662 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }