C ELCHPO SOURCE CHAT 06/03/29 21:19:58 5360 C======================================================================= c fonction: c sous routine pour arranger un chpo qui a souffert apres elim c c arguments: c ip1 (e/s) pointeur sur le champ par point c c variables: c * mtrav : - bb(i,j) est la valeur de la ieme inconnue de champ pour c le jieme noeud du tableau igeo . c - inco(nnin) contient le nom des nnin inconnues differentes c - ibin(i,j)=1 ou 0 indique que la ieme inconnue du champ c existe pour le jieme noeud du tableau igeo . c - igeo(i) est le numero a mettre dans un objet meleme pour c referencer le ieme noeud . c C= A. DE GAYFFIER, le 7 juillet 1994. = C======================================================================= SUBROUTINE ELCHPO(IP1,iratt) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC CCOPTIO -INC SMCHPOI -INC SMELEME -INC SMCOORD -INC TMTRAV SEGMENT MTR1 CHARACTER*4 TINCO(NNIN) ENDSEGMENT SEGMENT MTR2 INTEGER TIBIN(NNIN,NNNOE) REAL*8 TBB(NNIN,NNNOE) ENDSEGMENT SEGMENT MTR3 INTEGER TGEO(0) ENDSEGMENT SEGMENT MTR4 INTEGER THARM(0) ENDSEGMENT SEGMENT MTR5 INTEGER ICO(NC) ENDSEGMENT SEGMENT MTR6 INTEGER INO(NOE) ENDSEGMENT PARAMETER (Epsi=1.D-30) CHARACTER*4 cmot LOGICAL FLAG MCHPOI=IP1 SEGACT,MCHPOI C verification de la compatibilite des natures NAT=JATTRI(/1) NATU=NAT IF (NATU.GT.0) THEN NATU=JATTRI(1) ENDIF C la nature est indeterminee on ne peut rien faire IF (NATU.EQ.0) THEN Iratt=2 SEGDES,MCHPOI RETURN ENDIF c on eclate le champ par point dans le segment mtrav NNIN=0 NNNOE=0 SEGINI,MTR1,MTR2,MTR3,MTR4 c boucle sur les msoupo c DO 60 i=1,IPCHP(/1) MSOUPO=IPCHP(i) SEGACT,MSOUPO MPOVAL=IPOVAL IF (MPOVAL.EQ.0) THEN SEGSUP,MTR1,MTR2,MTR3,MTR4 SEGDES,MSOUPO,MCHPOI RETURN ENDIF c c boucle sur les composantes c on remplit tinco avec le nom des composantes NC=NOCOMP(/2) SEGINI,MTR5 DO 20 j=1,NC cmot=NOCOMP(j) DO k=1,NNIN IF (TINCO(k).EQ.cmot) THEN ICO(j)=k GOTO 20 ENDIF ENDDO c il y une inconnue de plus dans tinco NNIN=NNIN+1 ICO(j)=NNIN SEGADJ,MTR1 TINCO(NNIN)=cmot THARM(**)=NOHARM(j) 20 CONTINUE c c boucle sur les noeuds du msoupo MELEME=IGEOC SEGACT,MELEME NOE=NUM(/2) SEGINI,MTR6 DO 40 j=1,NOE c boucle sur les noeuds du tableau geo c pour savoir si le noeud j appartient a geo jnoe=NUM(1,j) DO k=1,NNNOE IF (TGEO(k).EQ.jnoe) THEN INO(j)=k GOTO 40 ENDIF ENDDO c le noeud n'etait pas dans la pile NNNOE=NNNOE+1 INO(j)=NNNOE TGEO(**)=jnoe 40 CONTINUE c c encore une boucle sur les noeuds pour remplir tbb avec les valeurs c ico et ino servent pour retrouver les numeros dans tgeo et tinco SEGADJ,MTR2 SEGACT,MPOVAL DO k=1,NC FLAG=.TRUE. icok=ICO(k) DO j=1,NUM(/2) c il s'agit d'un point double inoj=INO(j) IF (TIBIN(icok,inoj).NE.0) THEN IF (NATU.EQ.2) THEN c le champ est discret on additionne TBB(icok,inoj)=TBB(icok,inoj)+VPOCHA(j,k) ELSE c le champ est diffus il faut l'egalite V1=TBB(icok,inoj) V2=VPOCHA(j,k) VMOY=0.5*(V1+V2)+Epsi c test sur la difference relative c on commence par chercher un ordre de grandeur de la c composante sur la sous zone pour faire un test sur la c valeur absolue de la difference IF (ABS(V2-V1).GT.(1.D-4*ABS(VMOY))) THEN IF (FLAG) THEN THEMAX=0. DO l=1,NUM(/2) THEMAX=MAX(ABS(VPOCHA(l,k)),THEMAX) ENDDO FLAG=.FALSE. ENDIF c il n'y a pas egalite : erreur IF (ABS(V2-V1).GT.(1.D-4*THEMAX)) THEN Iratt=2 c les lignes suivantes sont en commentaire de facon c a traiter quand meme les champ par point diffus dont les c valeurs sont distinctes: on prend la moyenne c SEGDES,MPOVAL,MSOUPO,MELEME c SEGSUP,mtr1,mtr2,mtr3,mtr4,mtr5,mtr6 c RETURN ENDIF ENDIF c on affecte la valeur moyenne dans tous les cas TBB(icok,inoj)=VMOY ENDIF ELSE TBB(icok,inoj)=VPOCHA(j,k) TIBIN(icok,inoj)=1 ENDIF ENDDO ENDDO SEGDES,MPOVAL SEGDES,MELEME SEGSUP,MTR5,MTR6 SEGDES,MSOUPO 60 CONTINUE C= Remplissage du segment MTRAV (ITRAV) SEGINI,MTRAV DO i=1,NNIN INCO(i)=TINCO(i) C*OF NHAR(i)=THARM(i) ENDDO C*OF IF temporaire en attendant operateur remplacant procedure creer_3D IF (IFOMOD.EQ.1) THEN DO i=1,NNIN NHAR(i)=THARM(i) ENDDO ENDIF DO j=1,NNNOE IGEO(j)=TGEO(j) DO i=1,NNIN BB(i,j)=TBB(i,j) IBIN(i,j)=TIBIN(i,j) ENDDO ENDDO ITRAV=MTRAV c reconstuction de la partition CALL CRECHP(ITRAV,ICHP) c on ajuste le contenu du chapeau MCHPO1=ICHP SEGACT,MCHPO1 NSOUPO=MCHPO1.IPCHP(/1) SEGADJ,MCHPOI DO i=1,NSOUPO IPCHP(i)=MCHPO1.IPCHP(i) ENDDO SEGDES,MCHPOI SEGSUP,MCHPO1 SEGSUP,MTR1,MTR2,MTR3,MTR4,MTRAV RETURN END