506
507
508
509#include "implicit_f.inc"
510
511
512
513#include "mvsiz_p.inc"
514
515
516
517 INTEGER NINDX, INDEX(*), SIZE
519 . sig(SIZE,*), val(3,*), vec(9,*)
520
521
522
523 INTEGER I, L, N, II, NN, LMAX, LMAXV(MVSIZ),
524 . NINDEX1, NINDEX2, NINDEX3,
525 . (MVSIZ), INDEX2(MVSIZ), INDEX3(MVSIZ)
527 . cs(6), str(3,mvsiz), a(3,3,mvsiz), v(3,3,mvsiz), b(3,3,mvsiz),
528 . xmag(3,mvsiz), pr, aa, bb, aaa(mvsiz),
529 . cc, angp, dd, ftpi, ttpi, strmax,
530 . tol1(mvsiz), tol2(mvsiz), xmaxv(mvsiz), norminf(mvsiz),
531 . vmag, s11,
532 . s21, s31, s12, s22, s32, s13, s23, s33, a11, a12, a13, a21,
533 . a22, a23, a31, a32, a33,
534 . mdemi, xmaxinv, flm
535 REAL FLMIN
536
537
538
539
540
541
542 mdemi = -half
543 ttpi = acos(mdemi)
544 ftpi = two*ttpi
545
547 flm = two*sqrt(flmin)
548 nindex3=0
549 DO ii = 1, nindx
550 nn=index(ii)
551 cs(1) = sig(1,nn)
552 cs(2) = sig(2,nn)
553 cs(3) = sig(3,nn)
554 cs(4) = sig(4,nn)
555 cs(5) = sig(5,nn)
556 cs(6) = sig(6,nn)
557 pr = -(cs(1)+cs(2)+cs(3))* third
558 cs(1) = cs(1) + pr
559 cs(2) = cs(2) + pr
560 cs(3) = cs(3) + pr
561 aaa(nn)=cs(4)**2 + cs(5)**2 + cs(6)**2 - cs(1)*cs(2)
562 & - cs(2)*cs(3) - cs(1)*cs(3)
563 norminf(nn) =
max(abs(cs(1)),abs(cs(2)),abs(cs(3)),
564 & abs(cs(4)),abs(cs(5)),abs(cs(6)))
565 norminf(nn) = em10*norminf(nn)
566
567
568 aa =
max(aaa(nn),norminf(nn))
569
570 bb=cs(1)*cs(5)**2 + cs(2)*cs(6)**2
571 & + cs(3)*cs(4)**2 - cs(1)*cs(2)*cs(3)
572 & - two*cs(4)*cs(5)*cs(6)
573
574 cc=-sqrt(twenty7/
max(em20,aa))*bb*half/
max(em20,aa)
577 angp=acos(cc) * third
578 dd=two*sqrt(aa * third)
579 str(1,nn)=dd*cos(angp)
580 str(2,nn)=dd*cos(angp+ftpi)
581 str(3,nn)=dd*cos(angp+ttpi)
582
583 val(1,nn) = str(1,nn)-pr
584 val(2,nn) = str(2,nn)-pr
585 val(3,nn) = str(3,nn)-pr
586
587 IF(abs(str(3,nn))>abs(str(1,nn))
588 & .AND.aaa(nn)>norminf(nn)) THEN
589 aa=str(1,nn)
590 str(1,nn)=str(3,nn)
591 str(3,nn)=aa
592 nindex3 = nindex3+1
593 index3(nindex3) = nn
594 ENDIF
595
596
597
598 strmax=
max(abs(str(1,nn)),abs(str(3,nn)))
599 tol1(nn)=
max(em20,flm*strmax**2)
600 tol2(nn)=flm*strmax/3
601 a(1,1,nn)=cs(1)-str(1,nn)
602 a(2,2,nn)=cs(2)-str(1,nn)
603 a(3,3,nn)=cs(3)-str(1,nn)
604 a(1,2,nn)=cs(4)
605 a(2,1,nn)=cs(4)
606 a(2,3,nn)=cs(5)
607 a(3,2,nn)=cs(5)
608 a(1,3,nn)=cs(6)
609 a(3,1,nn)=cs(6)
610
611 b(1,1,nn)=a(2,1,nn)*a(3,2,nn)-a(3,1,nn)
612 . *a(2,2,nn)
613 b(1,2,nn)=a(2,2,nn)*a(3,3,nn)-a(3,2,nn)
614 . *a(2,3,nn)
615 b(1,3,nn)=a(2,3,nn)*a(3,1,nn)-a(3,3,nn)
616 . *a(2,1,nn)
617 b(2,1,nn)=a(3,1,nn)*a(1,2,nn)-a(1,1,nn)
618 . *a(3,2,nn)
619 b(2,2,nn)=a(3,2,nn)*a(1,3,nn)-a(1,2,nn)
620 . *a(3,3,nn)
621 b(2,3,nn)=a(3,3,nn)*a(1,1,nn)-a(1,3,nn)
622 . *a(3,1,nn)
623 b(3,1,nn)=a(1,1,nn)*a(2,2,nn)-a(2,1,nn)
624 . *a(1,2,nn)
625 b(3,2,nn)=a(1,2,nn)*a(2,3,nn)-a(2,2,nn)
626 . *a(1,3,nn)
627 b(3,3,nn)=a(1,3,nn)*a(2,1,nn)-a(2,3,nn)
628 . *a(1,1,nn)
629 xmag(1,nn)=sqrt(b(1,1,nn)**2+b(2,1,nn)**2+b(3,1,nn)**2)
630 xmag(2,nn)=sqrt(b(1,2,nn)**2+b(2,2,nn)**2+b(3,2,nn)**2)
631 xmag(3,nn)=sqrt(b(1,3,nn)**2+b(2,3,nn)**2+b(3,3,nn)**2)
632
633 ENDDO
634
635 nindex1 = 0
636 nindex2 = 0
637 DO ii = 1, nindx
638 nn=index(ii)
639 xmaxv(nn)=
max(xmag(1,nn),xmag(2,nn),xmag(3,nn))
640 IF(xmag(1,nn)==xmaxv(nn)) THEN
641 lmaxv(nn) = 1
642 ELSEIF(xmag(2,nn)==xmaxv(nn)) THEN
643 lmaxv(nn) = 2
644 ELSE
645 lmaxv(nn) = 3
646 ENDIF
647 IF(aaa(nn)<norminf(nn)) THEN
648 val(1,nn) = sig(1,nn)
649 val(2,nn) = sig(2,nn)
650 val(3,nn) = sig(3,nn)
651 v(1,1,nn) = one
652 v(2,1,nn) = zero
653 v(3,1,nn) = zero
654 v(1,2,nn) = zero
655 v(2,2,nn) = one
656 v(3,2,nn) = zero
657
658 ELSEIF(xmaxv(nn)>tol1(nn)) THEN
659 nindex1 = nindex1 + 1
660 index1(nindex1) = nn
661 ELSE
662 nindex2 = nindex2 + 1
663 index2(nindex2) = nn
664 ENDIF
665 ENDDO
666
667#include "vectorize.inc"
668 DO n = 1, nindex1
669 nn = index1(n)
670 lmax = lmaxv(nn)
671 xmaxinv = one/xmaxv(nn)
672 v(1,1,nn)=b(1,lmax,nn)*xmaxinv
673 v(2,1,nn)=b(2,lmax,nn)*xmaxinv
674 v(3,1,nn)=b(3,lmax,nn)*xmaxinv
675 a(1,1,nn)=a(1,1,nn)+str(1,nn)-str(3,nn)
676 a(2,2,nn)=a(2,2,nn)+str(1,nn)-str(3,nn)
677 a(3,3,nn)=a(3,3,nn)+str(1,nn)-str(3,nn)
678
679 b(1,1,nn)=a(2,1,nn)*v(3,1,nn)-a(3,1,nn)*v(2,1,nn)
680 b(1,2,nn)=a(2,2,nn)*v(3,1,nn)-a(3,2,nn)*v(2,1,nn)
681 b(1,3,nn)=a(2,3,nn)*v(3,1,nn)-a(3,3,nn)*v(2,1,nn)
682 b(2,1,nn)=a(3,1,nn)*v(1,1,nn)-a(1,1,nn)*v(3,1,nn)
683 b(2,2,nn)=a(3,2,nn)*v(1,1,nn)-a(1,2,nn)*v(3,1,nn)
684 b(2,3,nn)=a(3,3,nn)*v(1,1,nn)-a(1,3,nn)*v(3,1,nn)
685 b(3,1,nn)=a(1,1,nn)*v(2,1,nn)-a(2,1,nn)*v(1,1,nn)
686 b(3,2,nn)=a(1,2,nn)*v(2,1,nn)-a(2,2,nn)*v(1,1,nn)
687 b(3,3,nn)=a(1,3,nn)*v(2,1,nn)-a(2,3,nn)*v(1,1,nn)
688 xmag(1,nn)=sqrt(b(1,1,nn)**2+b(2,1,nn)**2+b(3,1,nn)**2)
689 xmag(2,nn)=sqrt(b(1,2,nn)**2+b(2,2,nn)**2+b(3,2,nn)**2)
690 xmag(3,nn)=sqrt(b(1,3,nn)**2+b(2,3,nn)**2+b(3,3,nn)**2)
691
692 xmaxv(nn)=
max(xmag(1,nn),xmag(2,nn),xmag(3,nn))
693 ENDDO
694
695#include "vectorize.inc"
696 DO n = 1, nindex1
697 nn = index1(n)
698 IF(xmag(1,nn)==xmaxv(nn)) THEN
699 lmaxv(nn) = 1
700 ELSEIF(xmag(2,nn)==xmaxv(nn)) THEN
701 lmaxv(nn) = 2
702 ELSE
703 lmaxv(nn) = 3
704 ENDIF
705
706 vmag=sqrt(v(1,1,nn)**2+v(2,1,nn)**2)
707 lmax = lmaxv(nn)
708 IF(xmaxv(nn)>tol2(nn))THEN
709 xmaxinv = one/xmaxv(nn)
710 v(1,3,nn)=b(1,lmax,nn)*xmaxinv
711 v(2,3,nn)=b(2,lmax,nn)*xmaxinv
712 v(3,3,nn)=b(3,lmax,nn)*xmaxinv
713 v(1,2,nn)=v(2,3,nn)*v(3,1,nn)-v(2,1,nn)*v(3,3,nn)
714 v(2,2,nn)=v(3,3,nn)*v(1,1,nn)-v(3,1,nn)*v(1,3,nn)
715 v(3,2,nn)=v(1,3,nn)*v(2,1,nn)-v(1,1,nn)*v(2,3,nn)
716 vmag=one/sqrt(v(1,2,nn)**2+v(2,2,nn)**2+v(3,2,nn)**2)
717 v(1,2,nn)=v(1,2,nn)*vmag
718 v(2,2,nn)=v(2,2,nn)*vmag
719 v(3,2,nn)=v(3,2,nn)*vmag
720 ELSEIF(vmag>tol2(nn))THEN
721 v(1,2,nn)=-v(2,1,nn)/vmag
722 v(2,2,nn)=v(1,1,nn)/vmag
723 v(3,2,nn)=zero
724 ELSE
725 v(1,2,nn)=one
726 v(2,2,nn)=zero
727 v(3,2,nn)=zero
728 ENDIF
729 ENDDO
730
731
732
733 DO n = 1, nindex2
734 nn = index2(n)
735 xmag(1,nn)=sqrt(a(1,1,nn)**2+a(2,1,nn)**2)
736 xmag(2,nn)=sqrt(a(1,2,nn)**2+a(2,2,nn)**2)
737 xmag(3,nn)=sqrt(a(1,3,nn)**2+a(2,3,nn)**2)
738
739 xmaxv(nn)=
max(xmag(1,nn),xmag(2,nn),xmag(3,nn))
740 ENDDO
741
742#include "vectorize.inc"
743 DO n = 1, nindex2
744 nn = index2(n)
745 IF(xmag(1,nn)==xmaxv(nn)) THEN
746 lmaxv(nn) = 1
747 ELSEIF(xmag(2,nn)==xmaxv(nn)) THEN
748 lmaxv(nn) = 2
749 ELSE
750 lmaxv(nn) = 3
751 ENDIF
752
753 lmax = lmaxv(nn)
754 IF(
max(abs(a(3,1,nn)),abs(a(3,2,nn)),abs(a(3,3,nn)))
755 & <tol2(nn))THEN
756 xmaxinv = one/xmaxv(nn)
757 v(1,1,nn)= zero
758 v(2,1,nn)= zero
759 v(3,1,nn)= one
760 v(1,2,nn)=-a(2,lmax,nn)*xmaxinv
761 v(2,2,nn)= a(1,lmax,nn)*xmaxinv
762 v(3,2,nn)= zero
763
764 ELSEIF(xmaxv(nn)>tol2(nn))THEN
765 xmaxinv = one/xmaxv(nn)
766 v(1,1,nn)=-a(2,lmax,nn)*xmaxinv
767 v(2,1,nn)= a(1,lmax,nn)*xmaxinv
768 v(3,1,nn)= zero
769 v(1,2,nn)=-a(3,lmax,nn)*v(2,1,nn)
770 v(2,2,nn)= a(3,lmax,nn)*v(1,1,nn)
771 v(3,2,nn)= a(1,lmax,nn)*v(2,1,nn)-a(2,lmax,nn)*v(1,1,nn)
772 vmag=one/sqrt(v(1,2,nn)**2+v(2,2,nn)**2+v(3,2,nn)**2)
773 v(1,2,nn)=v(1,2,nn)*vmag
774 v(2,2,nn)=v(2,2,nn)*vmag
775 v(3,2,nn)=v(3,2,nn)*vmag
776 ELSE
777 v(1,1,nn) = one
778 v(2,1,nn) = zero
779 v(3,1,nn) = zero
780 v(1,2,nn) = zero
781 v(2,2,nn) = one
782 v(3,2,nn) = zero
783 ENDIF
784 ENDDO
785
786 DO ii = 1, nindx
787 nn=index(ii)
788 vec(1,nn)=v(1,1,nn)
789 vec(2,nn)=v(2,1,nn)
790 vec(3,nn)=v(3,1,nn)
791 vec(4,nn)=v(1,2,nn)
792 vec(5,nn)=v(2,2,nn)
793 vec(6,nn)=v(3,2,nn)
794 vec(7,nn)=vec(2,nn)*vec(6,nn)-vec(3,nn)*vec(5,nn)
795 vec(8,nn)=vec(3,nn)*vec(4,nn)-vec(1,nn)*vec(6,nn)
796 vec(9,nn)=vec(1,nn)*vec(5,nn)-vec(2,nn)*vec(4,nn)
797 ENDDO
798
799 DO n = 1, nindex3
800 nn = index3(n)
801
802 str(1,nn)=vec(7,nn)
803 str(2,nn)=vec(8,nn)
804 str(3,nn)=vec(9,nn)
805 ENDDO
806 DO n = 1, nindex3
807 nn = index3(n)
808 vec(7,nn)=vec(1,nn)
809 vec(8,nn)=vec(2,nn)
810 vec(9,nn)=vec(3,nn)
811 vec(1,nn)=-str(1,nn)
812 vec(2,nn)=-str(2,nn)
813 vec(3,nn)=-str(3,nn)
814 ENDDO
815
816 RETURN
void floatmin(int *a, int *b, float *flm)