675
676
677
678 USE my_alloc_mod
680 USE intbufdef_mod
682 USE format_mod , ONLY : fmw_10i
683
684
685
686#include "implicit_f.inc"
687
688
689
690#include "param_c.inc"
691
692
693
694 INTEGER IPARI(NPARI,*), ITAB(*),NREMOV(*)
695 INTEGER NOM_OPT(LNOPT1,*)
696 INTEGER, INTENT(in) :: IDDLEVEL
697 INTEGER, INTENT(in) :: SKIP_TYPE25_EDGE_2_EDGE
698 INTEGER, INTENT(in) :: LOWER_BOUND, UPPER_BOUND
699
700 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
701
702
703
704#include "com04_c.inc"
705#include "scr17_c.inc"
706
707
708
709 INTEGER N,NTY,FLAGREMNODE
710 INTEGER ILEV,II,J,NMN,NSN,NRTS,NRTM,LREMNORMAX,K,
711 . NLINS,NLINM,IWOUT,INCOM,NM,N2,IFLAG,NRE,ip,IACT,
712 . IF7,IF24,IF25,NN2,NNOD,M1,M2,M3,M4,NNREM,IBIT,NEW,
713 . KI,KL,JJ,IEDGE,NEDGE
714 INTEGER, DIMENSION(:),ALLOCATABLE :: TAGD
715 INTEGER ID
716 CHARACTER(LEN=NCHARTITLE) :: TITR
717
718 INTEGER :: COMPTEUR,I2NODE_SIZE,I,L,L1,IS,IIS,NS,IADA
719 INTEGER :: TYP25_USE
720 INTEGER, DIMENSION(:,:), ALLOCATABLE :: I2NODE,POINTS_I2N
721 INTEGER, DIMENSION(:), ALLOCATABLE :: TAGNOD
722
723
724 INTEGER :: III,JJJ,NNOD_2
725 INTEGER :: FIRST,LAST,NNREM_SAVE,FLAGREMNODE_SAV
726 INTEGER :: OFFSET, NBR_INTRA,NBR_EXTRA,TOTAL_INSERTED
727 INTEGER :: SIZE_INSERTED_NODE,OLDSIZE,MAX_INSERTED_NODE,LIMIT
728 INTEGER, DIMENSION(:), ALLOCATABLE :: NBR_INSERT_II,ADRESS_II
729 INTEGER, DIMENSION(:), ALLOCATABLE :: KREMNODE_SAVE,INSERTED_NODE,REMNODE,TMP
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751 iact=0
752 typ25_use = 0
753 DO n=lower_bound,upper_bound
754 nty=ipari(7,n)
755 if7 =ipari(54,n)
756 if24=ipari(63,n)
757 if25=ipari(83,n)
758 IF(nty==7 .AND. if7>0 )THEN
759 iact=1
760 cycle
761 ENDIF
762 IF(nty==24 .AND. if24>0 )THEN
763 iact=1
764 cycle
765 ENDIF
766 IF(nty==25 .AND. if25>0 )THEN
767 iact=1
768 typ25_use = 1
769 cycle
770 ENDIF
771 ENDDO
772 IF (iact==0) THEN
773 DO n=lower_bound,upper_bound
774 nremov(n) = 0
775 ENDDO
776 RETURN
777 END IF
778 IF(typ25_use==1) THEN
779 ALLOCATE(
tagnod(numnod) )
781 ENDIF
782
783
784
785
786
787
788
789
790
791
792
793 i2node_size = 0
794 DO n=1,ninter
795 nty=ipari(7,n)
796 nremov(n) = 0
797 IF(nty==2)THEN
798 nsn =ipari(5,n)
799 DO ii=1,nsn
800 l=intbuf_tab(n)%IRTLM(ii)
801 IF (intbuf_tab(n)%IRECTM(4*(l-1)+3)==intbuf_tab(n)%IRECTM(4*(l-1)+4)) THEN
802 nnod = 3
803 ELSE
804 nnod = 4
805 END IF
806 i2node_size=i2node_size + nnod + 1
807 END DO
808 ENDIF
809 ENDDO
810 IF (i2node_size==0) RETURN
811 ALLOCATE(i2node(i2node_size,3))
812 ALLOCATE(points_i2n(numnod,2))
813 ALLOCATE(tagd(numnod))
814
815 CALL pre_i2(ipari ,intbuf_tab ,i2node_size, i2node,points_i2n)
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877 limit = huge(n)
878
879
880 DO n=lower_bound,upper_bound
881 nty=ipari(7,n)
882 nsn =ipari(5,n)
883 nrts =ipari(3,n)
884 nrtm =ipari(4,n)
885 if7 =ipari(54,n)
886 if24 =ipari(63,n)
887 if25 =ipari(83,n)
888 iedge = ipari(58,n)
889 IF(iddlevel==0.AND.(nty/=24.AND.nty/=25)) cycle
890
891
892
893
894 IF(iddlevel==0.AND.nty==25.AND.skip_type25_edge_2_edge==1) cycle
895
896 IF(iddlevel==0.AND.nty/=25.AND.skip_type25_edge_2_edge==2) cycle
897 ALLOCATE( nbr_insert_ii(nrtm) )
898 ALLOCATE( adress_ii(nrtm) )
899 ALLOCATE( kremnode_save(nrtm+1) )
900 nbr_insert_ii(1:nrtm) = 0
901 adress_ii(1:nrtm) = 0
902 kremnode_save(1:nrtm+1) = 0
903
905 CALL fretitl2(titr,nom_opt(lnopt1-ltitr+1,n),ltitr)
906
907 IF((nty==7.AND.if7>0).OR.(nty==24.AND.if24>0).OR.(nty==25.AND.if25>0))THEN
908 tagd(1:numnod)=2
909 jjj = 0
910 flagremnode=ipari(63,n)
911 flagremnode_sav=ipari(63,n)
912
913 nnrem = 0
914 DO jj=1,nsn
915 ns = intbuf_tab(n)%NSV(jj)
916 IF (ns<=numnod) tagd(ns)=0
917 ENDDO
918 iflag =0
919 nremov(n) = ipari(62,n)
920 iada= 1
921 IF(nremov(n)>0) kremnode_save(1:nrtm+1) = intbuf_tab(n)%KREMNODE(1:nrtm+1)
922
923 size_inserted_node = 1
924 max_inserted_node = 1
925 DO ii=1,nrtm
926 IF (intbuf_tab(n)%IRECTM(4*(ii-1)+4)==intbuf_tab(n)%IRECTM(4*(ii-1)+3)) THEN
927 nnod=3
928 ELSE
929 nnod=4
930 END IF
931 DO j=1,nnod
932 nm = intbuf_tab(n)%IRECTM(4*(ii-1)+j)
933 IF (points_i2n(nm,1)==0) cycle
934 max_inserted_node =
max( max_inserted_node,points_i2n(nm,2)-points_i2n(nm,1)+1 )
935 ENDDO
936 ENDDO
937
938 IF( max_inserted_node > limit / (4*nrtm) .OR. max_inserted_node > 1000000 / nrtm ) THEN
939 size_inserted_node = 4 * nrtm
940 ELSE
941 size_inserted_node = 4 * nrtm *max_inserted_node
942 ENDIF
943
944 CALL my_alloc(inserted_node,size_inserted_node)
945
946 DO ii=1,nrtm
947 nnrem_save = nnrem
948
949
950 IF(flagremnode==2)THEN
951 ki = intbuf_tab(n)%KREMNODE(ii)+1
952 kl = intbuf_tab(n)%KREMNODE(ii+1)
953 DO j=ki,kl
954 ns = intbuf_tab(n)%REMNODE(j)
955 tagd(ns)=1
956 END DO
957 END IF
958
959 IF (intbuf_tab(n)%IRECTM(4*(ii-1)+4)==intbuf_tab(n)%IRECTM(4*(ii-1)+3)) THEN
960 nnod=3
961 ELSE
962 nnod=4
963 END IF
964
965 IF(jjj + nnod * max_inserted_node > size_inserted_node) THEN
966
967 oldsize = size_inserted_node
968 size_inserted_node = size_inserted_node +
min(nrtm,10*nnod*max_inserted_node)
969 CALL my_alloc(tmp,size_inserted_node)
970 tmp(1:oldsize) = inserted_node(1:oldsize)
971
972 CALL move_alloc(tmp,inserted_node)
973 ENDIF
974
975 DO j=1,nnod
976 nm = intbuf_tab(n)%IRECTM(4*(ii-1)+j)
977 IF (points_i2n(nm,1)==0) cycle
978 DO i=points_i2n(nm,1),points_i2n(nm,2)
979 n2 = i2node(i,2)
980 is = i2node(i,3)
981 IF (is >0) THEN
982 ns = intbuf_tab(n2)%NSV(is)
983 IF (tagd(ns)==0) THEN
984 nnrem = nnrem + 1
985 tagd(ns)=1
986 jjj = jjj + 1
987 inserted_node(jjj) = ns
988 END IF
989 ELSEIF (is <0) THEN
990 iis = -is
991 l = intbuf_tab(n2)%IRTLM(iis)
992 nnod_2 = 4
993 IF( intbuf_tab(n2)%IRECTM(4*(l-1)+4)==intbuf_tab(n2)%IRECTM(4*(l-1)+3) ) nnod_2 = 3
994 DO iii = 1,nnod_2
995 nm = intbuf_tab(n2)%IRECTM(4*(l-1)+iii)
996 IF(tagd(nm)==0) THEN
997 nnrem = nnrem + 1
998 tagd(nm)=1
999 jjj = jjj + 1
1000 inserted_node(jjj) = nm
1001 ENDIF
1002 ENDDO
1003 END IF
1004 END DO
1005 END DO
1006
1007
1008
1009 nbr_insert_ii(ii) = nnrem - nnrem_save
1010 kremnode_save(ii) = kremnode_save(ii+1) - kremnode_save(ii)
1011 iada = iada + kremnode_save(ii)
1012
1013 adress_ii(ii) = iada
1014 kremnode_save(ii) = iada + nbr_insert_ii(ii) - 1
1015 iada = iada + nbr_insert_ii(ii)
1016
1017
1018
1019 DO j=1,nnod
1020 nm = intbuf_tab(n)%IRECTM(4*(ii-1)+j)
1021 IF (points_i2n(nm,1)==0) cycle
1022 DO i=points_i2n(nm,1),points_i2n(nm,2)
1023 n2 = i2node(i,2)
1024 is = i2node(i,3)
1025 IF (is >0) THEN
1026 ns = intbuf_tab(n2)%NSV(is)
1027 IF (tagd(ns)==1) tagd(ns)=0
1028 ELSEIF (is <0) THEN
1029 iis = -is
1031 . intbuf_tab(n2)%IRTLM,tagd)
1032 END IF
1033 END DO
1034 END DO
1035 IF(flagremnode==2)THEN
1036 DO j=ki,kl
1037 ns = intbuf_tab(n)%REMNODE(j)
1038 tagd(ns)=0
1039 END DO
1040 END IF
1041
1042 END DO
1043
1044
1045 IF(nnrem>0) THEN
1046
1047
1048 first = 0
1049 last = 0
1050 DO ii = 1,nrtm
1051 IF(first==0) THEN
1052 IF( nbr_insert_ii(ii)/=0 ) first = ii
1053 ENDIF
1054 IF(last==0) THEN
1055 IF( nbr_insert_ii(nrtm+1-ii)/=0 ) last = nrtm+1-ii
1056 ENDIF
1057 ENDDO
1058
1059 total_inserted = 0
1060 DO ii=1,nrtm
1061 total_inserted = total_inserted + nbr_insert_ii(ii)
1062 ENDDO
1063
1064 ALLOCATE( remnode(nremov(n)+total_inserted) )
1065
1066 j = 0
1067 i = 0
1068 offset = 0
1069 IF( first>0 ) THEN
1070
1071
1072 IF( adress_ii(first)>1 ) THEN
1073 remnode(1:adress_ii(first)-1) = intbuf_tab(n)%REMNODE(1:adress_ii(first)-1)
1074 offset = offset + adress_ii(first)-1
1075 i = i + adress_ii(first)-1
1076 ENDIF
1077
1078 DO ii=first,last
1079
1080 IF( nbr_insert_ii(ii)>0 ) THEN
1081 DO jj = 1,nbr_insert_ii(ii)
1082 j = j + 1
1083 remnode(offset+nbr_insert_ii(ii)+1-jj) = inserted_node(j)
1084 ENDDO
1085 offset = offset + nbr_insert_ii(ii)
1086 ENDIF
1087 IF(ii<last.AND.nremov(n)>0) THEN
1088
1089 nbr_intra = adress_ii(ii+1) - adress_ii(ii)-nbr_insert_ii(ii)
1090 IF( nbr_intra>0 )THEN
1091 DO jj = 1,nbr_intra
1092 i = i + 1
1093 remnode(jj+offset) = intbuf_tab(n)%REMNODE(i)
1094 ENDDO
1095 offset = offset + nbr_intra
1096 ENDIF
1097 ENDIF
1098 ENDDO
1099 ENDIF
1100
1101
1102 IF( i<nremov(n) ) THEN
1103 nbr_extra = nremov(n) - i
1104 remnode(offset+1:offset+nbr_extra) = intbuf_tab(n)%REMNODE(i+1:nremov(n))
1105 ENDIF
1106
1107 nnrem = nnrem + nremov(n)
1109 intbuf_tab(n)%REMNODE(1:nnrem) = remnode(1:nnrem)
1110 intbuf_tab(n)%KREMNODE(2:nrtm+1) = kremnode_save(1:nrtm)
1111 intbuf_tab(n)%KREMNODE(1)=0
1112
1113
1114 IF(iddlevel>0) THEN
1115
1117 . msgtype=msgwarning,
1118 . anmode=aninfo_blind_1,
1120 . c1=titr,
1121 . i2=nnrem,
1122 . i3=nom_opt(1,n2))
1123 ENDIF
1124
1125
1126 nremov(n) = nnrem
1127 END IF
1128 IF(ALLOCATED(remnode)) DEALLOCATE( remnode )
1129 IF(ALLOCATED(inserted_node)) DEALLOCATE( inserted_node )
1130
1131
1132
1134
1135 IF(nty==25.AND.if25>0.AND.nnrem>0)THEN
1136
1137 DO i=1,nsn
1138 tagnod(intbuf_tab(n)%NSV(i))=i
1139 END DO
1140
1141
1142 DO i=1,nrtm
1143 k = intbuf_tab(n)%KREMNODE(i)+1
1144 l = intbuf_tab(n)%KREMNODE(i+1)
1145 DO j=k,l
1146 ns =
tagnod(intbuf_tab(n)%REMNODE(j))
1147 intbuf_tab(n)%KREMNOR(ns) = intbuf_tab(n)%KREMNOR(ns)+1
1148 ENDDO
1149 ENDDO
1150
1151 DO ns=1,nsn
1152 intbuf_tab(n)%KREMNOR(ns+1) = intbuf_tab(n)%KREMNOR(ns+1) + intbuf_tab
1153 END DO
1154
1155 DO ns=nsn,1,-1
1156 intbuf_tab(n)%KREMNOR(ns+1)=intbuf_tab(n)%KREMNOR(ns)
1157 END DO
1158 intbuf_tab(n)%KREMNOR(1)=0
1159
1160 DO i=1,nrtm
1161 k = intbuf_tab(n)%KREMNODE(i)+1
1162 l = intbuf_tab(n)%KREMNODE(i+1)
1163 DO j=k,l
1164 ns =
tagnod(intbuf_tab(n)%REMNODE(j
1165 intbuf_tab(n)%KREMNOR(ns) = intbuf_tab(n)%KREMNOR(ns)+1
1166 intbuf_tab(n)%REMNOR(intbuf_tab(n)%KREMNOR(ns)) = i
1167 ENDDO
1168 ENDDO
1169
1170 DO ns=nsn,1,-1
1171 intbuf_tab(n)%KREMNOR(ns+1)=intbuf_tab(n)%KREMNOR(ns)
1172 END DO
1173 intbuf_tab(n)%KREMNOR(1)=0
1174
1175
1176 lremnormax = 0
1177 DO ns=1,nsn
1178 l = intbuf_tab(n)%KREMNOR(ns+1)-intbuf_tab(n)%KREMNOR(ns)
1179 IF( l>lremnormax) THEN
1180 lremnormax = l
1181 ENDIF
1182 ENDDO
1183 ipari(82,n) = lremnormax
1184
1185
1186
1187 DO ns=1,nsn
1188 DO j=intbuf_tab(n)%KREMNOR(ns)+1,intbuf_tab(n)%KREMNOR(ns+1)
1189 l=intbuf_tab(n)%REMNOR(j)
1190 IF(intbuf_tab(n)%IRTLM(4*(ns-1)+1)==intbuf_tab(n)%MSEGLO(l))THEN
1191 intbuf_tab(n)%IRTLM(4*(ns-1)+1:4*(ns-1)+4) =0
1192 intbuf_tab(n)%TIME_S(2*(ns-1)+1:2*(ns-1)+2) =zero
1193 intbuf_tab(n)%PENE_OLD(5*(ns-1)+1:5*(ns-1)+5)=zero
1194 ENDIF
1195 ENDDO
1196 ENDDO
1197
1198 DO i=1,nsn
1199 tagnod(intbuf_tab(n)%NSV(i))=0
1200 END DO
1201
1202 END IF
1203
1204 DEALLOCATE( nbr_insert_ii )
1205 DEALLOCATE( adress_ii )
1206 DEALLOCATE( kremnode_save )
1207
1208
1209
1210
1211 IF(nty==25.AND.if25>0.AND.iedge>0)THEN
1212 nedge = ipari(68,n)
1213 IF (nedge >0)
1215 . points_i2n ,i2node_size ,nom_opt ,itab,iddlevel)
1216 ENDIF
1217 END DO
1218
1219 DEALLOCATE(tagd,i2node,points_i2n)
1220 IF(typ25_use==1) THEN
1222 ENDIF
1223
1224 RETURN
if(complex_arithmetic) id
subroutine remn_i2op_edg25(n, flagremnode, ipari, intbuf_tab, i2node, points_i2n, i2node_size, nom_opt, itab, flag_output)
subroutine pre_i2(ipari, intbuf_tab, nsize, i2node, point_i2node)
subroutine zeronm_tagd(is, irect, irtl, tagd)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)