prdiff
C PRDIFF SOURCE SP204843 24/04/26 21:15:01 11921 C INTERFACE ENTRE LA DIRECTIVE "DIFF" (DIFFERENCE SYMETRIQUE) ET LE C SOUS PROGRAMME OUEXCL C C Modif : 2014 C. BERTHINIER C Dans le cas de la DIFF de 2 MELEME SIMPLE du meme TYPE, si C Le résultat est VIDE il est du même type que le MELEME C SIMPLE donné en argument C SUBROUTINE PRDIFF IMPLICIT INTEGER(I-N) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMMODEL -INC SMRIGID C C---- OBJETS DE TYPE RIGIDITE C IF (IERR.NE.0) RETURN IF (IRETOU.EQ.1) THEN IF (IERR.NE.0) RETURN RETURN ENDIF C C---- OBJETS DE TYPE MODELE C IF (IERR.NE.0) RETURN IF (IRETOU.EQ.1) THEN IF (IERR.NE.0) RETURN RETURN ENDIF C C---- OBJETS DE TYPE MAILLAGE C NBSOUS =0 IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (IPT1.LISOUS(/1).NE.0) GOTO 10 IF (IPT2.LISOUS(/1).NE.0) GOTO 11 C Cas ou 1 des deux maillages est vide : IF (IPT1.NUM(/2).EQ.0) THEN IPT3 = IPT2 GOTO 9000 ENDIF IF (IPT2.NUM(/2).EQ.0) THEN IPT3 = IPT1 GOTO 9000 ENDIF IF ((IPT1.ITYPEL .EQ. IPT2.ITYPEL) .AND. & (IPT1.NUM(/1) .EQ. IPT2.NUM(/1)) ) THEN C Cas de deux MAILLAGES SIMPLES, de même TYPE et même NBNN IF (IPT1.EQ.IPT2) THEN C Les deux maillages sont identiques : résultat vide du même type ity=ipt1.itypel ELSE C OU Exclusif sur IPT1 et IPT2 IF (IPT3.EQ.0) THEN C le résultat est vide on lui met le même type ity=ipt1.itypel ENDIF ENDIF ELSE C Cas de deux MAILLAGES SIMPLES, de TYPE ou NBNN différent C Adjonction directe des deux sous-maillages simples de structure différente C C'est le cas des maillages polyedriques dont NBNN peut varier pour le même ITYPEL NBELEM =0 NBNN =0 NBREF =0 NBSOUS =2 SEGINI IPT3 IPT3.LISOUS(1)=IPT1 IPT3.LISOUS(2)=IPT2 ENDIF IF (IERR.NE.0) RETURN GOTO 1000 C Cas d'un MAILLAGE SIMPLE et l'autre COMPLEXE C On intervertit pour que le premier soit le MAILLAGE COMPLEXE C IPT1 : MELEME COMPLEXE C IPT2 : MELEME SIMPLE 10 IF (IPT2.LISOUS(/1).NE.0) GOTO 20 GOTO 12 11 IP=IPT2 IPT2=IPT1 IPT1=IP 12 CONTINUE DO 13 IS=1,IPT1.LISOUS(/1) IPT4=IPT1.LISOUS(IS) IF (IPT2.NUM(/1).EQ.IPT4.NUM(/1)) THEN IF (IPT2.ITYPEL.EQ.IPT4.ITYPEL) GOTO 14 ENDIF 13 CONTINUE NBELEM=0 NBNN =0 NBREF =0 NBSOU1=IPT1.LISOUS(/1) NBSOUS=NBSOU1+1 SEGINI IPT3 C LES MELEME SIMPLES de IPT1 et IPT2 sont placés dans IPT3 DO 15 IS=1,NBSOU1 IPT3.LISOUS(IS)=IPT1.LISOUS(IS) 15 CONTINUE IPT3.LISOUS(NBSOUS)=IPT2 GOTO 1000 14 IF (IPT2.EQ.IPT4) GOTO 17 IF (IERR.NE.0) RETURN IF (IPT5.EQ.0) GOTO 17 NBSOUS=IPT1.LISOUS(/1) NBNN=0 NBREF=0 NBELEM=0 SEGINI IPT3 DO 16 IS2=1,NBSOUS IPT3.LISOUS(IS2)=IPT1.LISOUS(IS2) IF (IS.EQ.IS2) IPT3.LISOUS(IS2)=IPT5 16 CONTINUE GOTO 1000 17 CONTINUE C-------- Cas d'un maillage vide --------------------------------- NBSOUS=IPT1.LISOUS(/1) IF (NBSOUS.EQ.0) THEN ELSE NBNN =0 NBREF =0 NBELEM=0 NBSOUS=IPT1.LISOUS(/1)-1 SEGINI IPT3 IS3=0 DO 18 IS2=1,(NBSOUS + 1) IF (IS2.EQ.IS) GOTO 18 IS3=IS3+1 IPT3.LISOUS(IS3)=IPT1.LISOUS(IS2) 18 CONTINUE ENDIF GOTO 1000 C---- Les deux maillages entrés sont complexes 20 CONTINUE NBSOU1=IPT1.LISOUS(/1) NBSOU2=IPT2.LISOUS(/1) NBELEM=0 NBNN =0 NBREF =0 NBSOUS=NBSOU1+NBSOU2 SEGINI IPT4 DO 21 I1=1,NBSOU1 IPT4.LISOUS(I1)=IPT1.LISOUS(I1) 21 CONTINUE ISUP=0 ITYP=IPT5.ITYPEL DO 23 I1=1,NBSOU1 IPT6=IPT4.LISOUS(I1) IF (IPT6.EQ.0) GOTO 23 IF (IPT6.ITYPEL .NE. ITYP) GOTO 23 IF (IPT6.NUM(/1).NE.IPT5.NUM(/1)) GOTO 23 IF (IPT5.EQ.IPT6) GOTO 25 IF (IERR.NE.0) RETURN IF (IPT7.EQ.0) GOTO 25 IPT4.LISOUS(I1)=IPT7 ISUP=ISUP+1 GOTO 22 25 ISUP=ISUP+2 IPT4.LISOUS(I1)=0 GOTO 22 23 CONTINUE 22 CONTINUE IF (ISUP.EQ.0) GOTO 30 NBSOUS=NBSOUS-ISUP C-------- Cas d'un maillage vide --------------------------------- IF (NBSOUS.EQ.0) THEN segact ipt3 GOTO 1000 ENDIF SEGINI IPT3 JS=0 DO 35 IS=1,NBSOUS 36 JS=JS+1 IF (IPT4.LISOUS(JS).EQ.0) GOTO 36 IPT3.LISOUS(IS)=IPT4.LISOUS(JS) 35 CONTINUE SEGSUP IPT4 IF (NBSOUS.NE.1) GOTO 1000 IPT4=IPT3.LISOUS(1) SEGSUP IPT3 30 IPT3=IPT4 1000 CONTINUE C C Nettoyage du maillage dans le cas ou il contient des sous-parties vides C NBSOUS = IPT3.LISOUS(/1) IF (NBSOUS .NE. 0) THEN C Cas du maillage résultat ayant plusieurs sous zones DO 1010 I=1,IPT3.LISOUS(/1) MELEME = IPT3.LISOUS(I) IF (NUM(/2) .EQ. 0) THEN C la sous partie vide est supprimée + tassement du tableau LISOUS DO 1020 J=I+1,IPT3.LISOUS(/1) IPT3.LISOUS(J-1)=IPT3.LISOUS(J) 1020 CONTINUE NBSOUS = NBSOUS - 1 ENDIF 1010 CONTINUE IF ( NBSOUS .EQ. 0 ) THEN ELSEIF ( NBSOUS .EQ. 1 ) THEN C Passage en MELEME SIMPLE à nouveau IPT3 = IPT3.LISOUS(1) IF(IPT3.NUM(/2) .EQ. 0) THEN ENDIF ELSEIF ( NBSOUS .NE. IPT3.LISOUS(/1) ) THEN C Le segment MELEME COMPLEXE est ajusté NBNN = 0 NBELEM = 0 NBREF = 0 SEGADJ IPT3 ENDIF ENDIF 9000 CONTINUE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales