chole4
C CHOLE4 SOURCE MB234859 26/01/26 21:15:05 12460 C---------------------------------------------------------------------- C Effectue les produits entre blocs de valeurs non nulles C entre la ligne a traiter et une ligne dont elle depend C C Entrees : C --------- C C Concernant la ligne a traiter : C IPRE2 : Numero de ligne de la premiere inconnue C NA2 : Nombre d'inconnues C NBG2 : Nombre de blocs de valeurs composant la premiere inconnue C IVPO2 : Tableau decrivant la ligne C IMASQ : Tableau indiquant si un groupe de valeurs contient une C valeur non nulle ou non C C Concernant la ligne en relation : C IPRE1 : Numero de ligne de la premiere inconnue C NA1 : Nombre d'inconnues C NBG1 : Nombre de blocs de valeurs composant la premiere inconnue C IVPO1 : Tableau decrivant la ligne C VAL1 : Tableau contenant les valeurs de la ligne C C IT1 : Troncon de debut et de fin du fait du decoupage en C IT2 : rondelle dans chole4i C IRONDI : Indices de debut et de fin du fait du decoupage en C IRONDJ : rondelle dans chole4i C C Sortie : C --------- C VAL2 : Tableau contenant les valeurs de la ligne C NBO : Entier donnant le nombre d'operations C---------------------------------------------------------------------- SUBROUTINE CHOLE4(IPRE2,NA2,NBG2,IVPO2,VAL2,IMASQ,IT1,IT2, & IPRE1,NA1,NBG1,IVPO1,VAL1,NBO,IRONDI,IRONDF) C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC SMRIGID -INC CCHOLE -INC CCREEL DIMENSION IVPO1(*),VAL1(*) DIMENSION IVPO2(*),VAL2(*),IMASQ(*) REAL*8 pt(36) LOGICAL bmamu C C Nombre max de lignes traitees simultanement nbl=6 C C Recuperer en cas de super element dans cchole xmatri=matric nbnnma=nbnnmc C C Subroutine a utiliser bmamu=(NA2.GT.1.OR.NA1.GT.1) C C Nombre de termes pour la premiere inco de chaque LIGN CCC NVAL1=IVPO1(2*(NBG1+1))-1 CCC NVAL2=IVPO2(2*(NBG2+1))-1 NVAL1=IVPO1(2*NBG1) NVAL2=IVPO2(2*NBG2) C C Nombre de colonnes entre le premiere terme non nul et la diag CCC NCOL1=IVPO1(2*(NBG1+1)-1)-1 CCC NCOL2=IVPO2(2*(NBG2+1)-1)-1 NCOL1=IVPO1(2*NBG1-1) NCOL2=IVPO2(2*NBG2-1) C C Colonne de la premiere valeur non nulle IDEPV1=IPRE1-NCOL1+1 IDEPV2=IPRE2-NCOL2+1 IMB=IDEPV1-IDEPV2 C C Compteurs pour parcourir les troncons ICPT1=1 ICPT2=IT1 ICPTM=IT2+1 C CCC IWA1=IPRE1+NA1-1 CCC IWA2=IPRE2+NA2-1 CCC WRITE(*,*) '---- LIGNES',IPRE2,'A',IWA2,'AVEC',IPRE1,'A',IWA1 CCC WRITE(*,*) 'DECALAGE ',NCOL1,IDEPV1,NCOL2,IDEPV2,IMB C C Boucles sur les groupes de valeurs (hors groupe diagonal) DO 10 IG1=1,NBG1-1 C IF (IVPO1(2*ICPT1-1).GT.IRONDF-IMB) THEN GOTO 15 ENDIF IF (IVPO1(2*(ICPT1+1)-1)-1.LT.IRONDI-IMB) THEN ICPT1=ICPT1+1 GOTO 10 ENDIF C ILDEB1=IVPO1(2*ICPT1) ILFIN1=IVPO1(2*(ICPT1+1))-1 IDEB1=IVPO1(2*ICPT1-1) IFIN1=IDEB1+ILFIN1-ILDEB1 IDECV=-IDEB1+ILDEB1 C 13 CONTINUE C IF (IVPO2(2*ICPT2-1).GT.IRONDF) THEN GOTO 15 ENDIF IF (IVPO2(2*(ICPT2+1)-1)-1.LT.IRONDI) THEN IF (ICPT2.EQ.ICPTM) GOTO 15 ICPT2=ICPT2+1 GOTO 13 ENDIF C ILDEB2=IVPO2(2*ICPT2) ILFIN2=IVPO2(2*(ICPT2+1))-1 IDEB2=IVPO2(2*ICPT2-1) IFIN2=IDEB2+ILFIN2-ILDEB2 C IDEB3=IDEB2-IMB IFIN3=IFIN2-IMB C IF (IFIN1.LT.IDEB3) THEN ICPT1=ICPT1+1 GOTO 10 ELSE IF (IFIN3.LT.IDEB1) THEN IF (ICPT2.EQ.ICPTM) GOTO 15 ICPT2=ICPT2+1 GOTO 13 ENDIF C IDEBN=MAX(IDEB1,IDEB3,IRONDI-IMB) IFINT=MIN(IFIN1,IFIN3) IFINN=MIN(IFINT,IRONDF-IMB) IFINN=MIN(IFINN,NBNNMA-IDEPV1+1) C IF (bmamu) THEN DO 301 IA2=0,NA2-1,NBL IPOSR2=-IDEB2+ILDEB2+IA2*NVAL2+(IA2*(IA2-1))/2+IMB DO 300 IA1=0,NA1-1,NBL IPOSR1=IDECV+IA1*NVAL1+(IA1*(IA1-1))/2 C NBOQ=NBO NPA1=MIN(NBL,NA1-IA1) NPA2=MIN(NBL,NA2-IA2) C CALL MAMUPW(IDEBN,IFINN,VAL2(1),IPOSR2,NVAL2+IA2,NPA2, & VAL1(1),IPOSR1,NVAL1+IA1,NPA1, & PT,NBO) IF (NBO.EQ.NBOQ) GOTO 300 C C Mise a jour VAL2 IDEC=IPRE1+IA1-IDEPV2 DO IC=1,NPA2 IVAD=IDEC+(IA2+IC-1)*NCOL2+((IA2+IC-1)*(IA2+IC-2))/2 IAUX=-IVAD+(IC-1)*NPA1 IMSQ=IMASQ(MASQA(IVAD+1)) IVMSQ=IVPO2(2*(IMSQ+1)-1) IDBC=IVPO2(2*IMSQ-1) IDBV=IVPO2(2*IMSQ ) DO IV=MAX(1,1+IVAD),NPA1+IVAD C C Ne devrait pas se produire... IF (IMSQ.LT.0) THEN WRITE(*,*) 'erreur interne chole4' ENDIF C 114 CONTINUE IF (IV.GE.IVMSQ) THEN IMSQ=IMSQ+1 IVMSQ=IVPO2(2*(IMSQ+1)-1) IDBC=IVPO2(2*IMSQ-1) IDBV=IVPO2(2*IMSQ ) GOTO 114 ENDIF C P=PT(IV+IAUX) IF(ABS(P).GT.XPETIT) THEN IV2=IDBV+(IV-IDBC) VAL2(IV2)=VAL2(IV2)-P ENDIF C ENDDO ENDDO C 300 CONTINUE 301 CONTINUE ELSE C LOND=IFINN-IDEBN+1 IF (LOND.LE.0) GOTO 16 IPOS1=IDEBN+IDECV IPOS2=IDEBN-IDEB2+ILDEB2+IMB C NBO=NBO+LOND C IF (ABS(P).GT.XPETIT) THEN C Mise a jour VAL2 IVAD=IPRE1+1-IDEPV2 IMSQ=IMASQ(MASQA(IVAD)) 115 CONTINUE IF (IVAD.GE.IVPO2(2*(IMSQ+1)-1)) THEN IMSQ=IMSQ+1 GOTO 115 ENDIF C IDBC=IVPO2(2*IMSQ-1) IDBV=IVPO2(2*IMSQ ) IVAE=IDBV+(IVAD-IDBC) VAL2(IVAE)=VAL2(IVAE)-P C WRITE(*,*)'REMPLISSAGE',IVAE,IPRE1,IDBC,IDBV,VAL2(IVAE),P ENDIF C ENDIF 16 CONTINUE C IDEB1=IFINT+1 IF (IDEB1.GT.IFIN1) THEN ICPT1=ICPT1+1 GOTO 10 ELSE IF (ICPT2.EQ.ICPTM) GOTO 15 ICPT2=ICPT2+1 GOTO 13 ENDIF C 10 CONTINUE C 15 CONTINUE C C Le groupe diagonal IF ((NA1.EQ.1).AND.(IPRE2+NA2-1.LE.NBNNMA)) GOTO 400 C DO 210 IM2=1,NA2 IVAC=(IM2-1)*NCOL2+((IM2-2)*(IM2-1))/2 ICPT2=IT1 IIND2=IPRE2+IM2-1-NBNNMA DO 220 IM1=1,NA1 C IF (IVPO1(2*(NBG1+1)-1)+IM1-1.LT.IRONDI-IMB) GOTO 220 C IIND1=IPRE1+IM1-1-NBNNMA C IDEBV=IVPO1(2*NBG1) IDEB1=IVPO1(2*NBG1-1) IFIN1=IDEB1+IM1-2 C 14 CONTINUE C IF (IVPO2(2*(ICPT2+1)-1).LT.IRONDI) THEN IF (ICPT2.EQ.ICPTM) GOTO 210 ICPT2=ICPT2+1 GOTO 14 ENDIF C ILDEB2=IVPO2(2*ICPT2) ILFIN2=IVPO2(2*(ICPT2+1))-1 IDEB2=IVPO2(2*ICPT2-1) IFIN2=IDEB2+ILFIN2-ILDEB2 C IDEB3=IDEB2-IMB IFIN3=IFIN2-IMB C IF (IFIN3.LT.IDEB1) THEN IF (ICPT2.EQ.ICPTM) GOTO 210 ICPT2=ICPT2+1 GOTO 14 ENDIF C IDEBN=MAX(IDEB1,IDEB3,IRONDI-IMB) IFINN=MIN(IFIN1,IFIN3,IRONDF-IMB) IFINN=MIN(IFINN,NBNNMA-IDEPV1+1) C P=0.D0 IF (IFINN-IDEBN.LT.0) THEN IF (XMATRI.EQ.0) GOTO 220 IF (IIND1.LT.1.OR.IIND2.LT.1) GOTO 220 GOTO 230 ENDIF C IPOS1=IDEBN-IDEB1+IDEBV +(IM1-1)*NVAL1+((IM1-1)*(IM1-2))/2 IPOS2=IDEBN-IDEB2+ILDEB2+(IM2-1)*NVAL2+((IM2-1)*(IM2-2))/2+IMB NBO=NBO+IFINN-IDEBN+1 DO 200 IPOS=ipos1,ipos1+ifinn-idebn P=P+VAL2(IPOS+ipos2-ipos1)*VAL1(IPOS) 200 CONTINUE C 230 CONTINUE IDEC=IPRE1+IM1-1-IDEPV2+1 IDED=IDEC+IVAC IMSQ=IMASQ(MASQA(IDED)) 116 CONTINUE IF (IDED.GE.IVPO2(2*(IMSQ+1)-1)) THEN IMSQ=IMSQ+1 GOTO 116 ENDIF C IDBC=IVPO2(2*IMSQ-1) IDBV=IVPO2(2*IMSQ ) IVAD=IDBV+(IDED-IDBC) IF (ABS(P).GT.XPETIT) THEN VAL2(IVAD)=VAL2(IVAD)-P ENDIF C C Cas du super-element IF (XMATRI.NE.0.AND.IIND1.GE.1.AND.IIND2.GE.1) THEN XX=VAL2(IVAD) IF (ABS(XX).GT.XPETIT) THEN RE(IIND1,IIND2,1)=XX RE(IIND2,IIND1,1)=XX ENDIF ENDIF C IF (IFIN3.LT.IFIN1) THEN IF (ICPT2.EQ.ICPTM) GOTO 210 ICPT2=ICPT2+1 GOTO 14 ENDIF C 220 CONTINUE 210 CONTINUE C 400 CONTINUE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales