xtmx
C XTMX SOURCE CB215821 20/11/25 13:43:32 10792 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C C **** MULTIPLICATION D'UNE MATRICE(IRE2) PAR UN CHAMPPOINT (IRE1) A C **** DROITE ET A GAUCHE.LE RESULTAT EST UN FLOTTANT. C **** VA= IRE1 *IRE2 *IRE1 C **** POUR EFFECTUER L OPERATION ON ELIMINE LES COMPOSANTES LX C **** DU CHPOINT ET DE LA MATRICE. ON TESTE QUE LES AUTRES INCONNUES C **** DU CHPOINT SONT INCLUSES DANS CELLES DE L OBJET RIGIDITE. C ON SUPPOSE QUE : C 1. YT ET X SONT DE MEME TYPE C 2. LA MATRICE EST CARREE C 3. LA MATRICE POSSEDE DES CORRESPONDANCES SUR LES INCONNUES C (C'EST A DIRE QUE LA IEME LIGNE EST LA DUALE DE LA IEME COLONNE) C C BP , avril 2010 : on supprime l hypothese 3. C (pour permettre l utilisation de matrices crees par imped par ex.) C -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMELEME -INC SMCHPOI -INC SMRIGID -INC SMCOORD -INC CCHAMP c SEGMENT,IHAR(0) SEGMENT,SIINC CHARACTER*(LOCOMP) IINC(0) ENDSEGMENT SEGMENT/ICCPR/(ICPR(NNGOT)) SEGMENT ITRAV CHARACTER*(LOCOMP) IINCO(NNIN) REAL*8 CC(NLIGMA),VAA(NNIN,ITES),DD(NLIGMA) INTEGER IPOS(NLIGMA) INTEGER IPOS2(NLIGMA) ENDSEGMENT LOGICAL NEEDDD C ITES = NONBRE DE NOEUD DU CHPOINT C NLIGMA = TAILLE MAX D'UNE LIGNE DE MATRICE DE RIGIDITE ELEMENTAIRE C **** INITIALISATION DU RESULTAT VA=0.D0 MRIGID=IRE2 MCHPOI=IRE1 NNGOT=nbpts C C **** ON CREE LES TABLEAUX : C C **** ICPR(I)=J VEUT DIRE QUE LE NOEUD I A LE NUMERO LOCAL J. C SEGINI,ICCPR SEGACT,MCHPOI NSOUPO=IPCHP(/1) IK=0 DO 1 ISOU=1,NSOUPO MSOUPO=IPCHP(ISOU) SEGACT,MSOUPO MELEME=IGEOC SEGACT,MELEME N1=NUM(/1) N2=NUM(/2) * on ajoute le noeud K a ICPR(K) si pas deja vu IF(ICPR(K).NE.0) GO TO 2 IK=IK+1 ICPR(K)=IK 2 CONTINUE C SEGDES,MELEME C SEGDES,MSOUPO 1 CONTINUE C SEGDES,MCHPOI ITES=IK NLIGMA=0 C **** REMPLISSAGE DE IINC et IHAR C = couple(inconnue primale + harmonique) de la matrice MRIGID SEGINI,SIINC SEGINI,IHAR * SEGACT,MRIGID NRIGE=IRIGEL(/1) NRIGEL=IRIGEL(/2) DESCR=IRIGEL(3,1) SEGACT,DESCR * Initialisation de la 1ere valeur IINC(**)=LISINC(1) IHAR(**)=IRIGEL(5,1) ININC=1 * boucle sur les rigidites elementaires DO 3 IRI=1,NRIGEL MELEME=IRIGEL(1,IRI) SEGACT,MELEME DESCR=IRIGEL(3,IRI) NOHAR=IRIGEL(5,IRI) SEGACT,DESCR NLIGRE=LISINC(/2) IF(NLIGRE.GT.NLIGMA) NLIGMA=NLIGRE DO 8 I1=1,ININC IF(NOHAR.EQ.IHAR(I1)) GO TO 7 8 CONTINUE IHAR(**)=NOHAR ININC=ININC+1 7 CONTINUE C SEGDES,DESCR C SEGDES,MELEME 3 CONTINUE C SEGDES,MRIGID C C **** ON INITIALISE LE SEGMENT ITRAV C NNIN=ININC SEGINI,ITRAV DO 10 I=1,NNIN IINCO(I)=IINC(I) 10 CONTINUE C C **** ON INITIALISE VAA (= chpoint) C SEGACT,MCHPOI NSOUPO=IPCHP(/1) c --- boucle sur les zones --- DO 15 ISOU=1,NSOUPO MSOUPO=IPCHP(ISOU) C SEGACT,MSOUPO MELEME=IGEOC C SEGACT,MELEME N2=NUM(/2) NC=NOCOMP(/2) MPOVAL=IPOVAL SEGACT,MPOVAL c -- boucle sur les composantes -- DO 16 INC=1,NC INCOM=NOCOMP(INC) NOHA=NOHARM(INC) DO 17 IH=1,NNIN IF(INCOM.NE.IINCO(IH)) GO TO 17 IF(IHAR(IH).EQ.NOHA) GO TO 18 17 CONTINUE GO TO 16 c on a trouvé le bon couple inconnue primale+harmonique : IH 18 CONTINUE 19 CONTINUE 16 CONTINUE 15 CONTINUE C C **** BOUCLE 20 SUR LES OBJETS RIGIDITES ELEMENTAIRES C C SEGACT,MRIGID DO 20 IRI=1,NRIGEL IANTI=0 IF (NRIGE.GE.7) THEN IANTI=IRIGEL(7,IRI) ENDIF MELEME=IRIGEL(1,IRI) NOHA=IRIGEL(5,IRI) SEGACT,MELEME DESCR=IRIGEL(3,IRI) SEGACT,DESCR C C ** ON VERIFIE QUE: C -LA MATRICE EST CARREE LISI=LISINC(/2) LISD=LISDUA(/2) IF ( LISI.NE.LISD) THEN RETURN ENDIF C -NOELED ET NOELEP SONT LES MEMES DO ITEFR=1,LISI IF( NOELED(ITEFR).NE.NOELEP(ITEFR) ) THEN RETURN ENDIF ENDDO C C ** ON REMPLIT IPOS(I)=J QUI DIT QUE LA IEME INCONNUE PRIMALE C DE LA MATRICE ELEMENTAIRE EST LA JEME DE IINC DO 21 IN=1,LISI DO 22 IJ=1,ININC IF(NOHA.EQ.IHAR(IJ)) GO TO 23 22 CONTINUE 23 CONTINUE IPOS(IN)=IJ 21 CONTINUE C C ** ON ETABLIT LA CORRESPONDANCE INCONNUES PRIMALES ET DUALES C (important si hypothèse 3 non vérifiée) C ** ON REMPLIT IPOS2(I)=J QUI DIT QUE LA IEME INCONNUE DUALE C DE LA MATRICE ELEMENTAIRE EST "NATURELLEMENT" ASSOCIEE A LA C JEME INCONNUE PRIMALE DE IINC C ** NEEDD nous dit si on a besoin de DD et de IPOS2 NEEDDD=.false. if(IIMPI.ge.5) write(6,*) 'Pour la rigidite elementaire ',IRI DO IN=1,LISI if(IIMPI.ge.5) & write(6,*) 'l inconnue primale ',LISINC(IN), do idu=1,LNOMDU enddo return 25 continue c on a trouve le numero du dual -> on en deduit le primal C "naturellement" associé pour le produit scalaire c il faut le chercher dans le chpoint VBB cad dans IINC DO 26 IJ=1,ININC IF(NOHA.EQ.IHAR(IJ)) GO TO 27 26 CONTINUE return 27 CONTINUE IPOS2(IN)=IJ if(IJ.ne.IPOS(IN)) NEEDDD=.true. ENDDO C C **** BOUCLE 30 SUR LES PETITES MATRICES D'UNE RIGIDITE ELEMENTAIRE C N1=NUM(/1) N2=NUM(/2) xMATRI=IRIGEL(4,IRI) COER=COERIG(IRI) SEGACT,xMATRI C C ** AVANT D'EFFECTUER LE PRODUIT ON VERIFIE QU'IL EST A FAIRE DO 31 I1=1,N1 31 CONTINUE GO TO 30 32 CONTINUE C C ** FABRICATION D'UN (ou de 2) VECTEUR(s) ISSU(s) DU CHPOINT if(NEEDDD) C DO 34 IN=1,LISI C 34 CC(IN)=0.D0 C DO 33 IN=1,LISI C J2=ICPR(NUM(NOELEP(IN),I2)) C IF(J2.EQ.0) GO TO 33 C J1=IPOS(IN) C CC(IN)=VAA(J1,J2) C 33 CONTINUE C C **** BOUCLE 35 SUR LES LIGNES D'UNE MATRICE ELEMENTAIRE * XMATRI=IMATTT(I2) * SEGACT,XMATRI if (NEEDDD) then DO 35 IN=1,LISI * IF (ABS(DD(IN)).GT.1.D-10) THEN IF (ABS(DD(IN)).GT.XPETIT) THEN VB=0.D0 C ** BOUCLE 38 SUR LES COLONNES D'UNE MATRICE ELEMENTAIRE DO 38 JN=1,LISI 38 CONTINUE VA=VA+ DD(IN)*VB*COER ENDIF 35 CONTINUE else endif * SEGDES,XMATRI 30 CONTINUE SEGDES,xMATRI SEGDES,DESCR SEGDES MELEME 20 CONTINUE SEGDES,MRIGID SEGSUP,ITRAV SEGSUP,SIINC SEGSUP,IHAR SEGSUP,ICCPR * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales