c ---------------------------------------------------------------------- c Bibliothèque de sous-programmes utilitaires pour les matrices. c les matrices peuvent avoir des tailles réelles différentes, mais c leur dimension (définie lors de la déclaration) doit être identique c c P. Trau - Licence Techno Méca Novembre 2003 c ---------------------------------------------------------------------- c ---------------------------------------------------------------------- c saisie de la matrice mat c nbl, nbc : nb de lignes et de colonnes de la matrice c diml,dimc : dimension de la matrice (nb maxi) c ---------------------------------------------------------------------- subroutine saisie (mat,nbl,nbc,diml,dimc) implicit none integer i,j integer nbl,nbc,diml,dimc real mat(diml,dimc) print*,'Définissez la dimension réelle de la matrice' print*,'Nombre de lignes (',diml,' maxi) : ' read*,nbl print*,'Nombre de colonnes (',dimc,' maxi) : ' read*,nbc if(nbl.gt.diml.or.nbc.gt.dimc.or.nbl.lt.1.or.nbc.lt.1)then print*,'Erreur dimension' stop endif print*,'Entrez votre matrice :' do 10 i=1,nbl print*,'ligne' ,i do 20 j=1,nbc print *,' (',i,'-',j,') ?' read *,mat(i,j) 20 continue 10 continue end subroutine saisie c ---------------------------------------------------------------------- c affichage de la matrice mat c nbl, nbc : nb de lignes et de colonnes de la matrice c diml,dimc : dimension de la matrice (nb maxi) c ---------------------------------------------------------------------- subroutine affichage (mat,nbl,nbc,diml,dimc) implicit none integer i,j,nbl,nbc,diml,dimc real mat(diml,dimc) print*,nbl,'lignes,',nbc,'colonnes :' do 10 i=1,nbl print *,(mat(i,j),j=1,nbc) 10 continue end subroutine affichage c ---------------------------------------------------------------------- c copie de la matrice src (source) dans dst (destination) c nblsrc,nbcsrc, nbldst,nbcdst : nb de lignes et colonnes des matrices c diml,dimc : dimension des DEUX matrice (nb maxi) c ---------------------------------------------------------------------- subroutine copie(src,dst,nblsrc,nbcsrc,nbldst,nbcdst,diml,dimc) implicit none integer i,j,nblsrc,nbcsrc,nbldst,nbcdst,diml,dimc real src(diml,dimc),dst(diml,dimc) nbldst=nblsrc nbcdst=nbcsrc do 10 i=1,nblsrc do 20 j=1,nbcsrc dst(i,j)=src(i,j) 20 continue 10 continue end subroutine copie c ---------------------------------------------------------------------- c produit de la matrice src (source) avec un réel x, c résultat dans dst (destination) c nblsrc, nbcsrc, nbldst,nbcdst : nb de lignes et colonnes des matrices c diml,dimc : dimension des DEUX matrice (nb maxi) c ---------------------------------------------------------------------- subroutine produitreel(x,src,dst,nblsrc,nbcsrc, + nbldst,nbcdst,diml,dimc) implicit none integer i,j,nblsrc,nbcsrc,nbldst,nbcdst,diml,dimc real src(diml,dimc),dst(diml,dimc),x nbldst=nblsrc nbcdst=nbcsrc do 10 i=1,nblsrc do 20 j=1,nbcsrc dst(i,j)=x*src(i,j) 20 continue 10 continue end subroutine produitreel c ---------------------------------------------------------------------- c somme de la matrice mat1 avec la matrice mat2, c résultat dans dst (destination) c nbl1,nbc1,nbl2,nbc2,nbldst,nbcdst : nb de lignes et col des matrices c diml,dimc : dimension des trois matrice (nb maxi) c ---------------------------------------------------------------------- subroutine somme(mat1,mat2,dst,nbl1,nbc1,nbl2,nbc2, + nbldst,nbcdst,diml,dimc) implicit none integer i,j,nbl1,nbc1,nbl2,nbc2,nbldst,nbcdst,diml,dimc real mat1(diml,dimc),mat2(diml,dimc),dst(diml,dimc) if(nbl1.ne.nbl2.or.nbc1.ne.nbc2) then print *,'Erreur : sommme de 2 matrices de taille différentes' stop endif nbldst=nbl1 nbcdst=nbc2 do 10 i=1,nbl1 do 20 j=1,nbc1 dst(i,j)=mat1(i,j)+mat2(i,j) 20 continue 10 continue end subroutine somme c ---------------------------------------------------------------------- c produit de la matrice mat1 avec la matrice mat2, c résultat dans dst (destination) c nbl1,nbc1,nbl2,nbc2,nbldst,nbcdst : nb de lignes et col des matrices c diml,dimc : dimension des trois matrice (nb maxi) c ---------------------------------------------------------------------- subroutine produit(mat1,mat2,dst,nbl1,nbc1,nbl2,nbc2, + nbldst,nbcdst,diml,dimc) implicit none integer l,c,k,nbl1,nbc1,nbl2,nbc2,nbldst,nbcdst,diml,dimc real som,mat1(diml,dimc),mat2(diml,dimc),dst(diml,dimc) if(nbc1.ne.nbl2) then print *,'Erreur : produit de 2 matrices de taille incompatible' stop endif nbldst=nbl1 nbcdst=nbc2 do 10 l=1,nbldst do 20 c=1,nbcdst som=0 do 30 k=1,nbc1 som=som+mat1(l,k)*mat2(k,c) 30 continue dst(l,c)=som 20 continue 10 continue end subroutine produit c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012