kres8
C KRES8 SOURCE GOUNAND 25/03/24 21:15:06 12216 $ KTYPI,ITER,RESID,ICALRS,IRSTRT,LBCG,BRTOL,IDDOT,IMVEC, $ IORINC, $ 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 C On inclue SMCOORD car MCHSOL doit avoir la configuration courante -INC SMCOORD -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 POINTEUR KNOD.MLENTI POINTEUR KRINC.MLENTI -INC SMLMOTS POINTEUR IORINC.MLMOTS POINTEUR IORINU.MLMOTS -INC SMTABLE POINTEUR KTIME.MTABLE DIMENSION ITTIME(4) CHARACTER*16 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 (cf. kres5.eso -> inctyp.eso) IF (KTYPI.EQ.7.OR.KTYPI.EQ.8.OR.KTYPI.EQ.10.OR.KTYPI.EQ.11) 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 SEGINI KNOD MIMIK=IIMIK * write(ioimp,*) 'coucou mimik' SEGACT,MIMIK * SEGPRT,MIMIK JG=NCOMP SEGINI KRINC * WRITE(IOIMP,*) 'NCOMP,IORINC= ',NCOMP,IORINC * IF (IORINC.NE.0) THEN SEGACT IORINC SEGINI,IORINU=IORINC * write(ioimp,*) 'JGN,JGM=',JGN,JGM IF (IRET.NE.0) GOTO 9999 IF (JGM.NE.JGMU) THEN WRITE(IOIMP,*) 'IORINC ne doit pas avoir de doublons' GOTO 9999 ENDIF SEGSUP IORINU IF (JGM.NE.NCOMP) THEN WRITE(IOIMP,*) $ 'IORINC doit referencer toutes les inconnues de la matrice' GOTO 9999 ENDIF $ ,IMPR,IRET) IF (IRET.NE.0) GOTO 9999 ELSE DO ICOMP=1,NCOMP KRINC.LECT(ICOMP)=ICOMP ENDDO ENDIF IF (IMPR.GT.2) THEN WRITE(IOIMP,*) 'NCOMP= ',NCOMP WRITE(IOIMP,*) 'MIMIK.IMIK(1..',NCOMP,')= ' WRITE(IOIMP,*)(MIMIK.IMIK(II),II=1,NCOMP) IF (IORINC.NE.0) THEN WRITE(IOIMP,*) 'IORINC.MOTS(1..',NCOMP,')= ' ENDIF WRITE(IOIMP,*) 'KRINC.LECT(1..',NCOMP,')= ' WRITE(IOIMP,*)(KRINC.LECT(II),II=1,NCOMP) ENDIF * * write(ioimp,*) 'KPREC=',KPREC DO ICOMP=1,NCOMP DO INOE=1,NNOE IG=INCPO(ICOMP,INOE) IF (IG.GT.0) THEN KTYP.LECT(IG)=KRINC.LECT(ICOMP) KNOD.LECT(IG)=INOE ENDIF ENDDO ENDDO SEGSUP KRINC SEGDES KTYP SEGDES KNOD 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='RESO 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='KRES FAC+RESO' ELSE CHARI='KRES 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 Error Handling C 9999 CONTINUE MOTERR(1:8)='KRES8 ' 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