rlexvb
C RLEXVB SOURCE PV 20/03/30 21:24:21 10567 C C**** Variables de COOPTIO C C INTEGER IPLLB, IERPER, IERMAX, IERR, INTERR C & ,IOTER, IOLEC, IOIMP, IOCAR, IOACQ C & ,IOPER, IOSGB, IOGRA, IOSAU, IORES C & ,IECHO, IIMPI, IOSPI C & ,IDIM CC & ,MCOORD C & ,IFOMOD, NIFOUR, IFOUR, NSDPGE, IONIVE C & ,NGMAXY, IZROSF, ISOTYP, IOSCR,LTEXLU C & ,NORINC,NORVAL,NORIND,NORVAD C & ,NUCROU, IPSAUV C IMPLICIT INTEGER(I-N) INTEGER NSOMM, LAST, NTOTN, NTOTE, NBSOUS, NBELEM, NBNO & , IELEM, NGF, NGF1, INOEU, NGS1, NLS1, ISOUS & , IPOS1, IPOSV1, NVOIS1, INOEU2, NGS2, NLS2 & , IVOIS, IPOS, IELEMF, I1 LOGICAL LOGCON C -INC SMCOORD -INC SMELEME INTEGER JG -INC SMLENTI -INC PPARAM -INC CCOPTIO C INTEGER NBL, NBTPOI SEGMENT MLELEM INTEGER INDEX(NBL+1) INTEGER LESPOI(NBTPOI) ENDSEGMENT C POINTEUR MELSOM.MELEME, MELFL.MELEME, MELFP.MELEME & ,MLESOM.MLENTI, MLEFP.MLENTI, MPOS.MLENTI, MTOUC.MLENTI & ,MLELE1.MLELEM, MELFP1.MELEME C C**** Le MELEME SOMMET C C C MLESOM: numerotation globale -> locale C C**** En KRIPAD C SEGACT MELSOM C SEGINI MLESOM C NSOMM = MELSOM.NUM(/2) JG=NSOMM SEGINI MTOUC C MTOUC.LECT(NLS1) = surestimation de nombre de voisins de NLS1 SEGINI MPOS C MPOS.LECT + LAST : liste chaînée des sommets sur le bord LAST=-1 C SEGACT MELFP C C**** En 2D MELFP est un maillage elementaire C En 3D pas à priori C C NTOTE : nombre total d'elts dans la même structure C NTOTN = 0 NTOTE = 0 NBSOUS=MELFP.LISOUS(/1) C NBSOUS=0 fais un peux chier! JG=MAX(NBSOUS,1) SEGINI MLEFP IF(NBSOUS .EQ. 0)THEN MLEFP.LECT(1)=MELFP ELSE DO ISOUS=1,NBSOUS,1 MLEFP.LECT(ISOUS)=MELFP.LISOUS(ISOUS) ENDDO ENDIF SEGDES MELFP C SEGACT MELFL NBSOUS=MELFL.LISOUS(/1) IF(NBSOUS .NE. 0)THEN WRITE(IOIMP,*) 'FACEL = ???' WRITE(IOIMP,*) 'Subroutine rlexvb.eso' GOTO 9999 ENDIF C NBSOUS=JG IELEMF=0 DO ISOUS = 1, NBSOUS, 1 MELFP1=MLEFP.LECT(ISOUS) SEGACT MELFP1 NBELEM=MELFP1.NUM(/2) DO IELEM = 1, NBELEM,1 IELEMF=IELEMF+1 NGF1=MELFL.NUM(2,IELEMF) IF(NGF .NE. NGF1)THEN WRITE(IOIMP,*) 'FACEL = ???' WRITE(IOIMP,*) 'Subroutine rlexvb.eso' GOTO 9999 ENDIF IF(MELFL.NUM(1,IELEMF) .EQ. MELFL.NUM(3,IELEMF))THEN C C************* La face est sur le bord C NGS1 = MELFP1.NUM(INOEU,IELEM) NLS1 = MLESOM.LECT(NGS1) IF(MPOS.LECT(NLS1).EQ.0)THEN NTOTE=NTOTE+1 MPOS.LECT(NLS1)=LAST LAST=NLS1 ENDIF ENDDO ENDIF ENDDO ENDDO C C NTOTN : nombre total de noeuds dans la structure sommets de bords C + sommets voisins C N.B. Les sommets voisins peuvent ne pas etre sur le bord C NTOTN = 0 DO ISOUS = 1, NBSOUS, 1 MELFP1=MLEFP.LECT(ISOUS) NBELEM=MELFP1.NUM(/2) DO IELEM = 1, NBELEM,1 NGS1 = MELFP1.NUM(INOEU,IELEM) NLS1 = MLESOM.LECT(NGS1) IF(MPOS.LECT(NLS1).NE.0)THEN C C******************** Le sommet est sur le bord C ENDIF ENDDO ENDDO ENDDO C C**** On stoke l'informaton dans une LISTE SEQUENTIELLE INDEXEE D'ELEMENTS C C NBL : NOMBRE D'ELEMENTS C NBTPOI : NOMBRE TOTAL DE POINTS REFERENCEES C INDEX(I) : INDICE DU 1ER POINT DU IEME ELEMENT C DANS LE TABLEAU LESPOI C LESPOI(INDEX(I) -> INDEX(I+1)-1) : NUMERO DES NOEUDS C DU IEME ELEMENT C C En plus, après le REPEAT UNTIL, C MPOS.LECT(NLS1) = position du sommet NLS1 i.e. C J=MPOS.LECT(NLS1) -> NLS1=LESPOI(INDEX(J)) C se voisins sont dedans LESPOI(INDEX(J)+1 -> INDEX(I+1)-1) NBL=NTOTE NBTPOI=NBL+NTOTN SEGINI MLELEM IPOS1=0 MLELEM.INDEX(1)=1 C C**** REPEAT UNTIL C 1 CONTINUE NLS1 = LAST IF(NLS1 .NE. -1)THEN IPOS1=IPOS1+1 MLELEM.LESPOI(MLELEM.INDEX(IPOS1))=NLS1 LAST = MPOS.LECT(NLS1) MPOS.LECT(NLS1)=IPOS1 MLELEM.INDEX(IPOS1+1)=MLELEM.INDEX(IPOS1)+MTOUC.LECT(NLS1)+1 MTOUC.LECT(NLS1)=0 GOTO 1 ENDIF C C**** N.B. MTOUC.LECT(I) = 0 \forall I C C Fin REPEAT UNTIL C On remplie LESPOI C DO ISOUS = 1, NBSOUS, 1 MELFP1 = MLEFP.LECT(ISOUS) NBELEM=MELFP1.NUM(/2) DO IELEM = 1, NBELEM, 1 NGS1 = MELFP1.NUM(INOEU,IELEM) NLS1 = MLESOM.LECT(NGS1) C IPOS1 = 0 -> NGS1 n'est pas sur le bords C IPOS1 = C > 0 C C= position de NGS1 (NLS1) dedans MLELEM.INDEX IPOS1 = MPOS.LECT(NLS1) IF(IPOS1 .GT. 0)THEN C C IPOSV1 = position du premier voisin de NLS1 dedans C MLEMEM.LESPOI IPOSV1 = MLELEM.INDEX(IPOS1)+1 C NVOIS1 = surestimation du nombre de voisins de NLS1 NVOIS1 = MLELEM.INDEX(IPOS1+1)-IPOSV1 NGS2=MELFP1.NUM(INOEU2,IELEM) IF(NGS1 .NE. NGS2)THEN NLS2 = MLESOM.LECT(NGS2) IVOIS=0 C C**************** REPEAT UNTIL C 10 CONTINUE IF(MLELEM.LESPOI(IPOSV1+IVOIS) .EQ. 0)THEN MTOUC.LECT(NLS1)=MTOUC.LECT(NLS1)+1 MLELEM.LESPOI(IPOSV1+IVOIS) = NLS2 ELSE LOGCON = (NLS2 .NE. MLELEM.LESPOI(IPOSV1 $ +IVOIS)) IVOIS=IVOIS+1 IF(LOGCON)THEN IF(IVOIS .GT. NVOIS1)THEN C C************************* Il y a un erreur de programmation (NVOIS1 n'a C pas bien été évalué) C WRITE(IOIMP,*) 'Subroutine rlexvb.eso' GOTO 9999 ELSE GOTO 10 ENDIF ENDIF ENDIF ENDIF ENDDO ENDIF ENDDO ENDDO SEGDES MELFP1 ENDDO SEGSUP MLEFP C C**** LESPOI SURDIMENSIONÉ C NBTPOI=0 DO IELEM = 1 , NTOTE, 1 NLS1 = MLELEM.LESPOI(MLELEM.INDEX(IELEM)) NBTPOI=NBTPOI+1+MTOUC.LECT(NLS1) ENDDO NBL=NTOTE SEGINI MLELE1 C MLELE1.INDEX(1)=1 DO IELEM = 1, NBL , 1 IPOS=MLELEM.INDEX(IELEM) IPOS1=MLELE1.INDEX(IELEM) NLS1 = MLELEM.LESPOI(IPOS) NGS1 = MELSOM.NUM(1,NLS1) NVOIS1 = MTOUC.LECT(NLS1) MLELE1.LESPOI(IPOS1)=NGS1 MLELE1.INDEX(IELEM+1)=MLELE1.INDEX(IELEM)+NVOIS1+1 DO INOEU = 1, NVOIS1, 1 NLS2 = MLELEM.LESPOI(IPOS+INOEU) IF(NLS2 .EQ.0)THEN WRITE(IOIMP,*) 'Subroutine rlexvb.eso' GOTO 9999 ELSE NGS2=MELSOM.NUM(1,NLS2) MLELE1.LESPOI(IPOS1+INOEU)=NGS2 ENDIF ENDDO ENDDO C SEGSUP MLELEM MLELEM=MLELE1 C SEGSUP MLESOM SEGSUP MPOS SEGSUP MTOUC SEGDES MLELEM SEGDES MELSOM SEGDES MELFL C C**** Problème détecté dans un cas test: mal-conditionnent C de la matrice associé à la méthode de moindres carres C aux bords. C Quand possible, on elimine de MLELEM tous les voisins C sommets qui sont sur le bord -> MLELE1 C SEGACT MLELEM NBL=MLELEM.INDEX(/1)-1 NBTPOI=MLELEM.LESPOI(/1) SEGINI MLELE1 C C**** MLESOM.MLENTI contient les sommets aux bords C JG=nbpts SEGINI MLESOM DO IELEM=1,NBL,1 IPOS=MLELEM.INDEX(IELEM) NGS1=MLELEM.LESPOI(IPOS) MLESOM.LECT(NGS1)=IELEM ENDDO C C C**** On rempli MLELE1 C NBTPOI=0 NVOIS1=0 C C**** Pour chaque SOMMET NGS1, NVOIS1 = nombre des voisins qui ne C sont pas sur le bords C IPOS1=MLELEM.INDEX(1) DO IELEM=1,NBL,1 IPOS=IPOS1 IPOS1=MLELEM.INDEX(1+IELEM) NBTPOI=NBTPOI+1 MLELE1.INDEX(IELEM)=NBTPOI NGS1=MLELEM.LESPOI(IPOS) MLELE1.LESPOI(NBTPOI)=NGS1 DO I1=IPOS+1,IPOS1-1,1 NGS2=MLELEM.LESPOI(I1) NLS2=MLESOM.LECT(NGS2) IF(NLS2.EQ.0)THEN C C************* NGS2 n'est pas sur le bord C NVOIS1=NVOIS1+1 MLELE1.LESPOI(NBTPOI+NVOIS1)=NGS2 ENDIF ENDDO IF(NVOIS1.EQ.0)THEN C C********** Tous les voisins de NGS1 sont sur le bords C DO I1=IPOS+1,IPOS1-1,1 NGS2=MLELEM.LESPOI(I1) NVOIS1=NVOIS1+1 MLELE1.LESPOI(NBTPOI+NVOIS1)=NGS2 ENDDO ENDIF NBTPOI=NBTPOI+NVOIS1 NVOIS1=0 ENDDO MLELE1.INDEX(NBL+1)=NBTPOI+1 C SEGSUP MLELEM SEGADJ MLELE1 MLELEM=MLELE1 SEGDES MLELEM SEGSUP MLESOM C 9999 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales