qzvecp
C QZVECP SOURCE BP208322 16/01/21 21:15:21 8791 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) * ************************************************************************* * * * CALCUL DES VECTEURS PROPRES COMPLEXES * * ( QUATRIEME PAS DE LA METHODE "QZ" POUR LE CALCUL MODAL COMPLEXE ) * * _____________________________________________________________________ * * * * * * DATE : le 7 Avril 1995 * * AUTEURS : J.ANTUNES , Nicolas BENECH * * _____________________________________________________________________ * * * * MODULE(S) APPELANT(S) : VIBRAC * * * * MODULE(S) APPELE(S) : * * _____________________________________________________________________ * * * * EN ENTREE : * * - MATA : matrice reelle quasi triangulaire superieure (XMATRI) * * - MATB : matrice reelle triangulaire superieure (XMATRI) * * - ALFR, ALFI, BETA : liste des valeurs propres * * (parties reelle et imaginaire du numerateur + denominateur)* * - MATZ : produit des transformations effectuees auparavant * * * * EN SORTIE : * * - MATA : matrice identique a la matrice d'entree * * - MATB : matrice detruite * * - ALFR, ALFI, BETA : liste des valeurs propres * * (parties reelle et imaginaire du numerateur + denominateur)* * - MATZ : matrice des vecteurs propres, normalises de facon * * telle que le module de la composante la plus large * * soit unitaire. * * si ALFI = 0 : le vecteur est dans la colonne J de MATZ * * si ALFI <> 0 : la partie reelle est dans la colonne J, * * la partie imag. dans la colonne J+1. * * (ce vecteur propre correspond a la valeur propre * * de partie imagianire positive. Le vecteur propre * * conjugue correspond a la valeur propre conjuguee) * * * ************************************************************************* * -INC PPARAM -INC CCOPTIO -INC SMRIGID -INC SMLREEL C INTEGER I , J , K , M , EN , II , JJ , NA , NN , ISW , & ENM2 C----------------------------------------------------------------------- POINTEUR MATA.XMATRI, MATB.XMATRI, MATZ.XMATRI cbp POINTEUR ALFR.XMATRI, ALFI.XMATRI, BETA.XMATRI POINTEUR ALFR.MLREEL, ALFI.MLREEL, BETA.MLREEL C c SEGACT , MATA, ALFR,ALFI,BETA c SEGACT , MATB*mod c SEGACT , MATZ*mod NM=MATA.RE(/1) N=MATA.RE(/2) C C*********************************************************************** C*********************************************************************** C*********************************************************************** C C======================================================================= C========================= DEBUT DES CALCULS =========================== C======================================================================= C EPSB = MATB.RE(N,1,1) ISW = 1 C C----------------------------------------------------------------------- C-------------------------- BOUCLE PRINCIPALE -------------------------- C----------------------------------------------------------------------- C DO 800 NN = 1, N EN = N + 1 - NN NA = EN - 1 IF ( ISW . EQ . 2 ) GOTO 795 C C----------------------------------------------------------------------- C------------------------- VECTEUR PROPRE REEL ------------------------- C----------------------------------------------------------------------- C M = EN MATB.RE(EN,EN,1) = 1.0D0 IF ( NA . EQ . 0 ) GOTO 800 C DO 700 II = 1, NA I = EN - II W = BETM * MATA.RE(I,I,1) - ALFM * MATB.RE(I,I,1) R = 0.0D0 C DO 610 J = M, EN 610 R = R + (BETM * MATA.RE(I,J,1) & - ALFM * MATB.RE(I,J,1)) * MATB.RE(J,EN,1) C IF ( I . EQ . 1 . OR . ISW . EQ . 2 ) GOTO 630 IF ( BETM * MATA.RE(I,I-1,1) . EQ . 0.0D0 ) GOTO 630 ZZ = W S = R GOTO 690 630 M = I IF ( ISW . EQ . 2 ) GOTO 640 C T = W IF ( W . EQ . 0.0D0 ) T = EPSB MATB.RE(I,EN,1) = -R / T GOTO 700 C 640 X = BETM * MATA.RE(I,I+1,1) - ALFM * MATB.RE(I,I+1,1) Y = BETM * MATA.RE(I+1,I,1) Q = W * ZZ - X * Y T = (X * S - ZZ * R) / Q MATB.RE(I,EN,1) = T IF ( ABS(X) . LE . ABS(ZZ) ) GOTO 650 MATB.RE(I+1,EN,1) = (-R - W * T) / X GOTO 690 650 MATB.RE(I+1,EN,1) = (-S - Y * T) / ZZ 690 ISW = 3 - ISW 700 CONTINUE C GOTO 800 C C----------------------------------------------------------------------- C----------------------- VECTEUR PROPRE COMPLEXE ----------------------- C----------------------------------------------------------------------- C 710 M = NA C Y = BETM * MATA.RE(EN,NA,1) MATB.RE(NA,EN,1) = (ALMR * MATB.RE(EN,EN,1) & - BETM * MATA.RE(EN,EN,1)) / Y MATB.RE(NA,NA,1) = -ALMI * MATB.RE(EN,EN,1) / Y MATB.RE(EN,NA,1) = 0.0D0 MATB.RE(EN,EN,1) = 1.0D0 ENM2 = NA - 1 IF ( ENM2 . EQ . 0 ) GOTO 795 C DO 790 II = 1, ENM2 I = NA - II RA = 0.0D0 SA = 0.0D0 C W = BETM * MATA.RE(I,I,1) - ALMR * MATB.RE(I,I,1) W1 = -ALMI * MATB.RE(I,I,1) C DO 760 J = M, EN X = BETM * MATA.RE(I,J,1) - ALMR * MATB.RE(I,J,1) X1 = -ALMI * MATB.RE(I,J,1) RA = RA + X * MATB.RE(J,NA,1) - X1 * MATB.RE(J,EN,1) SA = SA + X * MATB.RE(J,EN,1) + X1 * MATB.RE(J,NA,1) 760 CONTINUE C IF ( I . EQ . 1 . OR . ISW . EQ . 2 ) GOTO 770 ZZ = W Z1 = W1 R = RA S = SA ISW = 2 GOTO 790 770 M = I IF ( ISW . EQ . 2 ) GOTO 780 C TR = -RA TI = -SA 773 DR = W DI = W1 C 775 IF ( ABS(DI) . GT . ABS(DR) ) GOTO 777 RR = DI / DR D = DR + DI * RR GOTO (787,782), ISW 777 RR = DR / DI D = DR * RR + DI GOTO (787,782), ISW C 780 continue X = BETM * MATA.RE(I,I+1,1) - ALMR * MATB.RE(I,I+1,1) Y = BETM * MATA.RE(I+1,I,1) X1 = -ALMI * MATB.RE(I,I+1,1) TR = Y * RA - W * R + W1 * S TI = Y * SA - W * S - W1 * R DR = W * ZZ - W1 * Z1 - X * Y DI = W * Z1 + W1 * ZZ - X1 * Y IF ( DR . EQ . 0.0D0 . AND . DI . EQ . 0.0D0 ) DR = EPSB GOTO 775 782 continue ISW = 1 IF ( ABS(Y) . GT . ABS(W) + ABS(W1) ) GOTO 785 TR = -RA - X * MATB.RE(I+1,NA,1) + X1 * MATB.RE(I+1,EN,1) TI = -SA - X * MATB.RE(I+1,EN,1) - X1 * MATB.RE(I+1,NA,1) GOTO 773 785 continue & + Z1 * MATB.RE(I+1,EN,1)) / Y & - Z1 * MATB.RE(I+1,NA,1)) / Y 787 continue 790 CONTINUE C 795 ISW = 3 - ISW C C----------------------------------------------------------------------- C------------------- FIN DE LA SUBSTITUTION INVERSE -------------------- C----------------------------------------------------------------------- C 800 CONTINUE C C----------------------------------------------------------------------- C------- ON TRANSFORME DANS LE SYSTEME DE COORDONNEES D ORIGINE -------- C----------------------------------------------------------------------- C DO 880 JJ = 1, N J = N + 1 - JJ C DO 880 I = 1, N ZZ = 0.0D0 C DO 860 K = 1, J 860 ZZ = ZZ + MATZ.RE(I,K,1) * MATB.RE(K,J,1) C MATZ.RE(I,J,1) = ZZ 880 CONTINUE C C----------------------------------------------------------------------- C----------------- NORMALISATION DES VECTEURS PROPRES ------------------ C----------------------------------------------------------------------- C DO 950 J = 1, N D = 0.0D0 IF ( ISW . EQ . 2 ) GOTO 920 C DO 890 I = 1, N IF ( ABS(MATZ.RE(I,J,1)) . GT . D ) & D = ABS(MATZ.RE(I,J,1)) 890 CONTINUE C DO 900 I = 1, N 900 MATZ.RE(I,J,1) = MATZ.RE(I,J,1) / D C GOTO 950 C 920 continue DO 930 I = 1, N R = ABS(MATZ.RE(I,J-1,1)) + ABS(MATZ.RE(I,J,1)) IF ( R . NE . 0.0D0 ) & R = SQRT((MATZ.RE(I,J-1,1) )**2 & + (MATZ.RE(I,J,1) )**2) IF ( R . GT . D ) D = R 930 CONTINUE C DO 940 I = 1, N MATZ.RE(I,J-1,1) = MATZ.RE(I,J-1,1) / D MATZ.RE(I,J,1) = MATZ.RE(I,J,1) / D 940 CONTINUE C 945 ISW = 3 - ISW 950 CONTINUE C c SEGDES , MATA,MATB,MATZ c SEGDES , ALFR,ALFI,BETA SEGSUP , MATA,MATB c C======================================================================= C========================== FIN DES CALCULS ============================ C======================================================================= C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales