!!============================================================================= !! MODULE LinAlgFMM !!============================================================================= ! Procedury Decomp,Solve,Svd z knihy ! "Computer Methods for Mathematical Computations", ! by George E. Forsythe, Michael A. Malcolm, and Cleve B. Moler ! Prentice-Hall, 1977. ! ! Prepis pro Fortran 90: ! Last updated: 28 February 2005 by Ralph Carmichael ralph@pdas.com ! Public Domain Aeronautical Software ! P.O. Box 1438 Santa Cruz CA 95061 USA ! ! Upravy pro g95 ! Jan Cely, UFKL,Prirodovedecka fakulta MU ! Verse 1.0 (LinAlgFMMVer="1.0"), unor 2008 ! Opravy: ! V procedurach DecompSingle, DecompDouble ! byla doplnena chybejici inicializace ! ivpn(n)=1 !****************************************************************************** ! ! Moduly vytvorene z procedur v FMM se ukladaji do knihovny libFMM ! !!============================================================================= !! V procedurach REAL(SP|DP) znaci single|double precision !!----------------------------------------------------------------------------- !! SUBROUTINE Decomp(a, ipvt, errCode, cond) !! LU rozklad matice a (Gaussova eliminace) !! VSTUP: !! a = REAL(SP|DP),DIMENSION(n,n) - ctvercova matice pro dekompozici !! ipvt = INTEGER,DIMENSION(n) - vektor pro ukladani informace !! o transpozici radku, ipvt(k) = index radku s k-tym pivotem !! ipvt(n) = (-1)**(pocet transpozic) !! VYSTUP !! a = matice a prepsana LU rozkladem, U je horni trojuhelnik !! L je pod diagonalou (na diagonale ma 1) !! errCode = INTEGER, 0 = OK (matice je regularni), 1 = matice je singularni !! cond = REAL(SP|DP),OPTIONAL - je-li pritomne, ulozi se do nej odhad !! cisla podminenosti cond(a) !!----------------------------------------------------------------------------- !! SUBROUTINE Solve(a, b, ipvt) !! Reseni ax=b zpetnou substituci po Decomp !! VSTUP !! a = matice z vystupu Decomp !! ipvt = ipvt z vystupu Decomp !! b = REAL(SP|DP),DIMENSION(n) - vektor prave strany !! VYSTUP !! b = vektor b prepsany resenim x !!----------------------------------------------------------------------------- !! SUBROUTINE svd(A,w,matU,U,matV,V,ierr) !! Pro REAL(KIND=SP) nebo REAL(KIND=DP) !! VSTUP !! A vstupni matice pro singularni rozklad typu "radku/sloupcu" !! matU LOGICAL, true/false = matice U se pozaduje/nepozaduje !! matV LOGICAL, true/false = matice V se pozaduje/nepozaduje !! VYSTUP !! ierr indikuje kompletni provedeni (ierr=0) procedury, !! nebo predcasne ukonceni (ierr>0), vyznam viz dale !! Pro ierr=-2 [ierr=-3] nema U [V] potrebne dimenze !! w vektor singularnich cisel (1:sloupcu) !! je-li procedura ukoncena s chybou (ierr>0), jsou spravna !! singularni cisla w(ierr+1),w(ierr+2),...,w(sloupcu) !! SINGULARNI CISLA NEJSOU USPORADANA. Pro usporadani lze !! pouzit napr. ShellSort z modulu "sort" !! Predcasne ukonceni svd (ierr>0) nastane po 30 iteracich. !! U matice U typu "radku/sloupcu",je-li matU=.true. muze byt U=A !! pro matU=.false. se pouzije je n jako pracovni !! pro ierr>0 jsou spravne jen sloupce, ktere odpovidaji spravnym !! singularnim cislum !! V matice V pro matV=.true.; pro sloupce ierr>0 plati totez jako !! pro U.Nepozaduje-li se matice U (matU=.false), muze byt V=A !! !!=============================================================================