434
435
436
437 USE my_alloc_mod
439 USE intbufdef_mod
441 USE intbufdef_mod
442
443
444
445#include "implicit_f.inc"
446
447
448
449#include "param_c.inc"
450
451
452
453 INTEGER , INTENT(IN) :: N , FLAGREMNODE, I2NODE_SIZE
454 INTEGER , INTENT(INOUT) :: IPARI(NPARI,NINTER)
455 INTEGER , INTENT(IN) :: I2NODE(I2NODE_SIZE,3),POINTS_I2N(NUMNOD,2)
456 INTEGER , INTENT(IN) :: NOM_OPT(LNOPT1,NINTER),ITAB()
457 INTEGER, INTENT(in) :: FLAG_OUTPUT
458
459 TYPE(INTBUF_STRUCT_) , INTENT(INOUT) :: INTBUF_TAB(NINTER)
460
461
462
463#include "com04_c.inc"
464#include "scr17_c.inc"
465
466
467
468 INTEGER II,J,K,IE,NN, NM,N2,ND,NES,NM2,M,
469 . NN2,NNOD,NNREM_EDG,KI,KL,JJ,IEDG,IEDGS,ES,
470 . COMPTEUR,I,L,L1,IS,IIS,NS,IADA,III,JJJ,NNOD_2,
471 . FIRST,LAST,NNREM_EDG_SAVE,
472 . OFFSET, NBR_INTRA,,TOTAL_INSERTED,
473 . OLDSIZE,
474 . NREMOV_EDG,NEDGE,MAX_INSERTED_I2,ND_TAG,
475 . SOL_EDGE,SH_EDGE,IEDGE,NRTM
476 INTEGER(8) :: SIZE_INSERTED_EDG,MAX_INSERTED_EDG,DIFF_INT8
477 INTEGER, DIMENSION(:),ALLOCATABLE :: TAGD_EDG
478 INTEGER ID
479 CHARACTER(LEN=NCHARTITLE) :: TITR
480 INTEGER, DIMENSION(:), ALLOCATABLE :: NBR_INSERT_II,ADRESS_II
481 INTEGER, DIMENSION(:), ALLOCATABLE :: KREMNODE_EDG_SAVE,INSERTED_EDG,REMNODE_EDG,TMP_EDG
482 INTEGER, DIMENSION(:),ALLOCATABLE :: INOD2LIN,NOD2LIN,KNOD2LIN
483 INTEGER, DIMENSION(:),ALLOCATABLE :: TAG_ND,IDX_ND,TAG_NDE
484
485
486
487
488
489
490
491
492! NBR_INSERT_II :
integer, dimension = nedge , number of inserted edges
for each ii edge
493
494
495
496
497
498
499
500
501 INTEGER :: LIMIT
502
503
505 CALL fretitl2(titr,nom_opt(lnopt1-ltitr+1,n),ltitr)
506
507 nedge =ipari(68,n)
508 iedge = ipari(58,n)
509 nrtm = ipari(4,n)
510
511 ALLOCATE(inod2lin(numnod+1),nod2lin(2*nedge))
512 ALLOCATE(knod2lin(numnod+1))
513
514 nod2lin(1:2*nedge) = 0
515 knod2lin(1:numnod+1) = 0
516 inod2lin(1:numnod+1) = 0
517
518
519
520
521 DO i=1,nedge
522 nn = intbuf_tab(n)%LEDGE(5+(i-1)*nledge)
523 knod2lin(nn) = knod2lin(nn) + 1
524 nn = intbuf_tab(n)%LEDGE(6+(i-1)*nledge)
525 knod2lin(nn) = knod2lin(nn) + 1
526 END DO
527
528 inod2lin(1) = 1
529 DO i=1,numnod
530 inod2lin(i+1) = inod2lin(i) + knod2lin(i)
531 END DO
532 knod2lin(1:numnod+1) = inod2lin(1:numnod+1)
533
534 DO i=1,nedge
535 nn = intbuf_tab(n)%LEDGE(5+(i-1)*nledge)
536 nod2lin(knod2lin(nn)) = i
537 knod2lin(nn) = knod2lin(nn) + 1
538 nn = intbuf_tab(n)%LEDGE(6+(i-1)*nledge)
539 nod2lin(knod2lin(nn)) = i
540 knod2lin(nn) = knod2lin(nn) + 1
541 END DO
542
543 ALLOCATE(tagd_edg(nedge))
544
545 sol_edge =iedge/10
546 sh_edge =iedge-10*sol_edge
547
548
549
550
551
552 IF(sol_edge > 0 .AND. ipari(63,n) == 2) THEN
553
554 max_inserted_edg = 0
555 DO i=1,numnod
556 diff_int8 = inod2lin(i+1)-inod2lin(i)
557 max_inserted_edg =
max(max_inserted_edg,diff_int8)
558 ENDDO
559
560 ALLOCATE( nbr_insert_ii(nrtm) )
561 ALLOCATE( kremnode_edg_save(nrtm+1) )
562 size_inserted_edg = max_inserted_edg*ipari(62,n)
563 CALL my_alloc(inserted_edg,size_inserted_edg)
564 tagd_edg(1:nedge)=0
565 kremnode_edg_save(1:nrtm+1) = 0
566 nbr_insert_ii(1:nrtm) = 0
567 jjj = 0
568 nnrem_edg = 0
569 DO ii=1,nrtm
570 k = intbuf_tab(n)%KREMNODE(ii)+1
571 l = intbuf_tab(n)%KREMNODE(ii+1)
572 DO m=k,l
573 nn = intbuf_tab(n)%REMNODE(m)
574 IF ((inod2lin(nn+1)-inod2lin(nn))/=0) THEN
575 DO ie=inod2lin(nn),inod2lin(nn+1)-1
576 iedgs = nod2lin(ie)
577 IF (tagd_edg(iedgs)==0) THEN
578 nnrem_edg = nnrem_edg + 1
579 tagd_edg(iedgs)=1
580 jjj = jjj + 1
581 inserted_edg(jjj) = iedgs
582 nbr_insert_ii(ii) = nbr_insert_ii(ii) +1
583 ENDIF
584 ENDDO
585 ENDIF
586 ENDDO
587 kremnode_edg_save(ii+1) = kremnode_edg_save(ii)+nbr_insert_ii(ii)
588 DO m=k,l
589 nn = intbuf_tab(n)%REMNODE(m)
590 IF ((inod2lin(nn+1)-inod2lin(nn))/=0) THEN
591 DO ie=inod2lin(nn),inod2lin(nn+1)-1
592 iedgs = nod2lin(ie)
593 IF (tagd_edg(iedgs)==1) tagd_edg(iedgs)=0
594 ENDDO
595 ENDIF
596 ENDDO
597 ENDDO
598
600
601 intbuf_tab(n)%REMNODE_E2S(1:nnrem_edg) = inserted_edg(1:nnrem_edg)
602 intbuf_tab(n)%KREMNODE_E2S(1:nrtm+1) = kremnode_edg_save(1:nrtm+1)
603 intbuf_tab(n)%KREMNODE_E2S(1)=0
604 DO ii=1,nrtm+1
605 intbuf_tab(n)%KREMNODE_E2S(ii) =intbuf_tab(n)%KREMNODE_E2S(ii)+1
606 ENDDO
607
608 DEALLOCATE(nbr_insert_ii,kremnode_edg_save,inserted_edg)
609
610
611 IF(flag_output>0) THEN
612
614 . msgtype=msgwarning,
615 . anmode=aninfo_blind_1,
617 . c1=titr,
618 . i2=nnrem_edg)
619 ENDIF
620
621 ENDIF
622
623
624
625
626
627 IF(sh_edge > 0) THEN
628
629
630 ALLOCATE(tag_nd(numnod))
631 ALLOCATE(idx_nd(numnod))
632 ALLOCATE(tag_nde(numnod))
633
634 ALLOCATE( nbr_insert_ii(nedge) )
635 ALLOCATE( adress_ii(nedge) )
636 ALLOCATE( kremnode_edg_save(nedge+1) )
637 nbr_insert_ii(1:nedge) = 0
638 adress_ii(1:nedge) = 0
639 kremnode_edg_save(1:nedge+1) = 0
640
641
642 jjj = 0
643 nnrem_edg = 0
644
645 tagd_edg(1:nedge)=0
646 tag_nd(1:numnod) = 0
647 idx_nd(1:numnod) = 0
648 tag_nde(1:numnod) = 0
649 nremov_edg = ipari(94,n)
650 iada= 1
651 IF(nremov_edg>0) kremnode_edg_save(1:nedge+1) = intbuf_tab(n)%KREMNODE_EDG(1:nedge+1)
652
653 size_inserted_edg = 1
654 max_inserted_edg = 1
655 max_inserted_i2 = 1
656 DO ii=1,nedge
657 DO j=5,6
658 nm = intbuf_tab(n)%LEDGE(j+(ii-1)*nledge)
659 IF (points_i2n(nm,1)/=0) THEN
660 max_inserted_i2 =
max( max_inserted_i2,points_i2n(nm,2)-points_i2n(nm,1) )
661 DO i=points_i2n(nm,1),points_i2n(nm,2)
662 max_inserted_edg =
max( max_inserted_edg,(inod2lin(nm+1)-inod2lin(nm)) )
663 ENDDO
664 ENDIF
665 ENDDO
666 ENDDO
667
668
669
670 limit = huge(nedge) / 8
671 IF( nedge > limit ) THEN
672 size_inserted_edg = huge(nedge)
673 ELSE IF ( max_inserted_edg > limit / (nedge)) THEN
674 size_inserted_edg = huge(nedge)
675 ELSE IF (max_inserted_i2 > limit / (nedge*max_inserted_edg)) THEN
676 size_inserted_edg = huge(nedge)
677 ELSE
678 size_inserted_edg = 8 * nedge *max_inserted_edg *max_inserted_i2
679 ENDIF
680
681 CALL my_alloc(inserted_edg,size_inserted_edg)
682
683 DO ii=1,nedge
684 nnrem_edg_save = nnrem_edg
685
686
687 IF(flagremnode==2)THEN
688 ki = intbuf_tab(n)%KREMNODE_EDG(ii)
689 kl = intbuf_tab(n)%KREMNODE_EDG(ii+1) -1
690 DO j=ki,kl
691 es = intbuf_tab(n)%REMNODE_EDG(j)
692 tagd_edg(es)=1
693 END DO
694 ENDIF
695
696
697 IF(jjj + max_inserted_edg*max_inserted_i2 > size_inserted_edg) THEN
698
699 oldsize = size_inserted_edg
700 size_inserted_edg = size_inserted_edg +
max(nedge,max_inserted_edg*max_inserted_i2)
701 CALL my_alloc(tmp_edg,size_inserted_edg)
702 tmp_edg(1:oldsize) = inserted_edg(1:oldsize)
703
704 CALL move_alloc(tmp_edg,inserted_edg)
705 ENDIF
706
707 nd_tag = 0
708 DO j=5,6
709 nm = intbuf_tab(n)%LEDGE(j+(ii-1)*nledge)
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725 IF (points_i2n(nm,1)/=0) THEN
726 DO i=points_i2n(nm,1),points_i2n(nm,2)
727 n2 = i2node(i,2)
728 is = i2node(i,3) !node
id
729 IF (is >0) THEN
730 ns = intbuf_tab(n2)%NSV(is)
731 IF (((inod2lin(ns+1)-inod2lin(ns))/=0).AND.(tag_nde(ns)==0)) THEN
732 tag_nde(ns)=1
733 DO ie=inod2lin(ns),inod2lin(ns+1)-1
734 iedgs = nod2lin(ie)
735 IF (tagd_edg(iedgs)==0) THEN
736 nnrem_edg = nnrem_edg + 1
737 tagd_edg(iedgs)=1
738 jjj = jjj + 1
739 inserted_edg(jjj) = iedgs
740 nes = intbuf_tab(n)%LEDGE(5+(iedgs-1)*nledge)
741 tag_nd(nes) = tag_nd(nes) +1
742 nd_tag = nd_tag + 1
743 idx_nd( nd_tag)=nes
744 nes = intbuf_tab(n)%LEDGE(6+(iedgs-1)*nledge)
745 tag_nd(nes) = tag_nd(nes) +1
746 nd_tag = nd_tag +1
747 idx_nd( nd_tag)=nes
748 END IF
749 ENDDO
750 ENDIF
751 ELSEIF (is <0) THEN
752 iis = -is
753 l = intbuf_tab(n2)%IRTLM(iis)
754 nnod_2 = 4
755
756 IF( intbuf_tab(n2)%IRECTM(4*(l-1)+4)==intbuf_tab(n2)%IRECTM
757 DO iii = 1,nnod_2
758 nm2 = intbuf_tab(n2)%IRECTM(4*(l-1)+iii)
759 IF (((inod2lin(nm2+1)-inod2lin(nm2))/=0).AND.(tag_nde(nm2)==0)) THEN
760 tag_nde(nm2)=1
761 DO ie=inod2lin(nm2),inod2lin(nm2+1)-1
762 iedgs = nod2lin(ie)
763 IF (tagd_edg(iedgs)==0) THEN
764 nnrem_edg = nnrem_edg + 1
765 tagd_edg(iedgs)=1
766 jjj = jjj + 1
767 inserted_edg(jjj) = iedgs
768 nes = intbuf_tab(n)%LEDGE(5+(iedgs-1)*nledge)
769 tag_nd(nes) = tag_nd(nes) +1
770 nd_tag = nd_tag +1
771 idx_nd( nd_tag)=nes
772 nes = intbuf_tab(n)%LEDGE(6+(iedgs-1)*nledge)
773 tag_nd(nes) = tag_nd(nes) +1
774 nd_tag = nd_tag +1
775 idx_nd( nd_tag)=nes
776 END IF
777 ENDDO
778 ENDIF
779 ENDDO
780 END IF
781 ENDDO
782 ENDIF
783 END DO
784
785
786
787
788
789 DO nd = 1,nd_tag
790 nes = idx_nd( nd)
791 IF(tag_nd(nes) ==1)THEN
792 IF ((inod2lin(nes+1)-inod2lin(nes))/=0) THEN
793 DO ie=inod2lin(nes),inod2lin(nes+1)-1
794 iedgs = nod2lin(ie)
795 DO j=5,6
796 nm =intbuf_tab(n)%LEDGE(j+(iedgs-1)*nledge)
797
798 IF(tag_nd(nm)==1.AND.tagd_edg(iedgs) ==0) THEN
799 nnrem_edg = nnrem_edg + 1
800 tagd_edg(iedgs)=1
801 jjj = jjj + 1
802 inserted_edg(jjj) = iedgs
803 ENDIF
804 ENDDO
805 ENDDO
806 ENDIF
807 ENDIF
808 ENDDO
809
810
811
812
813 nbr_insert_ii(ii) = nnrem_edg - nnrem_edg_save
814 kremnode_edg_save(ii) = kremnode_edg_save(ii+1) - kremnode_edg_save(ii)
815 iada = iada + kremnode_edg_save(ii)
816
817 adress_ii(ii) = iada
818 kremnode_edg_save(ii) = iada + nbr_insert_ii(ii) - 1
819 iada = iada + nbr_insert_ii(ii)
820
821
822
823
824 DO nd = 1,nd_tag
825 nes = idx_nd( nd)
826 IF(tag_nd(nes) ==1)THEN
827 IF ((inod2lin(nes+1)-inod2lin(nes))/=0) THEN
828 DO ie=inod2lin(nes),inod2lin(nes+1)-1
829 iedgs = nod2lin(ie)
830 DO j=5,6
831 nm =intbuf_tab(n)%LEDGE(j+(iedgs-1)*nledge
832 IF(tagd_edg(iedgs) ==1) tagd_edg(iedgs)=0
833 ENDDO
834 ENDDO
835 ENDIF
836 ENDIF
837 ENDDO
838 DO j=5,6
839 nm = intbuf_tab(n)%LEDGE(j+(ii-1)*nledge)
840 IF (points_i2n(nm,1)/=0) THEN
841 DO i=points_i2n(nm,1),points_i2n(nm,2)
842 n2 = i2node(i,2)
843 is = i2node(i,3)
844 IF (is >0) THEN
845 ns = intbuf_tab(n2)%NSV(is)
846 IF (((inod2lin(ns+1)-inod2lin(ns))/=0).AND.(tag_nde(ns)==1)) THEN
847 tag_nde(ns)=0
848 DO ie=inod2lin(ns),inod2lin(ns+1)-1
849 iedgs = nod2lin(ie)
850 IF (tagd_edg(iedgs)==1) THEN
851 tagd_edg(iedgs)=0
852 nes = intbuf_tab(n)%LEDGE(5+(iedgs-1)*nledge)
853 tag_nd(nes) = 0
854 nes = intbuf_tab(n)%LEDGE(6+(iedgs-1)*nledge)
855 tag_nd(nes) = 0
856 ENDIF
857 ENDDO
858 ENDIF
859 ELSEIF (is <0) THEN
860 iis = -is
861 l = intbuf_tab(n2)%IRTLM(iis)
862 nnod_2 = 4
863 IF( intbuf_tab(n2)%IRECTM(4*(l-1)+4)==intbuf_tab(n2)%IRECTM(4*(l-1)+3) ) nnod_2 = 3
864 DO iii = 1,nnod_2
865 nm2 = intbuf_tab(n2)%IRECTM(4*(l-1)+iii)
866 IF ((inod2lin(nm2+1)-inod2lin(nm2))/=0.AND.(tag_nde(nm2)==1)) THEN
867 tag_nde(nm2)=0
868 DO ie=inod2lin(nm2),inod2lin(nm2+1)-1
869 iedgs = nod2lin(ie)
870 IF (tagd_edg(iedgs)==1) THEN
871 tagd_edg(iedgs)=0
872 nes = intbuf_tab(n)%LEDGE(5+(iedgs-1)*nledge)
873 tag_nd(nes) = 0
874 nes = intbuf_tab(n)%LEDGE(6+(iedgs-1)*nledge)
875 tag_nd(nes) = 0
876 ENDIF
877 ENDDO
878 ENDIF
879 ENDDO
880 END IF
881 END DO
882 ENDIF
883 ENDDO
884
885 IF(flagremnode==2)THEN
886 DO ie=ki,kl
887 iedgs = intbuf_tab(n)%REMNODE_EDG(ie)
888 tagd_edg(iedgs)=0
889 END DO
890 END IF
891
892 END DO
893
894 IF(nnrem_edg>0) THEN
895
896
897 first = 0
898 last = 0
899 DO ii = 1,nedge
900 IF(first==0) THEN
901 IF( nbr_insert_ii(ii)/=0 ) first = ii
902 ENDIF
903 IF(last==0) THEN
904 IF( nbr_insert_ii(nedge+1-ii)/=0 ) last = nedge+1-ii
905 ENDIF
906 ENDDO
907
908 total_inserted = 0
909 DO ii=1,nedge
910 total_inserted = total_inserted + nbr_insert_ii(ii)
911 ENDDO
912
913 ALLOCATE( remnode_edg(nremov_edg+total_inserted) )
914
915 j = 0
916 i = 0
917 offset = 0
918 IF( first>0 ) THEN
919
920
921 IF( adress_ii(first)>1 ) THEN
922 remnode_edg(1:adress_ii(first)-1) = intbuf_tab(n)%REMNODE_EDG(1:adress_ii(first)-1)
923 offset = offset + adress_ii(first)-1
924 i = i + adress_ii(first)-1
925 ENDIF
926
927 DO ii=first,last
928
929 IF( nbr_insert_ii(ii)>0 ) THEN
930 DO jj = 1,nbr_insert_ii(ii)
931 j = j + 1
932 remnode_edg(offset+nbr_insert_ii(ii)+1-jj) = inserted_edg(j)
933 ENDDO
934 offset = offset + nbr_insert_ii(ii)
935 ENDIF
936 IF(ii<last.AND.nremov_edg>0) THEN
937
938 nbr_intra = adress_ii(ii+1) - adress_ii(ii)-nbr_insert_ii(ii)
939 IF( nbr_intra>0 )THEN
940 DO jj = 1,nbr_intra
941 i = i + 1
942 remnode_edg(jj+offset) = intbuf_tab(n)%REMNODE_EDG(i)
943 ENDDO
944 offset = offset + nbr_intra
945 ENDIF
946 ENDIF
947 ENDDO
948 ENDIF
949
950
951 IF( i<nremov_edg ) THEN
952 nbr_extra = nremov_edg - i
953 remnode_edg(offset+1:offset+nbr_extra) = intbuf_tab(n)%REMNODE_EDG(i+1:nremov_edg)
954 ENDIF
955
956 nnrem_edg = nnrem_edg + nremov_edg
958 intbuf_tab(n)%REMNODE_EDG(1
959 intbuf_tab
960 intbuf_tab(n)%KREMNODE_EDG(1)=0
961 DO ii=1,nedge+1
962 intbuf_tab(n)%KREMNODE_EDG(ii) =intbuf_tab(n)%KREMNODE_EDG(ii)+1
963 ENDDO
964
965 IF(flag_output>0) THEN
966
968 . msgtype=msgwarning,
969 . anmode=aninfo_blind_1,
971 . c1=titr,
972 . i2=nnrem_edg)
973 ENDIF
974
975
976 nremov_edg = nnrem_edg
977 END IF
978 IF(ALLOCATED(remnode_edg)) DEALLOCATE( remnode_edg )
979 IF(ALLOCATED(inserted_edg)) DEALLOCATE( inserted_edg )
980
981
982
983 DEALLOCATE( nbr_insert_ii )
984 DEALLOCATE( adress_ii )
985 DEALLOCATE( kremnode_edg_save )
986
987 DEALLOCATE(tagd_edg,tag_nd,idx_nd,tag_nde)
988
989 ENDIF
990
991 DEALLOCATE(inod2lin,nod2lin)
992
993 RETURN
for(i8=*sizetab-1;i8 >=0;i8--)
integer, parameter nchartitle
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)
subroutine upgrade_remnode_edg2(ipari, nremnode, intbuf_tab)
subroutine upgrade_remnode_e2s(ipari, nremnode, intbuf_tab)