c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab c Copyright (C) 1985-2008 - Carlos KLIMANN c c This file must be used under the terms of the CeCILL. c This source file is licensed as described in the file COPYING, c which c you should have received as part of this distribution. The terms c are also available at c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt subroutine mpinsp(dep1,lig1,col1,v1,d1,v2,d2,dep2, & lig2,col2,depr,ligr,colr,defsz,iwork,ierr) c !but c c Cette subroutine pretraite l'insertion d'une c matrice de polynomes mat2 dans une autre mat1 d'apres deux c vecteurs.Pour calculer le volume qu'occupera le resultat c c !parametres d'appel c c call mpinsp(dep1,lig1,col1,v1,d1,v2,d2,dep2,lig2,col2 c & ,depr,ligr,colr,defsz,iwork,ierr) c c ou c c dep1: matrice entiere qui donne les deplacements relatifs des c elements de mat1 c c lig1, col1: entiers, dimensions de mat1 c c v1: vecteur entier c c d1: longueur du vecteur v1 c c v2, d2: analogues aux anterieurs c c dep2, lig2, col2: analogues aux correspondents 1 c c depr: contient les information issues du pretraitement: c depr(1) contient le volume des coeff de la matrice resultat c depr(1+i) contient un pointeur vers dep1 si positif c vers dep2 si negatif c vers 0 si nul c c ligr, colr: entiers dimensions de la matrice de sortie c depr. S'ils ne sont pas connus au prealable c peuvent etre calcules par la subroutine dimin. c defsz: entier: taille de l'element par default c iwork: tableau entier de taille colr+ligr c ierr: si 0 terminaison correcte, c sinon les dimensions de mat2 ne sont pas compatibles c c c attention!: aucune de matrices dep1, dep2 ou depr ne c doit coincider. Dans le cas contraire, les resultats seraient c imprevisibles. c c c c ! integer dep1(*),v1(*),v2(*),dep2(*),depr(*),iwork(*) integer lig1,col1,d1,d2,lig2,col2,ligr,colr,ierr,defsz c integer volr c ierr=0 volr=0 if (d1.eq.0.or.d2.eq.0) return if(d1.gt.0.or.d2.gt.0) goto 10 c c cas (:,:) c if(lig1.ne.lig2.or.col1.ne.col2) then if(lig2*col2.eq.1) then ir=lig1*col1+1 do 04 i=1,ir depr(i+1)=-1 04 continue volr=(dep2(2)-dep2(1))*lig1*col1 goto 999 else ierr=1 return endif endif c ir=lig1*col1+1 do 05 i=1,ir depr(i+1)=-i 05 continue volr=dep2(ir)-dep2(1) goto 999 c 10 if(d1.lt.0) then c cas (:,.) inc2=1 if(max(1,lig1).ne.lig2) then if(lig2.eq.1.and.col2.eq.1) then inc2=0 else ierr=1 return endif endif c c toutes les lignes pour un choix de colonnes c kr=1 volr=0 c trouver les colonnes qui sont modifiées call iset(colr,0,iwork,1) do i=1,d2 iwork(v2(i))=i enddo do 19 jr=1,colr c la colonne jr est elle a modifier ? id2=iwork(jr) if(id2.eq.0) goto 14 c oui if(inc2.eq.1) then k2=lig2*(id2-1) do 12 ir=1,ligr kr=kr+1 depr(kr)=-1 12 continue volr=volr+ligr*(dep2(2)-dep2(1)) else do 13 ir=1,ligr kr=kr+1 depr(kr)=-(k2+ir) 13 continue volr=volr+dep2(k2+ligr+1)-dep2(k2+1) endif go to 19 c non 14 if(jr.le.col1) then c la colonne designee existe dans mat1 k1=(jr-1)*lig1 do 17 ir=1,ligr kr=kr+1 depr(kr)=(k1+ir) 17 continue volr=volr+dep1(k1+ligr+1)-dep1(k1+1) goto 19 endif c si non, inserer un string vide do 18 ir=1,ligr kr=kr+1 depr(kr)=0 18 continue volr=volr+ligr*defsz 19 continue goto 999 endif c if(d2.lt.0) then c cas (.,:) inc2=1 if(col1.ne.max(1,col2)) then if(lig2.eq.1.and.col2.eq.1) then inc2=0 else ierr=1 return endif endif c c toutes les colonnes pour un choix de lignes c call iset(ligr,0,iwork,1) do i=1,d1 iwork(v1(i))=i enddo do 29 ir=1,ligr kr=ir+1-ligr c la ligne ir est elle a modifier ? id1=iwork(ir) if(id1.eq.0) goto 24 c oui if(inc2.eq.1) then k2=id1-lig2 do 22 jr=1,colr kr=kr+ligr k2=k2+lig2 depr(kr)=-k2 volr=volr+dep2(k2+1)-dep2(k2) 22 continue else do 23 jr=1,colr kr=kr+ligr depr(kr)=-1 volr=volr+colr*(dep2(2)-dep2(1)) 23 continue endif go to 29 c non 24 if(ir.le.lig1) then c la ligne designee existe dans mat1 k1=ir-lig1 do 27 jr=1,colr kr=kr+ligr k1=k1+lig1 volr=volr+dep1(k1+1)-dep1(k1) depr(kr)=k1 27 continue goto 29 endif c si non, inserer des zeros do 28 jr=1,colr kr=kr+ligr depr(kr)=0 28 continue volr=volr+colr*defsz 29 continue goto 999 endif c c cas general c kr=2 inc2=1 if(lig2.eq.1.and.col2.eq.1) inc2=0 call iset(colr+ligr,0,iwork,1) do i=1,d2 iwork(v2(i))=i enddo do i=1,d1 iwork(colr+v1(i))=i enddo do 40 jr=1,colr c la colonne jr est elle a modifier ? id2=iwork(jr) if(id2.eq.0) goto 35 c do 34 ir=1,ligr c la ligne ir est-elle a modifier id1=iwork(colr+ir) if(id1.eq.0) goto 32 c if(inc2.eq.1) then k2=id1+lig2*(id2-1) depr(kr)=-k2 volr=volr+dep2(k2+1)-dep2(k2) else depr(kr)=-1 volr=volr+dep2(2)-dep2(1) endif kr=kr+1 go to 34 c 32 if(ir.gt.lig1.or.jr.gt.col1) goto 33 k1=ir+lig1*(jr-1) depr(kr)=k1 kr=kr+1 volr=volr+dep1(k1+1)-dep1(k1) goto 34 c 33 depr(kr)=0 kr=kr+1 volr=volr+defsz 34 continue goto 40 c non c toutes les lignes de la colonne designee 35 if(jr.gt.col1) goto 38 k1=(jr-1)*lig1 do 36 ir=1,lig1 depr(kr)=k1+ir kr=kr+1 36 continue volr=volr+dep1(k1+lig1+1)-dep1(k1+1) if(lig1.ge.ligr) goto 40 do 37 ir=lig1+1,ligr depr(kr)=0 kr=kr+1 37 continue volr=volr+(ligr-lig1)*defsz goto 40 38 do 39 ir=1,ligr depr(kr)=0 kr=kr+1 39 continue volr=volr+ligr*defsz 40 continue c 999 depr(1)=volr return end