kres8
C KRES8 SOURCE CB215821 20/11/25 13:33:04 10792 $ KTYPI,ITER,RESID,ICALRS,IRSTRT,LBCG,BRTOL,IDDOT,IMVEC, $ KPREC,RXMILU,RXILUP,XLFIL,XDTOL,XSPIV, $ KTIME,LTIME, $ MCHSOL,LRES,LNMV,ICVG,IMPR) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : KRES8 C DESCRIPTION : - Assemblage par RESOU C - Conversion au format Morse de la matrice C - Conversion du second membre en MVECTD C - Construction du préconditionneur C - Appel des solveurs itératifs C - Conversion du résultat en CHPOINT 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, 04/08/2011, version initiale C HISTORIQUE : v1, 04/08/2011, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC SMCHPOI POINTEUR MCHSOL.MCHPOI -INC SMRIGID -INC SMVECTD POINTEUR ISMBR.MVECTD POINTEUR INCX.MVECTD POINTEUR IR.MVECTD -INC SMMATRI SEGMENT PMORS INTEGER IA (NTT+1) INTEGER JA (NJA) ENDSEGMENT POINTEUR PMS1.PMORS,PMS2.PMORS POINTEUR KMORS.PMORS C Segment de stokage SEGMENT IZA REAL*8 A(NBVA) ENDSEGMENT POINTEUR IZA1.IZA,IZA2.IZA,IZAU.IZA,IZAL.IZA,ISA.IZA POINTEUR KIZA.IZA -INC SMLENTI POINTEUR KTYP.MLENTI -INC SMTABLE POINTEUR KTIME.MTABLE DIMENSION ITTIME(4) CHARACTER*8 CHARI CHARACTER*1 CCOMP LOGICAL LTIME,LOGII C .. C .. External subroutines and functions.. *inutile EXTERNAL GAXPY,GCOPY,GDOT,GNRM2 IVALI=0 XVALI=0.D0 LOGII=.FALSE. IRETI=0 XVALR=0.D0 *inutile IOBRE=0 IRETR=0 C C Executable statements C IF (LTIME) THEN call timespv(ittime,oothrd) ITI1=(ITTIME(1)+ITTIME(2))/10 ELSE KTIME=0 ENDIF C C CAS PARTICULIER : Si la matrice est vide (toutes les inconnues C éliminées, par exemple) C SEGACT MRIGID IF (IRIGEL(/2).EQ.0) THEN NSOUPO=0 NAT=0 SEGINI MCHSOL SEGDES MCHSOL ICVG=0 LNMV=0 LRES=0 IF (LTIME) THEN call timespv(ittime,oothrd) ITI2=(ITTIME(1)+ITTIME(2))/10 CHARI='MATVIDE' $ 'ENTIER ',ITI2-ITI1,XVALR,CHARR,LOGIR,IRETR) SEGDES KTIME ENDIF SEGDES MRIGID RETURN ENDIF C C - Assemblage par RESOU C C old INORMU=1 : Normalisation des mutiplicateurs de Lagrange * INORMU est transmis à la subroutine * Le problème est que si MRIGID est deja assemblée, INORMU n'est pas * pris en compte... mais où le stocker ?? IF (IERR.NE.0) RETURN IF (LTIME) THEN call timespv(ittime,oothrd) ITI2=(ITTIME(1)+ITTIME(2))/10 ENDIF C C - Conversion au format Morse de la matrice C IF (IERR.NE.0) RETURN IF (LTIME) THEN call timespv(ittime,oothrd) ITI3=(ITTIME(1)+ITTIME(2))/10 ENDIF C C On donne des infos sur la matrice C * SEGACT MRIGID * ICHOLX=ICHOLE ** INFDDL.ESO est dans ~/triou/p1nc ** CALL INFDDL(ICHOLX) C WRITE(IOIMP,*) 'IMPR=',IMPR C IF (IRET.NE.0) GOTO 9999 C WRITE(IOIMP,*) 'Apres KRES10' C WRITE(IOIMP,*) 'KMORS=',KMORS C WRITE(IOIMP,*) 'KIZA=',KIZA C C - Conversion du second membre en MVECTD C et initialisation du résultat C SEGACT MRIGID ICHOLX=ICHOLE ISECO=KSMBR C On ne vérifie pas que le second membre doit être dans le dual NOID=1 IF (IERR.NE.0) RETURN IF (LTIME) THEN call timespv(ittime,oothrd) ITI4=(ITTIME(1)+ITTIME(2))/10 ENDIF C SEGACT ISMBR C WRITE(IOIMP,*) 'Second membre sous forme vecteur' C INC=ISMBR.VECTBB(/1) C WRITE(IOIMP,*) ' ISMBR, INC=',INC C WRITE(IOIMP,2022) (ISMBR.VECTBB(II),II=1,ISMBR.VECTBB(/1)) C C Gestion normalisation Lagrange (repris de MONDES) C * IF (INORMU.EQ.1) THEN SEGACT ISMBR*MOD MMATRI=ICHOLE SEGACT MMATRI IF(IDNORD.GT.0) THEN MDNO1=IDNORD ELSE MDNO1=IDNORM ENDIF SEGACT MDNO1 INC=MDNO1.DNOR(/1) DO 45 I=1,INC ISMBR.VECTBB(I)=ISMBR.VECTBB(I)*MDNO1.DNOR(I) 45 CONTINUE SEGDES MDNO1 SEGDES MMATRI SEGDES ISMBR * ENDIF C C - Construction du préconditionneur (repris sur kres5) C - Appel des solveurs itératifs C C Si solveur multigrille, il faut un segment permettant de distinguer C les inconnues IF (KTYPI.EQ.7.OR.KTYPI.EQ.8) THEN MMATRI=ICHOLE SEGACT MMATRI MINCPO=IINCPO SEGACT MINCPO NCOMP=INCPO(/1) NNOE=INCPO(/2) SEGACT ISMBR INC=ISMBR.VECTBB(/1) SEGDES ISMBR JG=INC SEGINI KTYP DO ICOMP=1,NCOMP DO INOE=1,NNOE IG=INCPO(ICOMP,INOE) IF (IG.GT.0) KTYP.LECT(IG)=ICOMP ENDDO ENDDO SEGDES KTYP SEGDES MINCPO SEGDES MMATRI ELSE KTYP=0 ENDIF C C Warning KMORS, KIZA et KTYP sont détruits dans KRES11 et KRES12 C si inodet=0 INODET=1 C CALL ECMORS(KMORS,KIZA,4) C SEGACT ISMBR C WRITE(IOIMP,*) 'Second membre sous forme vecteur' C INC=ISMBR.VECTBB(/1) C WRITE(IOIMP,*) ' ISMBR, INC=',INC C WRITE(IOIMP,2022) (ISMBR.VECTBB(II),II=1,ISMBR.VECTBB(/1)) C Solveur Direct IF (KTYPI.EQ.1) THEN SEGINI,INCX=ISMBR C CALL KRES12(KMORS,KIZA,ISMBR, $ KTIME,LTIME, $ INCX,LRES,LNMV,ICVG,IMPR,INODET) ELSE C Solveur Itératif $ KTYPI,ITER,RESID,ICALRS,IRSTRT,LBCG,BRTOL,IDDOT,IMVEC, $ KPREC,RXMILU,RXILUP,XLFIL,XDTOL,XSPIV, $ KTIME,LTIME, $ INCX,LRES,LNMV,ICVG,IMPR,INODET) C WRITE(IOIMP,*) 'Apres KRES11' ENDIF IF(IERR.NE.0) RETURN C SEGACT INCX C WRITE(IOIMP,*) 'Inconnue sous forme vecteur' C INC=INCX.VECTBB(/1) C WRITE(IOIMP,*) ' INCX, INC=',INC C WRITE(IOIMP,2022) (INCX.VECTBB(II),II=1,INCX.VECTBB(/1)) C IF(IERR.NE.0) RETURN C r(0)=b C SEGINI,IR=ISMBR C SEGACT INCX C SEGACT KMORS C SEGACT KIZA CC r(0)=b-Ax C CALL GMOMV(IMVEC,'N',-1.D0,KMORS,KIZA,INCX,1.D0,IR) C RNRM2 = GNRM2(IR) C WRITE(IOIMP,*) '||R||=',RNRM2 C C Gestion normalisation Lagrange (repris de MONDES) C + égalité multiplicateurs * IF (INORMU.EQ.1) THEN SEGACT INCX*MOD MMATRI=ICHOLE SEGACT MMATRI MDNOR=IDNORM SEGACT MDNOR INC=DNOR(/1) DO 35 I=1,INC INCX.VECTBB(I)=INCX.VECTBB(I)*DNOR(I) 35 CONTINUE SEGDES MDNOR MILIGN=IILIGN SEGACT,MILIGN DO 36 I = 1, INC if (ITTR(I).ne.0) then * write (6,*) ' dans mondes ',i,ittr(i) if (incx.vectbb(i).eq.0.d0 $ .or.incx.vectbb(ittr(i)).eq.0.d0) then * write (6,*) ' mondes vectbbs ',vectbb(i+k),vectbb(ittr(i)+k) incx.vectbb(i)=0.d0 incx.vectbb(ittr(i))=0.d0 goto 36 endif incx.vectbb(i)=(incx.vectbb(i)+incx.vectbb(ittr(i)))/2 incx.vectbb(ittr(i))=incx.vectbb(i) endif 36 CONTINUE SEGDES MILIGN SEGDES MMATRI SEGDES INCX * ENDIF C C C SEGACT INCX C WRITE(IOIMP,*) 'Inconnue sous forme vecteur' C INC=INCX.VECTBB(/1) C WRITE(IOIMP,*) ' INCX, INC=',INC C WRITE(IOIMP,2022) (INCX.VECTBB(II),II=1,INCX.VECTBB(/1)) C IF(IERR.NE.0) RETURN IF (LTIME) THEN call timespv(ittime,oothrd) ITI5=(ITTIME(1)+ITTIME(2))/10 ENDIF C C - Conversion du résultat en CHPOINT C C WRITE(IOIMP,*) 'Apres VCH1' IF(IERR.NE.0) RETURN IF (LTIME) THEN call timespv(ittime,oothrd) ITI6=(ITTIME(1)+ITTIME(2))/10 CHARI='ASS+RENU' $ 'ENTIER ',ITI2-ITI1,XVALR,CHARR,LOGIR,IRETR) CHARI='CONVMORS' $ 'ENTIER ',ITI3-ITI2,XVALR,CHARR,LOGIR,IRETR) C CHARI='CONVSMB ' C CALL ECCTAB(KTIME,'MOT ',IVALI,XVALI,CHARI,LOGII,IRETI, C $ 'ENTIER ',ITI4-ITI3,XVALR,CHARR,LOGIR,IRETR) IF (KTYPI.EQ.1) THEN CHARI='FAC+RESO' ELSE CHARI='PRE+RESO' ENDIF $ 'ENTIER ',ITI5-ITI4,XVALR,CHARR,LOGIR,IRETR) C CHARI='CONVINC' C CALL ECCTAB(KTIME,'MOT ',IVALI,XVALI,CHARI,LOGII,IRETI, C $ 'ENTIER ',ITI6-ITI5,XVALR,CHARR,LOGIR,IRETR) CHARI='TOTAL ' $ 'ENTIER ',ITI6-ITI1,XVALR,CHARR,LOGIR,IRETR) SEGDES KTIME ENDIF C Le solveur direct surcharge le second membre IF (ISMBR.NE.INCX) SEGSUP ISMBR SEGSUP INCX SEGDES MRIGID C C Normal termination C RETURN C C Format handling C 2022 FORMAT(10(1X,1PG12.5)) C C End of subroutine KRES8 C END
© Cast3M 2003 - Tous droits réservés.
Mentions légales