arsluc
C ARSLUC SOURCE CB215821 20/11/25 13:18:26 10792 & IPLVAR,IPLVER,IPLVAI,IPLVEI) ************************************************************************ * * A R S L U C * * * * FONCTION: * --------- * * CONSTRUCTION DE LISTREEL'S SOLUTION DES FREQUENCES (REELLES ET/OU * COMPLEXES) ET D'UN MLCHPO'S SOLUTION DES MODES CALCULES (REELS * ET/OU COMPLEXES) A PARTIR DES VARIABLES DE SORTIE ARPACK * (PROBLEME NON SYMETRIQUE) * * * PARAMETRES: (E)=ENTREE (S)=SORTIE * ----------- * * IPRTRA ENTIER (E) POINTEUR DES OPERATEURS DE TRAVAIL * * SIGMA COMPLEX DP (E) VALEUR PROPRE DE SHIFT * * INVER LOGIQUE (E) .TRUE. -> PRODUIT SCALAIRE X'KX * .FALSE. -> PRODUIT SCALAIRE X'MX * * IPMAUP ENTIER (E) POINTEUR DES VARIABLES ARPACK * * QUAD LOGIQUE (E) PROBLEME QUADRATIQUE OU NON * * IPLVAR ENTIER (S) POINTEUR DE L'OBJET 'LISTREEL' CONTENANT * LA SUITE DES FREQUENCES PROPRES RELLES * * IPLVER ENTIER (S) POINTEUR DE L'OBJET 'LISTCHPO' CONTENANT * LA SUITE DES MODES PROPRES REELS * * IPLVAI ENTIER (S) POINTEUR DE L'OBJET 'LISTREEL' CONTENANT * LA SUITE DES FREQUENCES PROPRES IMAGINAIRES * * IPLVEI ENTIER (S) POINTEUR DE L'OBJET 'LISTCHPO' CONTENANT * LA SUITE DES MODES PROPRES IMAGINAIRES * * SOUS-PROGRAMMES APPELES: * ------------------------ * * MOTS1,MAXIM1,VCH1,ARPSHI,NORMA1,ARPVER,MUCHPO * * * AUTEUR, DATE DE CREATION: * ------------------------- * * PASCAL BOUDA 11 JUILLET 2015 * ************************************************************************ IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMRIGID -INC SMVECTD -INC SMLCHPO -INC SMLREEL -INC TARWORK INTEGER IPRTRA LOGICAL INVER INTEGER IPMEUP LOGICAL QUAD INTEGER IPLVAR INTEGER IPLVER INTEGER IPLVAI INTEGER IPLVEI INTEGER IPRIGI INTEGER JG, N1,INC INTEGER IPCHO INTEGER IPVEC INTEGER IPLMOT CHARACTER*(LOCOMP) MOTCLE INTEGER TYPRO INTEGER IPMONO,IPMON1,IPMON2 INTEGER IPMOD1,IPMOD2,IPMO22 REAL*8 MAXVAL, MAXVA1, MAXVA2 INTEGER N COMPLEX*16 VSHIFT,FSHIFT COMPLEX*16 CONJ VSHIFT=CMPLX(0.D0,0.D0) FSHIFT=CMPLX(0.D0,0.D0) i=1 MRITRA=IPRTRA SEGACT MRITRA SEGDES MRITRA MRIGID=IPRIGI SEGACT MRIGID IPCHO=ICHOLE SEGDES MRIGID MAUP=IPMAUP SEGACT MAUP IF (QUAD) THEN N=v(/1)/2 INCR=N ELSE N=v(/1) INCR=0 ENDIF JG=dr(/1) SEGINI MLREEL IPLVAR=MLREEL SEGDES MLREEL SEGINI MLREEL IPLVAI=MLREEL SEGDES MLREEL N1=dr(/1) SEGINI MLCHPO IPLVER=MLCHPO SEGDES MLCHPO SEGINI MLCHPO IPLVEI=MLCHPO SEGDES MLCHPO *Dans le cas de frequences complexes, il se peut que la nev-ieme *frequence soit complexe; dans ce cas, ce se sont pas nev mais nev+1 *frequences qui sont calculees. Ainsi dans le cas ou la nev-ieme *frequence est reelle, on ajuste la taille des objets solutions IF ( ABS(di(nev+1)) .EQ. 0.D0 ) THEN JG=JG-1 N1=N1-1 MLREEL=IPLVAR SEGADJ MLREEL MLREEL=IPLVAI SEGADJ MLREEL MLCHPO=IPLVER SEGADJ MLCHPO MLCHPO=IPLVEI SEGADJ MLCHPO ENDIF DO 100 k=1,nev *Lecture des valeurs propres: Si la valeur de shift est reelle ou *nulle, ARPACK fournit directement les valeurs propres. Dans le cas *contraire, il faut les recalculer a partir des quotients de Rayeigh * *En notant lambda=a+ib la valeur propre, V=X+iY le vecteur propre *associe, et B la matrice pour le produit scalaire, on a : * - a=X*B*X+Y*B*Y * - b=X*B*Y-Y*B*X * 18/08/2015 : Le shift complexe n'est pas implemente *Cas "simple": pas besoin de calculer les quotients VSHIFT=CMPLX(dr(i),di(i)) ELSE WRITE(IOIMP,*) 'Shift complexe non implemente !' ENDIF IF (IIMPI .GT. 2) THEN WRITE(IOIMP,*) ' ' WRITE(IOIMP,*) '--- Mode n°',k,' : on lit a l indice',i,' ---' WRITE(IOIMP,*) 'Valeur propre',VSHIFT ENDIF *Conversion de la valeur propre de shift en frequence de shift IF (IIMPI.GE.3) WRITE(IOIMP,*) '*** APPEL A ARPSHI ***' *Les valeurs propres sont classes dans les tableaux dr *(partie reelle) et di (partie imaginaire). Le tableau de sortie des *vecteurs propres d'ARPACK prend la convention suivante: si le mode est *reel, il occupe une colonne du tableau. S'il est complexe, il occupe *deux colonnes (une pour la partie reelle et une autre pour la partie *imaginaire. IF ( ABS(di(i)) .EQ. 0.D0 ) THEN IF (IIMPI.GE.3) WRITE(IOIMP,*) 'ARSLUC : *** Cas reel ***' ********************* *******Cas reel****** ********************* *La valeur propre est reelle, la frequence est reelle ou imaginaire pure MLREEL=IPLVAR SEGACT MLREEL*MOD IPLVAR=MLREEL SEGDES MLREEL MLREEL=IPLVAI SEGACT MLREEL*MOD IPLVAI=MLREEL SEGDES MLREEL *Recuperation du vecteur propre reel pur et transfomation en chpoint INC=N SEGINI MVECTD DO j=1,N VECTBB(j)=v(j+INCR,i) *Tracking : affichage du vecteur propre ARPACK IF(IIMPI .GT. 300) WRITE(IOIMP,*) j,':',VECTBB(j) ENDDO IPVEC=MVECTD SEGDES MVECTD SEGSUP MVECTD *La normalisation est impossible si le chpoint est nul IF (MAXVAL .LE. XPETIT) THEN IPMONO=IPMOD1 ELSE ENDIF *Stockage dans le mlchpo MLCHPO=IPLVER SEGACT MLCHPO*MOD ICHPOI(i)=IPMONO IPLVER=MLCHPO SEGDES MLCHPO *Creeation d'un chpoint nul pour la partie imaginaire INC=N SEGINI MVECTD DO j=1,N VECTBB(j)=0.D0 ENDDO IPVEC=MVECTD SEGDES MVECTD SEGSUP MVECTD *pas de normalisation pour un chpoint nul IPMONO=IPMOD2 MLCHPO=IPLVEI SEGACT MLCHPO*MOD ICHPOI(i)=IPMONO IPLVEI=MLCHPO SEGDES MLCHPO *Calcul de la norme et du residu du mode TYPRO=iparam(7) & IPMOD1,IPMOD2,VSHIFT) ELSE IF (IIMPI.GE.3) WRITE(IOIMP,*) 'ARSLUC : *** Cas complexe ***' ************************* *******Cas complexe****** ************************* *Les valeurs propres sont complexes conjuguees. On travaille par paires *Note: On "conjugue" la partie reelle dans le cas d'un probleme *quadratique aux valeurs propres IF (.NOT. QUAD) THEN MLREEL=IPLVAR SEGACT MLREEL*MOD IPLVAR=MLREEL SEGDES MLREEL MLREEL=IPLVAI SEGACT MLREEL*MOD IPLVAI=MLREEL SEGDES MLREEL ELSE MLREEL=IPLVAR SEGACT MLREEL*MOD IPLVAR=MLREEL SEGDES MLREEL MLREEL=IPLVAI SEGACT MLREEL*MOD IPLVAI=MLREEL SEGDES MLREEL ENDIF *Recuperation de la partie reelle du vecteur propre. On travaille par *paires (partie reele identique pour les deux) INC=N SEGINI MVECTD DO j=1,N VECTBB(j)=v(j+INCR,i) *Tracking : affichage de la partie superieure du vecteur propre ARPACK IF (IIMPI .GT. 300) THEN WRITE(IOIMP,*) J,': RELAMX', v(j,i), 'RECALC', & REAL(VSHIFT)*v(j+INCR,i)-AIMAG(VSHIFT)* & v(j+INCR,i+1),'IMLAMX', v(j,i+1),'IMCALC', & AIMAG(VSHIFT)*v(j+INCR,i)+REAL(VSHIFT)*v(j+INCR,i+1) ENDIF ENDDO IPVEC=MVECTD SEGDES MVECTD IF (IIMPI.GE.3) WRITE(IOIMP,*) '*** APPEL A VCH1 ***' SEGSUP MVECTD *Recuperation de la partie imaginaire du vecteur propre. On travaille *par paires (partie imaginaires opposees) INC=N SEGINI MVECTD DO j=1,N VECTBB(j)=v(j+INCR,i+1) *Tracking : affichage de la partie inferieure du vecteur propre ARPACK IF (IIMPI .GT. 500) THEN WRITE(IOIMP,*) J,': REX',v(j+INCR,i),'IMX',v(j+INCR,i+1) ENDIF ENDDO IPVEC=MVECTD SEGDES MVECTD SEGSUP MVECTD *On recupere le max de la paire des chpoints MAXVAL=MAX(MAXVA1,MAXVA2) *Division de la partie reelle par le max IF (MAXVA1 .EQ. 0.D0) THEN IPMONO=IPMOD1 ELSE ENDIF *Stockage dans le mlchpo MLCHPO=IPLVER SEGACT MLCHPO*MOD ICHPOI(i)=IPMONO ICHPOI(i+1)=IPMONO IPLVER=MLCHPO SEGDES MLCHPO *Division de la partie imaginaire par le max IF (MAXVA2 .EQ. 0.D0) THEN IPMON1=IPMONO IPMON2=IPMONO ELSE *Construction de la partie imaginaire du conjugue ENDIF *Stockage dans de mlchpo MLCHPO=IPLVEI SEGACT MLCHPO*MOD ICHPOI(i)=IPMON1 IPLVEI=MLCHPO SEGDES MLCHPO *Stockage dans de mlchpo MLCHPO=IPLVEI SEGACT MLCHPO*MOD ICHPOI(i+1)=IPMON2 IPLVEI=MLCHPO SEGDES MLCHPO *Calcul de la norme et du residu des modes TYPRO=iparam(7) & IPMOD1,IPMOD2,VSHIFT) CONJ=CMPLX(REAL(VSHIFT),-AIMAG(VSHIFT)) & IPMOD1,IPMO22,CONJ) ENDIF *Critere de sortie de boucle IF ( (i .EQ. JG) .OR. (i .EQ. (JG-1) .AND. di(i) .NE. 0) ) THEN GOTO 101 ENDIF *L'incrementation differe suivant le type de solution (reelle ou *complexe) IF (di(i) .EQ. 0.D0) THEN i=i+1 ELSE i=i+2 ENDIF 100 CONTINUE 101 CONTINUE c SEGDES MAUP SEGDES MRITRA END
© Cast3M 2003 - Tous droits réservés.
Mentions légales