479 {
481 static const G4double sqrt3 = std::sqrt(3);
482
483 if ((coeff[3] == 0) || (1000 * std::fabs(coeff[3]) < std::fabs(coeff[2])))
484 {
486 }
487 else if (coeff[0] == 0)
488 {
492
493 if (coeff[1] == 0)
494 {
496 }
497 else
498 {
503 }
504
505 if (mpr2 > 0 && mpr2 < mpr) { mpr = mpr2; }
506 }
507 else if (cf0Alt == 0)
508 {
511
512 if (coeff[1] == 0)
513 {
515 }
516 else
517 {
522 }
523
524 if (mpr2 > 0 && mpr2 < mpr) { mpr = mpr2; }
525 }
526 else
527 {
528 G4double q, r, rAlt, disc, discAlt, q3;
535
537 q3 = q * q * q;
538
539 r = (rcomm - 27 * cf32 *
coeff[0]) / denr;
540 rAlt = (rcomm - 27 * cf32 * cf0Alt) / denr;
541
542 disc = q3 + r * r;
543 discAlt = q3 + rAlt * rAlt;
545
546 if (disc >= 0)
547 {
549 sd = std::sqrt(disc);
550 rsd = r + sd;
551 if (rsd > 0) {
552 sx = std::cbrt(rsd);
553 } else {
554 sx = -std::cbrt(std::fabs(rsd));
555 }
556
557 rsd = r - sd;
558 if (rsd > 0) {
559 t = std::cbrt(rsd);
560 } else {
561 t = -std::cbrt(std::fabs(rsd));
562 }
563
564 r1 = sx + t - val;
565
566 if (r1 > 0) { mpr = r1; }
567
568 if (discAlt >= 0)
569 {
570 G4double sdAlt, sAlt, tAlt, r1Alt, rsdAlt;
571 sdAlt = std::sqrt(discAlt);
572 rsdAlt = rAlt + sdAlt;
573 if (rsdAlt > 0) {
574 sAlt = std::cbrt(rsdAlt);
575 } else {
576 sAlt = -std::cbrt(std::fabs(rsdAlt));
577 }
578
579 rsdAlt = rAlt - sdAlt;
580 if (rsdAlt > 0) {
581 tAlt = std::cbrt(rsdAlt);
582 } else {
583 tAlt = -std::cbrt(std::fabs(rsdAlt));
584 }
585
586 r1Alt = sAlt + tAlt - val;
587
588 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
589 }
590 else
591 {
592 G4double rho, th, rho13, costh3, sinth3, spt, smti32, r1Alt;
593
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;
601 r1Alt = spt - val;
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; }
607 }
608 }
609 else
610 {
611 G4double rho, th, rho13, costh3, sinth3, spt, smti32, r1;
612
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;
620 r1 = spt - val;
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; }
626
627 if (discAlt >= 0)
628 {
629 G4double sdAlt, sAlt, tAlt, r1Alt, rsdAlt;
630 sdAlt = std::sqrt(discAlt);
631 rsdAlt = rAlt + sdAlt;
632 if (rsdAlt > 0) {
633 sAlt = std::cbrt(rsdAlt);
634 } else {
635 sAlt = -std::cbrt(std::fabs(rsdAlt));
636 }
637
638 rsdAlt = rAlt - sdAlt;
639 if (rsdAlt > 0) {
640 tAlt = std::cbrt(rsdAlt);
641 } else {
642 tAlt = -std::cbrt(std::fabs(rsdAlt));
643 }
644
645 r1Alt = sAlt + tAlt - val;
646
647 if (r1Alt > 0 && r1Alt < mpr) { mpr = r1Alt; }
648 }
649 else
650 {
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; }
663 }
664 }
665 }
666
667 return mpr;
668 }
G4double min_pos_root_3(G4double *coeff)
G4double min_pos_root_2_alt(G4double *coeff, G4double cf0Alt)