elchpo
C ELCHPO SOURCE CB215821 20/11/25 13:27:10 10792 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 / ACTIF en SORTIE c 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======================================================================= IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCHPOI -INC SMELEME -INC SMCOORD -INC TMTRAV SEGMENT MTR1 CHARACTER*(LOCOMP) TINCO(NNIN) ENDSEGMENT SEGMENT MTR2 INTEGER TIBIN(NNINR,NNNOER) REAL*8 TBB(NNINR,NNNOER) ENDSEGMENT SEGMENT MTR3 INTEGER TGEO(TGEOD) ENDSEGMENT SEGMENT MTR3I INTEGER ITGEO(ITGEOD) ENDSEGMENT SEGMENT MTR4 INTEGER THARM(0) ENDSEGMENT SEGMENT MTR5 INTEGER ICO(NC) ENDSEGMENT INTEGER TGEOD CHARACTER*(LOCOMP) 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 RETURN ENDIF c on eclate le champ par point dans le segment mtrav NNINR=10 NNNOER=10000 NNIN=0 NNNOE=0 TGEOD =1000 ITGEOD=1000 SEGINI,MTR1,MTR2,MTR3,MTR3I,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,MTR3I,MTR4 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) DO 40 j=1,NOE c pour savoir si le noeud j appartient a geo jnoe=NUM(1,j) if (jnoe.gt.ITGEOD) then ITGEOD=jnoe*2 segadj mtr3i endif IF (itgeo(jnoe).ne.0) goto 40 c le noeud n'etait pas dans la pile NNNOE=NNNOE+1 if (nnnoe.gt.tgeod) then tgeod=nnnoe*2 segadj mtr3 endif TGEO(nnnoe)=jnoe itgeo(jnoe)=nnnoe 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 if (nnin.gt.nninr) then nninr=nnin+10 endif if (nnnoe.gt.nnnoer) then nnnoer=nnnoe+10000 endif if (nninr.ne.tibin(/1).or.nnnoer.ne.tibin(/2)) 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=itgeo(num(1,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) 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 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 SEGSUP,MTR5 60 CONTINUE C= Remplissage du segment MTRAV (ITRAV) SEGINI,MTRAV DO i=1,NNIN 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 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 SEGSUP,MCHPO1 SEGSUP,MTR1,MTR2,MTR3,MTR3I,MTR4,MTRAV RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales