kres11
C KRES11 SOURCE GOUNAND 22/08/25 21:15:04 11434 $ KTYPI,ITER,RESID,ICALRS,IRSTRT,LBCG,BRTOL,IDDOT,IMVEC, $ KPREC,RXMILU,RXILUP,XLFIL,XDTOL,XSPIV, $ KTIME,LTIME, $ INCX,LRES,LNMV,ICVG,IMPR,INODET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : KRES11 C DESCRIPTION : - Construction du préconditionneur C - Appel des solveurs itératifs C C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C VERSION : v1, 29/08/2011, version initiale C HISTORIQUE : v1, 29/08/2011, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC SMLENTI POINTEUR LNMV.MLENTI POINTEUR ATYP.MLENTI -INC SMLREEL POINTEUR LRES.MLREEL -INC SMMATRIK POINTEUR MAPREC.MATRIK POINTEUR AMORS.PMORS POINTEUR AISA.IZA -INC SMVECTD POINTEUR ISMBR.MVECTD POINTEUR INCX.MVECTD C Tableau de correspondance : entier <-> mot C pour le type d'inversion INTEGER NBTYPI,LNTYPI PARAMETER (NBTYPI=16) PARAMETER (LNTYPI=18) CHARACTER*(LNTYPI) LTYPI(NBTYPI) C Tableau de correspondance : entier <-> mot C pour le type de préconditionnement (cas d'une méthode itérative) INTEGER NBPREC,LNPREC PARAMETER (NBPREC=11) PARAMETER (LNPREC=8) CHARACTER*(LNPREC) LPREC(NBPREC) -INC SMTABLE POINTEUR KTIME.MTABLE DIMENSION ITTIME(4) CHARACTER*8 CHARI CHARACTER*1 CCOMP LOGICAL LTIME,LOGII C C Initialisation des tableaux C DATA LTYPI/'Choleski ', $ 'Conjugate Gradient', $ 'BiCGSTAB G ', $ 'BiCGSTAB(l) G ', $ 'GMRES(m) ', $ 'CGS-Neumaier ', $ 'Multigrid FCG ', $ 'Multigrid GCR(m) ', $ 'Bi-CG ', $ 'CG old ', $ 'BiCGSTAB old ', $ 'GMRES(m) old ', $ 'CGS ', $ 'BiCGSTAB ', $ 'BiCGSTAB(l) ', $ 'BiCGSTAB(l)F '/ DATA LPREC/'None ', $ 'Jacobi ', $ 'D-ILU ', $ 'ILU(0) ', $ 'MILU(0) ', $ 'ILUT ', $ 'ILUT2 ', $ 'ILUTP ', $ 'ILUTP+0 ', $ 'ILU0-PV ', $ 'ILU0-PVf'/ IVALI=0 XVALI=0.D0 LOGII=.FALSE. IRETI=0 XVALR=0.D0 IOBRE=0 IRETR=0 * * Executable statements * * WRITE(IOIMP,*) 'Entrée dans kres10.eso' ICVG=0 *Debug IF (KTYPI.EQ.1) KTYPI=3 IF (KTYPI.LT.2.OR.KTYPI.GT.NBTYPI) THEN WRITE(IOIMP,*) 'KTYPI incorrect (2..',NBTYPI,') :',KTYPI GOTO 9999 ENDIF IF (KPREC.LT.0.OR.KPREC.GT.NBPREC-1) THEN WRITE(IOIMP,*) 'PRECOND ', $ 'incorrect (0..',NBPREC-1,') :',KPREC GOTO 9999 ENDIF C C Impressions C IF (IMPR.GT.1) THEN IF (IDDOT.EQ.0) CCOMP=' ' IF (IDDOT.EQ.1) CCOMP='c' IF (KTYPI.EQ.5.OR.KTYPI.EQ.8) THEN WRITE(IOIMP,*) CCOMP,LTYPI(KTYPI),' (m=',IRSTRT,')' ELSEIF (KTYPI.EQ.11.OR.KTYPI.EQ.12) THEN WRITE(IOIMP,*) CCOMP,LTYPI(KTYPI),' (l=',LBCG,')' ELSE WRITE(IOIMP,*) CCOMP,LTYPI(KTYPI) ENDIF IF (KPREC.EQ.4) THEN WRITE(IOIMP,110) ' ',LPREC(KPREC+1),' (r=',RXMILU,')' 110 FORMAT (3A,D9.2,A) ELSEIF (KPREC.GE.5.AND.KPREC.LE.6) THEN WRITE(IOIMP,111) ' ',LPREC(KPREC+1),' (lfil=',XLFIL, $ ' droptol=',XDTOL,')' 111 FORMAT (3A,D9.2,A,D9.2,A) ELSEIF (KPREC.GE.7.AND.KPREC.LE.8) THEN WRITE(IOIMP,112) ' ',LPREC(KPREC+1),' (lfil=',XLFIL, $ ' droptol=',XDTOL,' pivtol=',XSPIV, $ ')' 112 FORMAT (3A,D9.2,A,D9.2,A,D9.2,A,I4,A) ELSEIF (KPREC.EQ.10) THEN WRITE(IOIMP,110) ' ',LPREC(KPREC+1),' (r=',RXILUP,')' ELSE WRITE(IOIMP,*) LPREC(KPREC+1) ENDIF ENDIF IF (LTIME) THEN call timespv(ittime,oothrd) ITI1=(ITTIME(1)+ITTIME(2))/10 ENDIF C C - Construction du préconditionneur (repris sur kres5) C SEGACT ISMBR INC=ISMBR.VECTBB(/1) NRIGE=0 NMATRI=0 NKID=9 NKMT=7 SEGINI MAPREC MAPREC.KNTTT=INC NTT=0 NPT=0 NBLK=0 SEGINI IDMAT MAPREC.KIDMAT(1)=IDMAT * * Gestion du CTRL-C if (ierr.NE.0) return IF (KPREC.EQ.1) THEN IF (IRET.NE.0) GOTO 9999 ELSEIF (KPREC.EQ.2) THEN IF (IRET.NE.0) GOTO 9999 ELSEIF (KPREC.EQ.3) THEN IF (IRET.NE.0) GOTO 9999 ELSEIF (KPREC.EQ.4) THEN IF (IRET.NE.0) GOTO 9999 ELSEIF (KPREC.GE.5.AND.KPREC.LE.6) THEN IVARI=KPREC-5 $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * WRITE(IOIMP,*) 'PRILUT !' * ELSEIF (KPREC.GE.7.AND.KPREC.LE.9) THEN ELSEIF (KPREC.GE.7.AND.KPREC.LE.8) THEN WRITE(IOIMP,*) 'KPREC=',KPREC, 'non dispo' GOTO 9999 ELSEIF (KPREC.EQ.9.OR.KPREC.EQ.10) THEN IF (IRET.NE.0) GOTO 9999 ELSEIF (KPREC.NE.0) THEN WRITE(IOIMP,*) 'Erreur de programmation' GOTO 9999 ENDIF IF (LTIME) THEN call timespv(ittime,oothrd) ITI2=(ITTIME(1)+ITTIME(2))/10 ENDIF C MATRIK=MAPREC C SEGACT MATRIK C nkid=kidmat(/1) C WRITE(IOIMP,*) 'Apres constr precon' C WRITE(IOIMP,*) ' MAPREC KIDMAT NKID=',nkid C WRITE(IOIMP,2020) (KIDMAT(II),II=1,KIDMAT(/1)) C 2020 FORMAT (20(2X,I12) ) C C - Appel des solveurs itératifs C Apparemment, le segment MATRIK ne sert qu'à vérifier la symétrie C et à construire INCTYP pour le multigrille C NRIGE=0 NMATRI=0 NKID=0 NKMT=0 SEGINI MATRIK SEGACT ISMBR INC=ISMBR.VECTBB(/1) SEGINI INCX KS2B=ISMBR AMORS=KMORS AISA=KIZA ATYP=KTYP * * Gestion du CTRL-C if (ierr.NE.0) return IF (KTYPI.EQ.2) THEN $ ITER,INMV,RESID,KPREC,BRTOL,ICALRS,IDDOT,IMVEC, $ IMPR,IRET) ELSEIF (KTYPI.EQ.3) THEN LBCG=1 $ ITER,INMV,RESID,KPREC,BRTOL,LBCG,ICALRS,IDDOT,IMVEC, $ IMPR,IRET) ELSEIF (KTYPI.EQ.4) THEN $ ITER,INMV,RESID,KPREC,BRTOL,LBCG,ICALRS,IDDOT,IMVEC, $ IMPR,IRET) ELSEIF (KTYPI.EQ.5) THEN C WRITE(IOIMP,*) 'ITER=',ITER C WRITE(IOIMP,*) 'INMV=',INMV C WRITE(IOIMP,*) 'RESID=',RESID C WRITE(IOIMP,*) 'KPREC=',KPREC C WRITE(IOIMP,*) 'IRSTRT=',IRSTRT C WRITE(IOIMP,*) 'ICALRS=',ICALRS C WRITE(IOIMP,*) 'IDDOT=',IDDOT $ ITER,INMV,RESID,KPREC,IRSTRT,ICALRS,IDDOT,IMVEC, $ IMPR,IRET) ELSEIF (KTYPI.EQ.6) THEN $ ITER,INMV,RESID,KPREC,BRTOL,ICALRS,IDDOT,IMVEC, $ IMPR,IRET) ELSEIF (KTYPI.EQ.7) THEN * WRITE(IOIMP,*) 'Appel de pragmg' $ INCX, $ ITER,INMV,RESID,KPREC,1,ICALRS,IDDOT,IMVEC,KTIME,LTIME, $ IMPR,IRET) SEGSUP ATYP ELSEIF (KTYPI.EQ.8) THEN $ INCX, $ ITER,INMV,RESID,KPREC,IRSTRT,ICALRS,IDDOT,IMVEC,KTIME, $ LTIME, $ IMPR,IRET) SEGSUP ATYP ELSEIF (KTYPI.EQ.9) THEN $ ITER,INMV,RESID,KPREC,BRTOL,ICALRS,IDDOT,IMVEC, $ IMPR,IRET) ELSE WRITE(IOIMP,*) 'KTYPI=',KTYPI,' invalide (1..',NBTYPI,')' GOTO 9999 ENDIF * Gestion du CTRL-C if (ierr.NE.0) return C IRET<0 : 'vrai erreur' ou breakdown (dans le cas de BiCGSTAB) C IRET>0 : l'itération n'a pas convergé mais on veut C quand meme la solution calculée ICVG=IRET IF (IRET.GT.0) THEN WRITE(IOIMP,*) 'Convergence to tolerance not achieved : ', $ 'ITER=',ITER,' INMV=',INMV,' RESID=',RESID ELSEIF (IRET.EQ.0) THEN IF (IMPR.GT.0) THEN WRITE(IOIMP,*) 'ITER=',ITER,' INMV=',INMV,' RESID=',RESID ENDIF ELSEIF (IRET.LT.0) THEN WRITE(IOIMP,*) 'Error or breakdown in iterative method' GOTO 9999 ELSE WRITE(IOIMP,*) 'KTYPI=',KTYPI,' invalide (1..',NBTYPI,')' GOTO 9999 ENDIF SEGSUP MATRIK IF (LTIME) THEN call timespv(ittime,oothrd) ITI3=(ITTIME(1)+ITTIME(2))/10 ITP=ITI2-ITI1 ITR=ITI3-ITI2 CHARI='PRECONDI' $ 'ENTIER ',ITP,XVALR,CHARR,LOGIR,IRETR) CHARI='RESOLUTI' $ 'ENTIER ',ITR,XVALR,CHARR,LOGIR,IRETR) ENDIF C C Destruction du préconditionneur C SEGACT MAPREC IDMAT=MAPREC.KIDMAT(1) IF (IDMAT.NE.0) THEN SEGACT IDMAT IZA=IDIAG SEGSUP IZA SEGSUP IDMAT ENDIF PMORS=MAPREC.KIDMAT(6) IF (PMORS.NE.0) SEGSUP PMORS IZA=MAPREC.KIDMAT(7) IF (IZA.NE.0) SEGSUP IZA SEGSUP MAPREC C C Destruction de la matrice Morse C IF (INODET.EQ.0) THEN SEGSUP AMORS SEGSUP AISA ENDIF * * Normal termination * RETURN * * Format handling * * * Error handling * 9999 CONTINUE MOTERR(1:8)='KRES11 ' RETURN * * End of subroutine KRES11 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales