sompac
C SOMPAC SOURCE MB234859 26/01/26 21:15:17 12460 C----------------------------------------------------------------------- C Creer le squelette d'une ligne suite a sa factorisation symbolique C C Entrees : C --------- C IPPVV : Tableau donnant le nombre de valeurs pour chaque inconnue C IMASQ : Tableau indiquant pour un groupe de valeurs si il n'y a C que des 0 ou non C NA : Entier donnant le nombre d'inconnues de la ligne C C Sortie : C --------- C KIVLO : Tableau donnant la position des debuts de groupes de valeurs C KIVPO : Tableau donnant les numeros de colonnes ou positionner les C valeurs C NBPAR : Entier pour dimensionner le tableau IVPO du segment LIGN C----------------------------------------------------------------------- SUBROUTINE SOMPAC(IPPVV,IMASQ,NA,KIVPO,KIVLO,NBPAR,izrosf) C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC CCHOLE DIMENSION KIVPO(*),KIVLO(*),IPPVV(*),IMASQ(*) LOGICAL bDECA C ICDEB=1 ILDEB=1 NBPAR=0 IEND=IPPVV(2) C NBPAR=NBPAR+1 KIVLO(NBPAR)=ILDEB KIVPO(NBPAR)=ICDEB IF (IEND.EQ.1) GOTO 13 C ILEND=MASQA(IEND) bDECA=.true. ib0=1 C GOTO 202 200 CONTINUE DO IBM=ib0,ILEND IMSQ=IMASQ(IBM) ICDEB0=ICDEB idec=0 IF (IMSQ.GT.0) THEN *msq MSQB=MASQB(IMSQ) MSQH=MASQH(IMSQ) IMSQ=MSQH+(ibm-1)*masdim IF (IMSQ.LT.IEND) THEN CCC ILONV=MIN(MSQH-MSQB,MASDIM) ILONV=MIN(IMSQ-MASQD(IMSQ)+1,MASDIM) ILONC=MASDIM ELSE ILONV=IEND-ICDEB ILONC=ILONV ENDIF ILDEB=ILDEB+ILONV ICDEB=ICDEB+ILONC C IF (bDECA) NBPAR=NBPAR+1 KIVLO(NBPAR)=ILDEB KIVPO(NBPAR)=ICDEB ELSE idec=masqa(-imsq)-ibm ICDEB=ICDEB+MASDIM*idec KIVPO(NBPAR)=ICDEB ILONV=0 ENDIF ICOLFI=ICDEB0+ILONV bDECA=(ICOLFI.NE.ICDEB) if(idec.gt.1) then ib0=masqa(-imsq) goto 200 endif ENDDO CCCC * prise en compte des 0 en tete de troncon CCC write(6,*) 'sompac avant kivpo kivlo', CCC > (kivpo(ip),kivlo(ip),ip=1,nbpar) if (.true.) then idec=0 do it=1,nbpar-1 iv=kivpo(it) IMSQ=IMASQ(masqa(Iv)) ibdeb=imsq/(masdim+1) ibfin=mod(imsq,masdim+1) ** write(6,*) 'sompac it iv kivlo ibdeb ibfin',it,iv,kivlo(it), ** > ibdeb,ibfin ibdeb=ibdeb-iv+masqd(iv) ** if (ibdeb.ge.ibfin) ibdeb=1 ** if (ibdeb.ne.1) write(6,*) 'sompac it ibdeb',it,ibdeb * ibdeb=1 if (kivpo(it)+ibdeb-1.ge.kivpo(it+1)) ibdeb=1 kivpo(it)=kivpo(it)+ibdeb-1 idec=idec+ibdeb-1 kivlo(it+1)=kivlo(it+1)-idec enddo endif ** if (idec.ne.-1) ** >write(6,*) 'sompac apres kivpo kivlo', ** > (kivpo(ip),kivlo(ip),ip=1,nbpar) C GOTO 203 202 CONTINUE CCCC IB0=1 201 CONTINUE DO IBM=IB0,ILEND IMSQ=IMASQ(IBM) IF (IMSQ.GT.0) THEN MSQB=MASQB(IMSQ) MSQH=MASQH(IMSQ) MLON=MSQH-MSQB+1 C CCCC IF ((MSQB.NE.1).AND.(IBM.NE.1)) THEN CCCC KIVPO(NBPAR)=ICDEB+MSQB-1 CCCC bdeca=.true. CCCC ENDIF C IF (MSQB.NE.1) THEN IF (IBM.NE.1) THEN KIVPO(NBPAR)=ICDEB+MSQB-1 bdeca=.true. ELSE MSQB=1 ENDIF ENDIF C ICOLI=MSQB+(IBM-1)*MASDIM ICOLF=MSQH+(IBM-1)*MASDIM IF (ICOLF.LT.IEND) THEN ILONV=MIN(MLON,MASDIM) ILONC=MASDIM ELSE IF (KIVPO(NBPAR).EQ.IEND) GOTO 203 CC ILONV=IEND-ICOLI+1 ILONV=IEND-ICOLI ILONC=IEND-ICDEB ENDIF ILDEB=ILDEB+ILONV ICDEB=ICDEB+ILONC C IF (bDECA) NBPAR=NBPAR+1 KIVLO(NBPAR)=ILDEB KIVPO(NBPAR)=ICDEB bdeca=(MSQH.NE.MASDIM) ELSE IB0=MASQA(-IMSQ) IDEC=IB0-IBM ICDEB=ICDEB+MASDIM*IDEC IF (NBPAR.EQ.1) THEN NBPAR=NBPAR+1 ILDEB=ILDEB+1 KIVLO(NBPAR)=ILDEB ENDIF KIVPO(NBPAR)=ICDEB bdeca=.true. IF(IDEC.GT.1) GOTO 201 ENDIF ENDDO 203 CONTINUE * write(6,*) 'sompac avant' * write(6,*) (kivpo(it),it=1,nbpar) * write(6,*) (kivlo(it),it=1,nbpar) * verif de la taille des sauts itsaut=0 nbparn=nbpar do 400 it=2,nbpar-1 if (it.ge.nbparn) goto 400 nbc=kivpo(it)-kivpo(it-1) nbv=kivlo(it)-kivlo(it-1) isaut=nbc-nbv if (isaut.lt.izrosf) then * write(6,*) 'it isaut',it,isaut * on reintroduit les 0 do 401 it1=it,nbparn kivlo(it1)=kivlo(it1)+isaut 401 continue * on fait sauter ce poteau itsaut=itsaut+1 do 402 it1=it,nbparn-1 kivpo(it1)=kivpo(it1+1) kivlo(it1)=kivlo(it1+1) 402 continue nbparn=nbparn-1 endif 400 continue nbpar=nbparn * write(6,*) 'sompac apres' * write(6,*) (kivpo(it),it=1,nbpar) * write(6,*) (kivlo(it),it=1,nbpar) C 13 CONTINUE NVALL=KIVLO(NBPAR)-1 NVALLG=KIVPO(NBPAR)-1 C C Reproduire ce meme decoupage pour toutes les inconnues du noeud IPPVV(1)=1 DO 100 IL=2,NA IPPVV(IL)=(IL-1)*NBPAR+1 DO 110 NBP=1,NBPAR KIVLO(NBP+(IL-1)*NBPAR)=KIVLO(NBP+(IL-2)*NBPAR)+NVALL +IL-1 KIVPO(NBP+(IL-1)*NBPAR)=KIVPO(NBP+(IL-2)*NBPAR)+NVALLG+IL-1 110 CONTINUE 100 CONTINUE NBPAR=NBPAR*NA NBPAR=NBPAR+1 IPPVV(NA+1)=NBPAR KIVPO(NBPAR)=KIVPO(NBPAR-1)+NA KIVLO(NBPAR)=KIVLO(NBPAR-1)+NA NVALL=KIVLO(NBPAR)-1 C CCC write (6,*) 'sompac na nbpar nvall ',na,nbpar,nvall CCC write (6,*) 'nouveau ippvv',(ippvv(i),i=1,na+1) CCC write (6,*) 'kivpo',(kivpo(i),i=1,nbpar) CCC write (6,*) 'kivlo',(kivlo(i),i=1,nbpar) C END
© Cast3M 2003 - Tous droits réservés.
Mentions légales