graco12
C GRACO12 SOURCE PV090527 23/12/20 21:15:06 11813 * * Conversion de la matrice factorisee en stockage creux ligne * Ensuite construction du stockage ligne de la transposee * * IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMMATRI -INC SMRIGID segment ilicre * stockage matrice fatorise en creux * ilideb position debut de ligne dans ligcre integer ligcrp endsegment segment ligcre * lmatr: longueur reelle ligne * posm: numero inconnue * valm: valeur terme integer posm(lmat) real*8 valm(lmat) endsegment pointeur ilicr1.ilicre,ligcr1.ligcre MMATRI=ICHOLX * activation de la matrice une fois pour toute. MILIGN=IILIGN SEGACT,MILIGN INO=ILIGN(/1) * nombre inconnues DO I=1,INO SEGACT LIGN enddo segini ilicre * longueur chaque ligne do i=1,ino do jpa=1,immm(/1) ilideb(iprel+jpa-1)=ivpo(2*ippvv(jpa+1))-ivpo(2*ippvv(jpa)) enddo enddo * taille totale de la matrice lmat=0 ilideb(i)=ilideb(i)+ilideb(i-1) enddo * ilideb pointe vers la fin de chaque ligne ilideb(i)=ilideb(i-1) enddo ilideb(1)=0 * ilideb pointe maintenant vers la fin de la ligne precedente ** write (6,*) ' nb inconnues ',nbinc,'taille matrice ',lmat segini ligcre ligcrp=ligcre do i=1,ino do jpa=1,immm(/1) incb=iprel+jpa-1 igf=ippvv(jpa+1)-1 ildebf=ivpo(2*igf) ilfinf=ivpo(2*(igf+1))-1 idebf=ivpo(2*igf-1) ifinf=idebf+ilfinf-ildebf do ig=ippvv(jpa),ippvv(jpa+1)-1 ildeb=ivpo(2*ig) ilfin=ivpo(2*(ig+1))-1 ideb=ivpo(2*ig-1) ifin=ideb+ilfin-ildeb ** write (6,*) ' incb ilideb ',incb,ilideb(incb),ildeb,ilfin do mpa=ildeb,ilfin ilideb(incb)=ilideb(incb)+1 valm(ilideb(incb))=val(mpa) posm(ilideb(incb))=mpa-ildeb+ideb + incb-ifinf enddo enddo ** write (6,*) 'graco12 dernier incb et derniere valeurs ', ** > incb,ilideb(incb),posm(ilideb(incb)),i,jpa enddo segdes lign enddo * repasser ilideb vers les debuts de ligne ilideb(i)=ilideb(i-1)+1 enddo ilideb(1)=1 ** write (6,*) ' structure de la matrice ', ** > (valm(i),posm(i),i=1,lmat) * matrice remplie ilideb pointe vers les fins de ligne * ilicr1=ilicre ligcr1=ligcre * * construction de la transposee segini ilicre ilicr2=ilicre segini ligcre ligcrp=ligcre * * calcul nb termes par ligne * do j=ilicr1.ilideb(i),ilicr1.ilideb(i+1)-1 inc=ligcr1.posm(j) ilideb(inc)=ilideb(inc)+1 enddo enddo ilideb(i)=ilideb(i)+ilideb(i-1) enddo * ilideb pointe vers la fin de chaque ligne ilideb(i)=ilideb(i-1) enddo ilideb(1)=0 * ilideb pointe maintenant vers la fin de la ligne precedente do j=ilicr1.ilideb(i),ilicr1.ilideb(i+1)-1 inc=ligcr1.posm(j) ilideb(inc)=ilideb(inc)+1 valm(ilideb(inc))=ligcr1.valm(j) posm(ilideb(inc))=i enddo enddo * repasser ilideb vers les debuts de ligne ilideb(i)=ilideb(i-1)+1 enddo ilideb(1)=1 end
© Cast3M 2003 - Tous droits réservés.
Mentions légales