arpitl
C ARPITL SOURCE PV090527 24/06/09 21:15:02 11936 *********************************************************************** * * A R P I T L * * FONCTION: * --------- * * STEP DE LA FACTORISATION D'ARNOLDI POUR UN PROBLEME LINEAIRE. * * REMARQUE: * --------- * * ON NOTE: * * A=IPRIGI * B=IPMASS * * IPRIGI : RIGIDITE * IPMASS : MASSE OU KSIGMA * * * PARAMETRES: (E)=ENTREE (S)=SORTIE * ----------- * * * IPRTRA ENTIER (E) OPERATEURS DE TRAVAIL * * IPMAUP ENTIER (E/S) POINTEUR VARIABLES ARPACK * * SIGMA COMPLEX DP (E) VALEUR SU SHIFT (PEUT ETRE NUL) * * INVER LOGIQUE (E) .TRUE. -> PRODUIT SCALAIRE X'KX * .FALSE. -> PRODUIT SCALAIRE X'MX * * SYM LOGIQUE (E) PROBLEME SYMETRIQUE OU NON * * EPSI REEL DP (E) TOLERANCE EIGENPAIRS * * OUT LOGIQUE (S) FLAG DE CONVERGENCE * * * SOUS-PROGRAMMES APPELES: * ------------------------ * * DSAUPD,DNAUPD,ARPCH1,MUCPRI,RESOU1,LDMT,DECALE,DTCHPO,ARPERR * * AUTEUR,DATE DE CREATION: * ------------------------- * * PASCAL BOUDA 29 JUIN 2015 * * LANGAGE: * -------- * * FORTRAN 77 & 90 * *********************************************************************** IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCHAMP -INC SMRIGID -INC TARWORK -INC CCREEL c -INC TARTRAK SEGMENT idemen(0) INTEGER IPRTRA INTEGER IPMAUP LOGICAL INVER LOGICAL SYM LOGICAL OUT INTEGER IPRIGI,IPMASS,IPKSIM INTEGER TEST INTEGER OPT INTEGER IPCTRA(4) INTEGER NOID,NOEN INTEGER ndim,ncv,lworkl xspetl = xspeti SEGINI IDEMEN IDEMEN(**)=0 NOID=0 NOEN=1 OUT=.FALSE. MAUP=IPMAUP SEGACT MAUP*MOD MRITRA=IPRTRA SEGACT MRITRA *Recuperation des operateurs de travail *Récupération de la dimension des tableaux ndim=resid(/1) ncv=v(/2) lworkl=workl(/1) *Si le probleme est symétrique, on appelle la routine spécifique aux *problemes symetriques, sinon on appelle celle pour les problemes *quelconques IF (SYM) THEN & ncv,v,ldv,iparam,ipntr,workd,workl,lworkl,ITRAK,info) ELSE & ncv,v,ldv,iparam,ipntr,workd,workl,lworkl,ITRAK,info) ENDIF *Reverse communication: On récupère les paramètres de sortie et on *effectue des actions en fonction de leurs valeurs TEST=ido SCAL=bmat OPT=iparam(7) IPMAUP=MAUP c SEGDES MAUP *On verifie si on doit stopper le processus IF (OUT) RETURN *Initialisation des chpoints de travail DO i=1,4 IPCTRA(i)=0 ENDDO *SCAL: type de probleme *'I' si standard *'G' si generalise IF (IIMPI.GE.10) WRITE(IOIMP,*) '* PB AUX V.P. STANDARD *' * &---------------------------------------------------& * | Calcul du produit matrice vecteur | * | Y <---- inv(inv(B)*A-SIGMA*I)*X | * | | * | X : workd(ipntr(1)) | * | Y : workd(ipntr(2)) | * &---------------------------------------------------& ************************************************************************ * 28/08/2015 : Dans ce cas, le shift est obligatoirement nul * decalage spectral avec une matrice identite non implemente ************************************************************************ *Mise a sero des inconnues en FLX *Mise a zero des inconnues en PI inutile ? IDEMEN(1)=IPCTRA(2) IF (SYME(1) .EQ. 0) THEN CALL RESOU1 (IPRIGI,IDEMEN,NOID,NOEN,xspetl,0,1) ELSEIF (SYME(1) .EQ. 1) THEN ENDIF IF(IERR.NE.0) RETURN IPCTRA(1)=IDEMEN(1) ENDIF IF (IIMPI.GE.10) * &--------------------------------------------------& * | Calcul du produit matrice vecteur | * | | * | Y <---- inv(A-SIGMA*B)*B*X | * | | * | X : workd(ipntr(1)) | * | Y : workd(ipntr(2)) | * &--------------------------------------------------& c WRITE(*,*) 'X1 :' *Mise a sero des inconnues en FLX *Mise a zero des inconnues en PI inutile ? c WRITE(*,*) '{B*X1} :' c WRITE(*,*) 'avant RESOU :',SYME(4) IDEMEN(1)=IPCTRA(3) IF (SYME(4) .EQ. 0) THEN CALL RESOU1 (IPKSIM,IDEMEN,NOID,NOEN,xspetl,0,1) ELSEIF (SYME(4) .EQ. 1) THEN ENDIF IF (IERR.NE.0) RETURN c WRITE(*,*) 'Y1=[OP^-1]*{B*X1} :' IPCTRA(2)=IDEMEN(1) cbp CALL ARPCH1 (IPKSIM,IPRIGI,IPMAUP,IPCTRA(2),2,1) * &--------------------------------------------------& * | Calcul du produit matrice vecteur | * | | * | si INVER : | * | Y <---- inv(A-SIGMA*B)*B*X | * | | * | X : workd(ipntr(1)) | * | Y : workd(ipntr(2)) | * | | * | sinon : | * | Y <---- inv(A-SIGMA*B)*X | * | | * | X : workd(ipntr(3)) | * | Y : workd(ipntr(2)) | * &--------------------------------------------------& *Mise a sero des inconnues en FLX *Mise a zero des inconnues en PI ELSE c WRITE(*,*) 'X2 :' cbp CALL ARPCH1 (IPKSIM,IPRIGI,IPMAUP,IPCTRA(3),3,4) *Mise a sero des inconnues en FLX *Mise a zero des inconnues en PI c WRITE(*,*) '{X2} : uniquement le chpoint ' ENDIF IDEMEN(1)=IPCTRA(3) IF (SYME(4) .EQ. 0) THEN CALL RESOU1 (IPKSIM,IDEMEN,NOID,NOEN,xspetl,0,1) ELSEIF (SYME(4) .EQ. 1) THEN ENDIF IF (IERR.NE.0) RETURN c WRITE(*,*) 'Y2=[OP^-1]*{X2} :' IPCTRA(2)=IDEMEN(1) cbp CALL ARPCH1 (IPKSIM,IPRIGI,IPMAUP,IPCTRA(2),2,1) * &-------------------------------------& * | Calcul du produit matrice vecteur | * | | * | Si INVER | * | Y <---- A*X | * | | * | Sinon | * | Y <---- B*X | * | | * | X : workd(ipntr(1)) | * | Y : workd(ipntr(2)) | * &-------------------------------------& c WRITE(*,*) 'Y3=B*X3 :' ELSE *Mise a sero des inconnues en FLX *Mise a zero des inconnues en PI c WRITE(*,*) 'Y3={B*X3} :' ENDIF ENDIF ENDIF *Destruction des chpoints de travail DO i=1,4 IF (IPCTRA(i) .NE. 0) THEN ENDIF ENDDO SEGDES MRITRA END
© Cast3M 2003 - Tous droits réservés.
Mentions légales