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