446
447
448
450#ifdef WITH_ASSERT
452#endif
453
454
455
456#include "implicit_f.inc"
457
458
459
460#include "mvsiz_p.inc"
461
462
463
464#include "com01_c.inc"
465#include "com04_c.inc"
466#include "param_c.inc"
467#include "task_c.inc"
468
469
470
471 INTEGER NI25, NRTM, NRTM0, NMN, JTASK, IEDGE, NEDGE, FLAG, NADMSR,ISHIFT,SOL_EDGE,
472 . IRECT(4,NRTM), MSR(*),
473 . ACTNOR(*), MSEGTYP(*), TAGNOD(*),
474 . MVOISIN(4,*), EVOISIN(4,*), IAD_FREDG(NINTER25,*), FR_EDG(*),
475 . LEDGE(NLEDGE,*), LBOUND(*), ADMSR(4,*), IAD_FRNOR(NINTER25,*), FR_NOR(*),
476 . IADNOR(4,*),ADDCSRECT(*), PROCNOR(*)
477 INTEGER :: FREE_IRECT_ID(NRTM),NRTM_FREE
478
480 . x(3,numnod), stifm(*),stfe(nedge)
481 real*4 nod_normal(3,4,nrtm), wnod_normal(3,4,nrtm), vtx_bisector(3,2,nadmsr)
482 real*4 fskyt(3,*),fskyn25(3,*)
483 INTEGER :: NB_FREE_BOUND,FREE_BOUND(4,4*NRTM)
484 INTEGER :: TAGE(*)
485
486 TYPE(MPI_COMM_NOR_STRUCT) :: BUFFERS
487
488
489
490 INTEGER I ,J , N, LLT, NM, IRM, N1, N2, N3, N4, IAD, LENR, LENS, CC, ISH
491 INTEGER IX1, IX2, IX3, IX4,
492 . I1, I2, I3, I4, JRM, JEDG, IEDG, NEDG, IS1,IS2
493 INTEGER NRTMFT, NRTMLT, NEDGFT, NEDGLT, NADMSRFT, NADMSRLT
494 INTEGER SIZE
496 real*4
497 . x0, y0, z0,
498 . x1, x2, x3, x4,
499 . y1, y2, y3, y4,
500 . z1, z2, z3, z4,
501 . x01, x02, x03, x04,
502 . y01, y02, y03, y04,
503 . z01, z02, z03, z04,
504 . xn1(mvsiz),yn1(mvsiz),zn1(mvsiz),
505 . xn2(mvsiz),yn2(mvsiz),zn2(mvsiz),
506 . xn3(mvsiz),yn3(mvsiz),zn3(mvsiz),
507 . xn4(mvsiz),yn4(mvsiz),zn4(mvsiz),
508 . xs(mvsiz), ys(mvsiz), zs(mvsiz),
509 . aaa, nx, ny, nz,
510 . vx, vy, vz, x12, y12, z12
511 real*4 :: x0s,y0s,z0s,x01s,y01s,z01s,x02s,y02s,z02s
512 LOGICAL :: ,(MVSIZ)
513
514
515
516
517
518
519#define RZERO 0.
520#define RUN 1.
521#define RDIX 10.
522#define REP30 1.0E30
523#define REM30 1.0E-30
524
525
526
527
528
529
530 INTEGER IE,JE,I1E,I2E
531 INTEGER :: IDS(4)
532
533
534
535
536
537
538
539 IF(flag == 1) THEN
540
541 nrtmft= 1+(jtask-1)*nrtm0/ nthread
542 nrtmlt= jtask*nrtm0/nthread
543
544 DO n=nrtmft,nrtmlt,mvsiz
545
546 llt=
min(nrtmlt-n+1,mvsiz)
547
548 tage(n:llt+n-1)=0
549
550#include "vectorize.inc"
551
552 DO i=1,llt
553
554 irm=i+n-1
555
556 ix1=irect(1,irm)
557 ix2=irect(2,irm)
558 ix3=irect(3,irm)
559 ix4=irect(4,irm)
560 IF(ix3/=ix4)THEN
561 is_quad(i) = .true.
562 ELSE
563 is_quad(i) = .false.
564 ENDIF
565
566
571 tage(irm)=1
572 cycle
573 END IF
574
575
576 IF(stifm(irm) > zero) THEN
577
578 x1=x(1,ix1)
579 y1=x(2,ix1)
580 z1=x(3,ix1)
581 x2=x(1,ix2)
582 y2=x(2,ix2)
583 z2=x(3,ix2)
584 x3=x(1,ix3)
585 y3=x(2,ix3)
586 z3=x(3,ix3)
587 x4=x(1,ix4)
588 y4=x(2,ix4)
589 z4=x(3,ix4)
590
591 IF(ix3/=ix4)THEN
592 x0 = (x1+x2+x3+x4)/4.0
593 y0 = (y1+y2+y3+y4)/4.0
594 z0 = (z1+z2+z3+z4)/4.0
595 ELSE
596 x0 = x3
597 y0 = y3
598 z0 = z3
599 ENDIF
600
601 x01 = x1 - x0
602 y01 = y1 - y0
603 z01 = z1 - z0
604 x02 = x2 - x0
605 y02 = y2 - y0
606 z02 = z2 - z0
607 x03 = x3 - x0
608 y03 = y3 - y0
609 z03 = z3 - z0
610 x04 = x4 - x0
611 y04 = y4 - y0
612 z04 = z4 - z0
613
614 xn1(i) = y01*z02 - z01*y02
615 yn1(i) = z01*x02 - x01*z02
616 zn1(i) = x01*y02 - y01*x02
617 xn2(i) = y02*z03 - z02*y03
618 yn2(i) = z02*x03 - x02*z03
619 zn2(i) = x02*y03 - y02*x03
620 xn3(i) = y03*z04 - z03*y04
621 yn3(i) = z03*x04 - x03*z04
622 zn3(i) = x03*y04 - y03*x04
623 xn4(i) = y04*z01 - z04*y01
624 yn4(i) = z04*x01 - x04*z01
625 zn4(i) = x04*y01 - y04*x01
626
627
628 aaa=run/
max(rem30,sqrt(xn1(i)*xn1(i)+yn1(i)*yn1(i)+zn1(i)*zn1(i)))
629 xn1(i) = xn1(i)*aaa
630 yn1(i) = yn1(i)*aaa
631 zn1(i) = zn1(i)*aaa
632
633 aaa=run/
max(rem30,sqrt(xn2(i)*xn2(i)+yn2(i)*yn2(i)+zn2(i)*zn2(i)))
634 xn2(i) = xn2(i)*aaa
635 yn2(i) = yn2(i)*aaa
636 zn2(i) = zn2(i)*aaa
637
638 aaa=run/
max(rem30,sqrt(xn3(i)*xn3(i)+yn3(i)*yn3(i)+zn3(i)*zn3(i)))
639 xn3(i) = xn3(i)*aaa
640 yn3(i) = yn3(i)*aaa
641 zn3(i) = zn3(i)*aaa
642
643 aaa=run/
max(rem30,sqrt(xn4(i)*xn4(i)+yn4(i)*yn4(i)+zn4(i)*zn4(i)))
644 xn4(i) = xn4(i)*aaa
645 yn4(i) = yn4(i)*aaa
646 zn4(i) = zn4(i)*aaa
647
648 ELSE
649 xn1(i) = rzero
650 yn1(i) = rzero
651 zn1(i) = rzero
652
653 xn2(i) = rzero
654 yn2(i) = rzero
655 zn2(i) = rzero
656
657 xn3(i) = rzero
658 yn3(i) = rzero
659 zn3(i) = rzero
660
661 xn4(i) = rzero
662 yn4(i) = rzero
663 zn4(i) = rzero
664 END IF
665 END DO
666
667#include "vectorize.inc"
668 DO i=1,llt
669
670 irm=i+n-1
671 IF(tage(irm)==1) cycle
672
673
674 IF(is_quad(i))THEN
675
676 nod_normal(1,1,irm)=xn1(i)
677 nod_normal(2,1,irm)=yn1(i)
678 nod_normal(3,1,irm)=zn1(i)
679
680 nod_normal(1,2,irm)=xn2(i)
681 nod_normal(2,2,irm)=yn2(i)
682 nod_normal(3,2,irm)=zn2(i)
683
684 nod_normal(1,3,irm)=xn3(i)
685 nod_normal(2,3,irm)=yn3(i)
686 nod_normal(3,3,irm)=zn3(i)
687
688 nod_normal(1,4,irm)=xn4(i)
689 nod_normal(2,4,irm)=yn4(i)
690 nod_normal(3,4,irm)=zn4(i)
691
692 ELSE
693
694 nod_normal(1,1,irm)=xn1(i)
695 nod_normal(2,1,irm)=yn1(i)
696 nod_normal(3,1,irm)=zn1(i)
697
698 nod_normal(1,2,irm)=xn1(i)
699 nod_normal(2,2,irm)=yn1(i)
700 nod_normal(3,2,irm)=zn1(i)
701
702 nod_normal(1,4,irm)=xn1(i)
703 nod_normal(2,4,irm)=yn1(i)
704 nod_normal(3,4,irm)=zn1(i)
705
706 END IF
707 END DO
708
709#include "vectorize.inc"
710 DO i=1,llt
711
712
713 irm=i+n-1
714 IF(tage(irm)==1) cycle
715
716 ish=msegtyp(irm)
717 IF(ish > 0) THEN
718 IF(ish > nrtm)ish=ish-nrtm
719
720 IF(is_quad(i))THEN
721
722 nod_normal(1,1,ish)=-xn1(i)
723 nod_normal(2,1,ish)=-yn1(i)
724 nod_normal(3,1,ish)=-zn1(i)
725
726 nod_normal(1,4,ish)=-xn2(i)
727 nod_normal(2,4,ish)=-yn2(i)
728 nod_normal(3,4,ish)=-zn2(i)
729
730 nod_normal(1,3,ish)=-xn3(i)
731 nod_normal(2,3,ish)=-yn3(i)
732 nod_normal(3,3,ish)=-zn3(i)
733
734 nod_normal(1,2,ish)=-xn4(i)
735 nod_normal(2,2,ish)=-yn4(i)
736 nod_normal(3,2,ish)=-zn4(i)
737
738 ELSE
739
740 nod_normal(1,1,ish)=-xn1(i)
741 nod_normal(2,1,ish)=-yn1(i)
742 nod_normal(3,1,ish)=-zn1(i)
743
744 nod_normal(1,4,ish)=-xn1(i)
745 nod_normal(2,4,ish)=-yn1(i)
746 nod_normal(3,4,ish)=-zn1(i)
747
748 nod_normal(1,2,ish)=-xn1(i)
749 nod_normal(2,2,ish)=-yn1(i)
750 nod_normal(3,2,ish)=-zn1(i)
751
752 END IF
753 END IF
754 END DO
755
756 IF(sol_edge /= 0) THEN
757
758 DO i=1,llt
759
760
761 irm=i+n-1
762 IF(tage(irm)==1) cycle
763
764 i1=admsr(1,irm)
765 i2=admsr(2,irm)
766 i3=admsr(3,irm)
767 i4=admsr(4,irm)
768
769 IF(is_quad(i))THEN
770 iad = iadnor(1,irm)
771 fskyt(1,iad) = xn4(i)+xn1(i)
772 fskyt(2,iad) = yn4(i)+yn1(i)
773 fskyt(3,iad) = zn4(i)+zn1(i)
774
775 iad = iadnor(2,irm)
776 fskyt(1,iad) = xn1(i)+xn2(i)
777 fskyt(2,iad) = yn1(i)+yn2(i)
778 fskyt(3,iad) = zn1(i)+zn2(i)
779
780 iad = iadnor(3,irm)
781 fskyt(1,iad) = xn2(i)+xn3(i)
782 fskyt(2,iad) = yn2(i)+yn3(i)
783 fskyt(3,iad) = zn2(i)+zn3(i)
784
785 iad = iadnor(4,irm)
786 fskyt(1,iad) = xn3(i)+xn4(i)
787 fskyt(2,iad) = yn3(i)+yn4(i)
788 fskyt(3,iad) = zn3(i)+zn4(i)
789 ELSE
790 iad = iadnor(1,irm)
791 fskyt(1,iad) = xn1(i)
792 fskyt(2,iad) = yn1(i)
793 fskyt(3,iad) = zn1(i)
794
795 iad = iadnor(2,irm)
796 fskyt(1,iad) = xn1(i)
797 fskyt(2,iad) = yn1(i)
798 fskyt(3,iad) = zn1(i)
799
800 iad = iadnor(3,irm)
801 fskyt(1,iad) = xn1(i)
802 fskyt(2,iad) = yn1(i)
803 fskyt(3,iad) = zn1(i)
804
805 END IF
806 END DO
807 ENDIF
808
809 END DO
810
812
813 nrtmft= 1+(jtask-1)*nrtm/ nthread
814 nrtmlt= jtask*nrtm/nthread
815
816 nadmsrft= 1+(jtask-1)*nadmsr/ nthread
817 nadmsrlt= jtask*nadmsr/nthread
818
819 lbound(nadmsrft:nadmsrlt)=0
820
822
823
824 nb_free_bound = 0
825 limit_case = .false.
826 DO i=1,nrtm_free
827 irm = free_irect_id(i)
828 IF(stifm(irm) <= zero)cycle
829 DO iedg=1,4
830 IF(mvoisin(iedg,irm)==0)THEN
831 IF(.NOT.(irect(3,irm)==irect(4,irm).AND.iedg==3))THEN
832 nb_free_bound = nb_free_bound + 1
833 free_bound(1,nb_free_bound) = irm
834 free_bound(2,nb_free_bound) = iedg
835
836
837 is1=admsr(iedg,irm)
838 is2=admsr(mod(iedg,4)+1,irm)
839
840 vx=nod_normal(1,iedg,irm)
841 vy=nod_normal(2,iedg,irm)
842 vz=nod_normal(3,iedg,irm)
843
844 IF(vx == 0 .AND. vy == 0 .AND. vz == 0) THEN
845
846 free_bound(3,nb_free_bound) = 3
847 free_bound(4,nb_free_bound) = 3
848 ELSE
849 lbound(is1) = lbound(is1) + 1
850 lbound(is2) = lbound(is2) + 1
851 free_bound(3,nb_free_bound) = lbound(is1)
852 free_bound(4,nb_free_bound) = lbound(is2)
853 ENDIF
854
855 IF(lbound(is1) > 2 .OR. lbound(is2) > 2) THEN
856
857
858
859
860 limit_case = .true.
861 ENDIF
862 ENDIF
863 ENDIF
864 ENDDO
865 ENDDO
866 IF(limit_case) THEN
867 DO i=1,nb_free_bound
868 irm = free_bound(1,i)
869 iedg = free_bound(2,i)
870 is1=admsr(iedg,irm)
871 IF(lbound(is1) > 2) THEN
872 free_bound(3,i) = 3
873 vtx_bisector(1,1,is1) = rzero
874 vtx_bisector(2,1,is1) = rzero
875 vtx_bisector(3,1,is1) = rzero
876 vtx_bisector(1,2,is1) = rzero
877 vtx_bisector(2,2,is1) = rzero
878 vtx_bisector(3,2,is1) = rzero
879 ENDIF
880
881 is2=admsr(mod(iedg,4)+1,irm)
882 IF(lbound(is2) > 2) THEN
883 free_bound(4,i) = 3
884 vtx_bisector(1,1,is2) = rzero
885 vtx_bisector(2,1,is2) = rzero
886 vtx_bisector(3,1,is2) = rzero
887 vtx_bisector(1,2,is2) = rzero
888 vtx_bisector(2,2,is2) = rzero
889 vtx_bisector(3,2,is2) = rzero
890 ENDIF
891 ENDDO
892 ENDIF
893
894
895
896
898
899
900 nrtmft= 1+(jtask-1)*nb_free_bound/nthread
901 nrtmlt= jtask*nb_free_bound/nthread
902#include "vectorize.inc"
903 DO i=nrtmft,nrtmlt
904 irm = free_bound(1,i)
905 iedg = free_bound(2,i)
906 nx=nod_normal(1,iedg,irm)
907 ny=nod_normal(2,iedg,irm)
908 nz=nod_normal(3,iedg,irm)
909
910 i1=irect(iedg,irm)
911 i2=irect(mod(iedg,4)+1,irm)
912
913 x12=x(1,i2)-x(1,i1)
914 y12=x(2,i2)-x(2,i1)
915 z12=x(3,i2)-x(3,i1)
916
917 vx=y12*nz-z12*ny
918 vy=z12*nx-x12*nz
919 vz=x12*ny-y12*nx
920
921 aaa=run/
max(rem30,sqrt(vx*vx+vy*vy+vz*vz))
922 vx=vx*aaa
923 vy=vy*aaa
924 vz=vz*aaa
925
926 nod_normal(1,iedg,irm)=vx
927 nod_normal(2,iedg,irm)=vy
928 nod_normal(3,iedg,irm)=vz
929
930 ENDDO
931
933
934#include "vectorize.inc"
935 DO i=nrtmft,nrtmlt
936 irm = free_bound(1,i)
937 iedg = free_bound(2,i)
938 i1 = free_bound(3,i)
939 i2 = free_bound(4,i)
940
941 vx=nod_normal(1,iedg,irm)
942 vy=nod_normal(2,iedg,irm)
943 vz=nod_normal(3,iedg,irm)
944
945 is1=admsr(iedg,irm)
946 IF(i1 <= 2 ) THEN
947 vtx_bisector(1,i1,is1)=vx
948 vtx_bisector(2,i1,is1)=vy
949 vtx_bisector(3,i1,is1)=vz
950 END IF
951
952 is2=admsr(mod(iedg,4)+1,irm)
953 IF(i2 <= 2) THEN
954 vtx_bisector(1,i2,is2)=vx
955 vtx_bisector(2,i2,is2)=vy
956 vtx_bisector(3,i2,is2)=vz
957 END IF
958 ENDDO
959
961
962
963 IF(nspmd > 1)THEN
964 IF(jtask==1)THEN
965 SIZE = 3
967 1 ni25,iad_fredg,fr_edg , nod_normal,wnod_normal,SIZE ,nadmsr,
968 2 buffers%RECV_RQ ,buffers%SEND_RQ,buffers%IRINDEX,buffers%ISINDEX,buffers%IAD_RECV,
969 3 buffers%NBIRECV,buffers%NBISEND,buffers%RECV_BUF ,buffers%SEND_BUF ,vtx_bisector,
970 4 lbound,iad_frnor,fr_nor,1,fskyn25 ,ishift,addcsrect, procnor,sol_edge)
971 END IF
972 END IF
974
975 ELSE IF(flag == 2) THEN
976
977
978
979
980 nrtmft= 1+(jtask-1)*nrtm/ nthread
981 nrtmlt= jtask*nrtm/nthread
982 DO n=nrtmft,nrtmlt,mvsiz
983
984 llt=
min(nrtmlt-n+1,mvsiz)
985
986#include "vectorize.inc"
987 DO i=1,llt
988
989 irm=i+n-1
990
991
992 IF(actnor(irm)==3) THEN
993 wnod_normal(1:3,1:4,irm) = rzero
994
995 ENDIF
996
997 IF(actnor(irm)==0) THEN
998
999
1000 cycle
1001 ENDIF
1002
1003
1004 IF(stifm(irm) <= 0) THEN
1005 wnod_normal(1:3,1:4,irm) = rzero
1006 ELSE
1007 DO j=1,4
1008 jrm =mvoisin(j,irm)
1009 jedg=evoisin(j,irm)
1010 IF(jrm > 0 )THEN
1011
1012 wnod_normal(1,j,irm) = nod_normal(1,jedg,jrm)
1013 wnod_normal(2,j,irm) = nod_normal(2,jedg,jrm)
1014 wnod_normal(3,j,irm) = nod_normal(3,jedg,jrm)
1015
1016
1017
1018
1019
1020 ELSEIF(jrm<=0)THEN
1021 wnod_normal(1,j,irm) = rzero
1022 wnod_normal(2,j,irm) = rzero
1023 wnod_normal(3,j,irm) = rzero
1024 END IF
1025 END DO
1026 ENDIF
1027 END DO
1028 END DO
1029
1031 IF(nspmd > 1)THEN
1032 IF(jtask==1)THEN
1033 SIZE = 3
1035 1 ni25,iad_fredg,fr_edg , nod_normal,wnod_normal,SIZE , nadmsr,
1036 2 buffers%RECV_RQ ,buffers%SEND_RQ,buffers%IRINDEX,buffers%ISINDEX,buffers%IAD_RECV,
1037 3 buffers%NBIRECV,buffers%NBISEND,buffers%RECV_BUF ,buffers%SEND_BUF ,vtx_bisector,
1038 4 lbound,iad_frnor,fr_nor,2,fskyn25 ,ishift,addcsrect, procnor,sol_edge)
1039 WHERE (lbound(1:nadmsr) > 1)
1040 lbound(1:nadmsr) = 1
1041 END WHERE
1042 END IF
1043 END IF
1044
1046
1047 DO irm=nrtmft,nrtmlt
1048
1049
1050
1051
1052
1053
1054
1055
1056 IF(actnor(irm)==0) cycle
1057
1058 IF(stifm(irm) <= zero) THEN
1059 nod_normal(1:3,1:4,irm) = rzero
1060 ENDIF
1061
1062 DO j=1,4
1063 jrm =mvoisin(j,irm)
1064
1065 IF(jrm<0 .AND. stifm(irm) <= 0 ) THEN
1066 nod_normal(1,j,irm) = wnod_normal(1,j,irm)
1067 nod_normal(2,j,irm) = wnod_normal(2,j,irm)
1068 nod_normal(3,j,irm) = wnod_normal(3,j,irm)
1069
1070
1071
1072
1073
1074 ELSE
1075 IF( jrm /= 0) THEN
1076 nx=nod_normal(1,j,irm)+wnod_normal(1,j,irm)
1077 ny=nod_normal(2,j,irm)+wnod_normal(2,j,irm)
1078 nz=nod_normal(3,j,irm)+wnod_normal(3,j,irm)
1079 aaa=run/
max(rem30,sqrt(nx*nx+ny*ny+nz*nz))
1080 nod_normal(1,j,irm)=nx*aaa
1081 nod_normal(2,j,irm)=ny*aaa
1082 nod_normal(3,j,irm)=nz*aaa
1083 ENDIF
1084 ENDIF
1085 END DO
1086 END DO
1087 ENDIF
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1115
1116 RETURN
subroutine spmd_exch_nor(ni25, iad_fredg, fr_edg, nod_normal, wnod_normal, size, nadmsr, req_r, req_s, irindex, isindex, iad_recv, nbirecv, nbisend, rbuf, sbuf, vtx_bisector, lbound, iad_frnor, fr_nor, iflag, fskyn, ishift, addcsrect, procnor, sol_edge)
subroutine tagnod(ix, nix, nix1, nix2, numel, iparte, tagbuf, npart)