Commit af246bca404c1a34ac64428f0f8cf29d21dd0228

Authored by wdaniau
1 parent b85eed0171

+) Sorting of eigenvalues/eigenvectors is now optional

+) Documentation updated
+) The test program test_matev has been updated to show the sort option

git-svn-id: https://lxsd.femto-st.fr/svn/fvn@53 b657c933-2333-4658-acf2-d3c7c2708721

Showing 4 changed files with 1898 additions and 1912 deletions Side-by-side Diff

No preview for this file type
... ... @@ -209,7 +209,7 @@
209 209 \subsection{Eigenvalues/Eigenvectors}
210 210 \begin{verbatim}
211 211 Module : use fvn_linear
212   -call fvn_matev(d,a,evala,eveca,status)
  212 +call fvn_matev(d,a,evala,eveca,status,sortval)
213 213 \end{verbatim}
214 214 \begin{itemize}
215 215 \item d (in) is an integer equal to the matrix rank
... ... @@ -217,6 +217,7 @@
217 217 \item evala (out) is a complex array of same kind as a. It contains the eigenvalues of matrix a
218 218 \item eveca (out) is a complex matrix of same kind as a. Its columns are the eigenvectors of matrix a : eveca(:,j)=jth eigenvector associated with eigenvalue evala(j).
219 219 \item status (out) is an optional integer equal to zero if something went wrong
  220 + \item sortval (in) is an optional logical, if it is true the eigenvalues (and eigenvectors) are sorted in decreasing order of eigenvalues's modulus.
220 221 \end{itemize}
221 222  
222 223  
fvn_linear/fvn_linear.f90
... ... @@ -1086,7 +1086,7 @@
1086 1086  
1087 1087 end subroutine
1088 1088  
1089   -subroutine fvn_s_matev(d,a,evala,eveca,status)
  1089 +subroutine fvn_s_matev(d,a,evala,eveca,status,sortval)
1090 1090 !
1091 1091 ! integer d (in) : matrice rank
1092 1092 ! real a(d,d) (in) : The Matrix
... ... @@ -1101,6 +1101,7 @@
1101 1101 complex, intent(out) :: evala(d)
1102 1102 complex, intent(out) :: eveca(d,d)
1103 1103 integer, intent(out), optional :: status
  1104 + logical, intent(in), optional :: sortval
1104 1105  
1105 1106 real, allocatable :: wc_a(:,:) ! a working copy of a
1106 1107 integer :: info
1107 1108  
... ... @@ -1160,11 +1161,13 @@
1160 1161 deallocate(wc_a)
1161 1162  
1162 1163 ! sorting
1163   - call fvn_c_sort_eigen(d,evala,eveca)
  1164 + if (present(sortval) .and. sortval) then
  1165 + call fvn_c_sort_eigen(d,evala,eveca)
  1166 + end if
1164 1167  
1165 1168 end subroutine
1166 1169  
1167   -subroutine fvn_d_matev(d,a,evala,eveca,status)
  1170 +subroutine fvn_d_matev(d,a,evala,eveca,status,sortval)
1168 1171 !
1169 1172 ! integer d (in) : matrice rank
1170 1173 ! double precision a(d,d) (in) : The Matrix
... ... @@ -1179,6 +1182,7 @@
1179 1182 double complex, intent(out) :: evala(d)
1180 1183 double complex, intent(out) :: eveca(d,d)
1181 1184 integer, intent(out), optional :: status
  1185 + logical, intent(in), optional :: sortval
1182 1186  
1183 1187 double precision, allocatable :: wc_a(:,:) ! a working copy of a
1184 1188 integer :: info
1185 1189  
... ... @@ -1239,11 +1243,13 @@
1239 1243 deallocate(wc_a)
1240 1244  
1241 1245 ! sorting
1242   - call fvn_z_sort_eigen(d,evala,eveca)
  1246 + if (present(sortval) .and. sortval) then
  1247 + call fvn_z_sort_eigen(d,evala,eveca)
  1248 + end if
1243 1249  
1244 1250 end subroutine
1245 1251  
1246   -subroutine fvn_c_matev(d,a,evala,eveca,status)
  1252 +subroutine fvn_c_matev(d,a,evala,eveca,status,sortval)
1247 1253 !
1248 1254 ! integer d (in) : matrice rank
1249 1255 ! complex a(d,d) (in) : The Matrix
... ... @@ -1258,6 +1264,7 @@
1258 1264 complex, intent(out) :: evala(d)
1259 1265 complex, intent(out) :: eveca(d,d)
1260 1266 integer, intent(out), optional :: status
  1267 + logical, intent(in), optional :: sortval
1261 1268  
1262 1269 complex, allocatable :: wc_a(:,:) ! a working copy of a
1263 1270 integer :: info
1264 1271  
... ... @@ -1290,11 +1297,13 @@
1290 1297 deallocate(wc_a)
1291 1298  
1292 1299 ! sorting
1293   - call fvn_c_sort_eigen(d,evala,eveca)
  1300 + if (present(sortval) .and. sortval) then
  1301 + call fvn_c_sort_eigen(d,evala,eveca)
  1302 + end if
1294 1303  
1295 1304 end subroutine
1296 1305  
1297   -subroutine fvn_z_matev(d,a,evala,eveca,status)
  1306 +subroutine fvn_z_matev(d,a,evala,eveca,status,sortval)
1298 1307 !
1299 1308 ! integer d (in) : matrice rank
1300 1309 ! double complex a(d,d) (in) : The Matrix
... ... @@ -1309,6 +1318,7 @@
1309 1318 double complex, intent(out) :: evala(d)
1310 1319 double complex, intent(out) :: eveca(d,d)
1311 1320 integer, intent(out), optional :: status
  1321 + logical, intent(in), optional :: sortval
1312 1322  
1313 1323 double complex, allocatable :: wc_a(:,:) ! a working copy of a
1314 1324 integer :: info
... ... @@ -1340,8 +1350,9 @@
1340 1350 deallocate(wc_a)
1341 1351  
1342 1352 ! sorting
1343   - call fvn_z_sort_eigen(d,evala,eveca)
1344   -
  1353 + if (present(sortval) .and. sortval) then
  1354 + call fvn_z_sort_eigen(d,evala,eveca)
  1355 + end if
1345 1356 end subroutine
1346 1357  
1347 1358  
fvn_test/test_matev.f90
1 1 program test_matev
2 2 use fvn_linear
3 3 implicit none
4   -real(8),dimension(3,3) :: a
  4 +complex(8),dimension(3,3) :: a
  5 +real(8),dimension(3,3) :: ra,ia
5 6 complex(8),dimension(3) :: evala
6 7 complex(8),dimension(3,3) :: eveca
7 8 integer :: status,i,j
  9 +
8 10 call init_random_seed()
9   -call random_number(a)
  11 +call random_number(ra)
  12 +call random_number(ia)
  13 +a=ra+fvn_i*ia
10 14 a=a*100
11 15 call fvn_matev(3,a,evala,eveca,status)
12 16  
13 17 write(*,*) "The matrix :"
14   -write (*,'(3(e12.5))') a
  18 +write (*,'(3("(",e12.5,",",e12.5,")"))') a
15 19 write (*,*)
16 20 do i=1,3
17   -write(*,'("Eigenvalue ",I3," : (",e12.5,",",e12.5,") ")') i,evala(i)
18   -write(*,*) "Associated Eigenvector :"
19   -do j=1,3
20   -write(*,'("(",e12.5,",",e12.5,") ")') eveca(j,i)
  21 + write(*,'("Eigenvalue ",I3," : (",e12.5,",",e12.5,") ")') i,evala(i)
  22 + write(*,'("Modulus : ",e12.5)') abs(evala(i))
  23 + write(*,*) "Associated Eigenvector :"
  24 + do j=1,3
  25 + write(*,'("(",e12.5,",",e12.5,") ")') eveca(j,i)
  26 + end do
  27 + write(*,*)
21 28 end do
22   -write(*,*)
  29 +
  30 +! tri
  31 +write(*,*) "With sort option"
  32 +call fvn_matev(3,a,evala,eveca,status,.true.)
  33 +do i=1,3
  34 + write(*,'("Eigenvalue ",I3," : (",e12.5,",",e12.5,") ")') i,evala(i)
  35 + write(*,'("Modulus : ",e12.5)') abs(evala(i))
  36 + write(*,*) "Associated Eigenvector :"
  37 + do j=1,3
  38 + write(*,'("(",e12.5,",",e12.5,") ")') eveca(j,i)
  39 + end do
  40 + write(*,*)
23 41 end do
  42 +
  43 +
24 44 end program