etoile
C ETOILE SOURCE PV 20/09/26 21:16:44 10724 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C ************************************************ C * Routine effectuant la multiplication de 2 * C * MATRIK sous stockage morse * C * M1 : entree * C * M2 : entree * C * M3 : Sortie sous stockage morse * C * M3 = M1 * M2 * C ************************************************ -INC SMELEME POINTEUR MELEMD.MELEME -INC SMMATRIK POINTEUR M1.MATRIK,M2.MATRIK,M3.MATRIK POINTEUR PMS3.PMORS, IZA3.IZA POINTEUR IMAT1.IMATRI,IMAT2.IMATRI,IMAT3.IMATRI INTEGER CI REAL*8 TEMP IRET=0 SEGACT M1 C Si les matrices ne sont pas morse, on les crees C en morse IF (M1.IRIGEL(7,1).NE.6) THEN END IF SEGACT M2 IF (M2.IRIGEL(7,1).NE.6) THEN END IF SEGACT M1,M2 C *********************** MELEMD=M1.IRIGEL(2,1) MELEME=M2.IRIGEL(1,1) SEGACT MELEMD,MELEME NBSOUP=MELEME.LISOUS(/1) NBSOUD=MELEMD.LISOUS(/1) SEGDES MELEMD,MELEME NMATR1=M1.IRIGEL(/2) IF (NMATR1.GT.1) THEN WRITE(6,*) 'ETOILE: Impossible de mutiplier la' WRITE(6,*) 'matrice morse 1: NMATRI =',NMATR1,'>1.' IRET=1 RETURN END IF NMATR2=M2.IRIGEL(/2) IF (NMATR2.GT.1) THEN WRITE(6,*) 'ETOILE: Impossible de mutiplier la' WRITE(6,*) 'matrice morse 2: NMATRI =',NMATR2,'>1.' IRET=1 RETURN END IF C *********************** C On recupere les segments necessaire pour le produit PMS1=M1.IRIGEL(5,1) PMS2=M2.IRIGEL(5,1) IZA1=M1.IRIGEL(6,1) IZA2=M2.IRIGEL(6,1) IMAT1=M1.IRIGEL(4,1) IMAT2=M2.IRIGEL(4,1) SEGACT IMAT1,IMAT2 SEGACT PMS1,PMS2 SEGACT IZA1,IZA2 C **************************************************** NBME1=IMAT1.LIZAFM(/2) NBSOU1=IMAT1.LIZAFM(/1) NBME2=IMAT2.LIZAFM(/2) NBSOU2=IMAT2.LIZAFM(/1) IF (NBME1.NE.NBME2) THEN WRITE(6,*) 'ETOILE : Produit entre ces deux MATRIK' WRITE(6,*) 'incompatible' IRET=1 RETURN ELSE IFLAG=0 DO I=1,NBME1 IFLAG=1 END IF END DO IF (IFLAG.EQ.1) THEN WRITE(6,*) 'ETOILE : Produit entre ces deux MATRIK' WRITE(6,*) 'incompatible' IRET=1 RETURN END IF END IF NBME=NBME1 NBSOUS=MAX(NBSOUP,NBSOUD) IF (NBSOUS.EQ.0) NBSOUS=1 SEGINI IMAT3 C Le primal de M3 est le primal de M2 et C le dual de M3 est le dual de M1 DO I=1,NBME IMAT3.LISDUA(I)=IMAT1.LISDUA(I) END DO C Si Apres le produit on a plus qu'une composante en primal C ET en dual avec NBME>1 alors on ajuste a NBME=1. IF (NBME.NE.1) THEN & (IMAT3.LISDUA(1).EQ.IMAT3.LISDUA(2))) THEN NBME=1 SEGADJ IMAT3 END IF END IF C On initialise M3 NMATRI=1 NRIGE=7 NKID=9 NKMT=7 SEGINI M3 NTT=PMS1.IA(/1)-1 NTTP=M2.KNTTP C On initialise les segments morses de M3 NJA=1 NBVA=1 SEGINI PMS3,IZA3 M=0 C On calcule le produit: DO I=1,NTT LI1=PMS1.IA(I) NB1=PMS1.IA(I+1) - PMS1.IA(I) DO K=1,NTTP TEMP=0.0D0 DO L=1,NB1 CI=PMS1.JA(LI1+L-1) LI2=PMS2.IA(CI) NB2=PMS2.IA(CI+1)-PMS2.IA(CI) DO J=1,NB2 IF (PMS2.JA(LI2+J-1).EQ.K) THEN TEMP=TEMP + (IZA1.A(LI1+L-1)* & IZA2.A(LI2+J-1)) ELSEIF (PMS2.JA(LI2+J-1).GT.K) THEN GOTO 10 END IF END DO 10 CONTINUE END DO C On optimise en considerant que ce qui est < E-12 est = 0. IF (ABS(TEMP).LT.1.E-15) TEMP=0.0 IF (TEMP.NE.0.0D0) THEN M=M+1 20 IF (NBVA.LT.M) THEN NBVA=NBVA+100 NJA=NBVA SEGADJ IZA3,PMS3 GOTO 20 END IF C remplissage ligne IF (PMS3.IA(I).EQ.0) THEN PMS3.IA(I)=M END IF C remplissage colonne PMS3.JA(M)=K IZA3.A(M)=TEMP END IF C On fait attention aux lignes vide. IF ((PMS3.IA(I-1).EQ.0).AND.(I.NE.1)) PMS3.IA(I-1) = M+1 END DO END DO C On oublie pas de remplir la derniere ligne. PMS3.IA(NTT+1)=M+1 C on fait attention si la derniere ligne est vide. IF (PMS3.IA(NTT).EQ.0) PMS3.IA(NTT) = M+1 C On ajuste les segments morse de M3 si necessaire IF (NBVA.GT.M) THEN NBVA=M NJA=NBVA SEGADJ IZA3,PMS3 END IF C On remplit les pointeurs de M3 M3.IRIGEL(5,1)=PMS3 M3.IRIGEL(6,1)=IZA3 IMAT3.KSPGP=IMAT2.KSPGP IMAT3.KSPGD=IMAT1.KSPGD M3.IRIGEL(1,1)=M2.IRIGEL(1,1) M3.IRIGEL(2,1)=M1.IRIGEL(2,1) M3.IRIGEL(4,1)=IMAT3 M3.IRIGEL(7,1)=6 M3.KNTTP=M2.KNTTP M3.KNTTD=M1.KNTTD M3.KMINCP=M2.KMINCP M3.KMINCD=M1.KMINCD SEGDES PMS3,IZA3 SEGDES PMS1,PMS2 SEGDES IZA1,IZA2 SEGDES M1,M2,M3 SEGDES IMAT1,IMAT2,IMAT3 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales