ytmx
C YTMX SOURCE CB215821 20/11/25 13:44:36 10792 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) C C **** MULTIPLICATION D'UNE MATRICE(IRE3) PAR UN CHAMPPOINT (IRE1) A C **** GAUCHE ET PAR UN CHAMPPOINY (IRE2) A DROITE. C **** VA= IRE1 *IRE3 *IRE2 C **** POUR EFFECTUER L'OPERATION ON ELIMINE LES COMPOSANTES LX C **** DU CHPOINT ET DE LA RIGIDITE. 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 ICPR(nbpts) SEGMENT/ITRAV/(CC(NLIGMA)*D,DD(NLIGMA)*D,VAA(NNIN,ITES)*D, *VBB(NNIN,ITES)*D) SEGMENT IPOS(NLIGMA) SEGMENT IPOS2(NLIGMA) SEGMENT SIINCO CHARACTER*(LOCOMP) IINCO(NNIN) ENDSEGMENT 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 C C C **** ON RETIRE DES CHPOINTS LES MULT. DE LAGRANGE S'IL Y EN A. C C C **** ON CREE LES TABLEAUX : c C **** ICPR(I)=J VEUT DIRE QUE LE NOEUD I A LE NUMERO LOCAL J. C SEGINI ICPR KMAX=nbpts DO 6 K=1,KMAX ICPR(K)=0 6 CONTINUE IK=0 IPA=0 C ** ON COMMENCE PAR RECENSER LES NOEUDS DU 1er CHPOINT MCHPOI=IRE1 50 CONTINUE IPA=IPA+1 SEGACT,MCHPOI NSOUPO=IPCHP(/1) DO 1 ISOU=1,NSOUPO MSOUPO=IPCHP(ISOU) SEGACT,MSOUPO MELEME=IGEOC SEGACT,MELEME 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 SEGDES,MELEME SEGDES,MSOUPO 1 CONTINUE SEGDES,MCHPOI C ** ON CONTINUE AVEC LES NOEUDS DU 2nd CHPOINT MCHPOI=IRE2 IF(IPA.EQ.1) GO TO 50 ITES=IK NLIGMA=0 C **** REMPLISSAGE DE IINC et IHAR C = couple(inconnue primale + harmonique) de la matrice MRIGID SEGINI,SIINC SEGINI,IHAR MRIGID=IRE3 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) NOHA=IRIGEL(5,IRI) SEGACT,DESCR NLIGRE=LISINC(/2) IF(NLIGRE.GT.NLIGMA) NLIGMA=NLIGRE DO 8 I1=1,ININC IF(NOHA.EQ.IHAR(I1)) GO TO 7 8 CONTINUE * on ajoute le couple INC+HAR si pas deja vu IHAR(**)=NOHA ININC=ININC+1 7 CONTINUE SEGDES,DESCR 11 SEGDES MELEME 3 CONTINUE SEGDES,MRIGID C C **** ON INITIALISE LE SEGMENT ITRAV C NNIN=ININC SEGINI SIINCO,IPOS,IPOS2 DO I=1,NNIN IINCO(I)=IINC(I) enddo SEGINI ITRAV C CALL ZERO(CC,NLIGMA,1) C CALL ZERO(DD,NLIGMA,1) C CALL ZERO(VAA,NNIN,ITES) C CALL ZERO(VBB,NNIN,ITES) C C **** ON INITIALISE VAA (= 1er chpoint) et VBB (= 2nd chpoint) C C ** LE 1er CHPOINT MCHPOI=IRE1 IPA=0 51 CONTINUE IPA=IPA+1 SEGACT,MCHPOI NSOUPO=IPCHP(/1) c --- boucle sur les zones --- DO 15 ISOU=1,NSOUPO MSOUPO=IPCHP(ISOU) SEGACT,MSOUPO MELEME=IGEOC SEGACT,MELEME MPOVAL=IPOVAL SEGACT,MPOVAL N2=VPOCHA(/1) NC=VPOCHA(/2) 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(NOHA.EQ.IHAR(IH)) GO TO 18 17 CONTINUE GO TO 16 c on a trouvé le bon couple inconnue primale+harmonique : IH 18 CONTINUE IF(IPA.EQ.1) GO TO 190 c On recupere dans VBB(IH,IK) c la valeur du 2nd chpoint pour l inconnue IH et le point IK c VBBB=VPOCHA(I2,INC) 1111 FORMAT(1X,I5,1X,I5,1X,I5,1X,1PE12.5) 191 CONTINUE GO TO 16 190 CONTINUE c On recupere dans VAA(IH,IK) c la valeur du 1er chpoint pour l inconnue IH et le point IK c VAAA=VPOCHA(I2,INC) 19 CONTINUE 16 CONTINUE SEGDES,MSOUPO SEGDES,MPOVAL SEGDES,MELEME 15 CONTINUE SEGDES,MCHPOI c on recommence pour le 2nd chpoint MCHPOI=IRE2 IF(IPA.EQ.1) GO TO 51 C C **** BOUCLE 20 SUR LES OBJETS RIGIDITES ELEMENTAIRES C SEGACT,MRIGID DO 20 IRI=1,NRIGEL IANTI=0 IF (NRIGE.GE.7) THEN IANTI=IRIGEL(7,IRI) ENDIF MELEME=IRIGEL(1,IRI) SEGACT,MELEME DESCR=IRIGEL(3,IRI) SEGACT,DESCR LISI=LISINC(/2) C C ** ON VERIFIE QUE: C -LA MATRICE EST CARREE 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 NOHA=IRIGEL(5,IRI) 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 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 ENDDO C C **** BOUCLE 30 SUR LES PETITES MATRICES D'UNE RIGIDITE ELEMENTAIRE N1=NUM(/1) N2=NUM(/2) xMATRI=IRIGEL(4,IRI) SEGACT,xMATRI COER=COERIG(IRI) 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 VECTEUR ISSU DU 1er CHPOINT DO 33 JN=1,LISI CC(JN)=0.D0 J1=IPOS(JN) 33 CONTINUE if(IIMPI.ge.5) & write(6,*) 'CC=',(CC(iou),iou=1,LISI) C ** FABRICATION D'UN VECTEUR ISSU DU 2nd CHPOINT DO 330 IN=1,LISI DD(IN)=0.D0 J1=IPOS2(IN) 330 CONTINUE if(IIMPI.ge.5) & write(6,*) 'DD=',(DD(iou),iou=1,LISI) C C **** BOUCLE 35 SUR LES LIGNES D'UNE MATRICE ELEMENTAIRE * XMATRI=IMATTT(I2) * SEGACT,XMATRI 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 if(IIMPI.ge.5) & write(6,*) 'VA=',VA * SEGDES,XMATRI 30 CONTINUE SEGDES,xMATRI SEGDES,DESCR 24 SEGDES MELEME 20 CONTINUE SEGDES,MRIGID SEGSUP,ITRAV SEGSUP,SIINC SEGSUP,IHAR SEGSUP ICPR,SIINCO,IPOS 5000 CONTINUE * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales