Commit 6dd35851650ad66ba50c59e7125ef43b8f3cae45
1 parent
41811905dd
Exists in
geevx
Ajout de fvn_d_matevx utilisant la routine lapack dgeevx
+ programme de test pour matev séparé en un test réel et un test complexe
Showing 4 changed files with 157 additions and 4 deletions Side-by-side Diff
fvn_linear/fvn_linear.f90
| ... | ... | @@ -1356,6 +1356,104 @@ |
| 1356 | 1356 | end subroutine |
| 1357 | 1357 | |
| 1358 | 1358 | |
| 1359 | +! This version use dgeevx | |
| 1360 | +subroutine fvn_d_matevx(d,a,evala,eveca,status,sortval) | |
| 1361 | + ! | |
| 1362 | + ! integer d (in) : matrice rank | |
| 1363 | + ! double precision a(d,d) (in) : The Matrix | |
| 1364 | + ! double complex evala(d) (out) : eigenvalues | |
| 1365 | + ! double complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector | |
| 1366 | + ! integer (out) : status =0 if something went wrong | |
| 1367 | + ! | |
| 1368 | + ! interfacing Lapack routine DGEEVX | |
| 1369 | + implicit none | |
| 1370 | + integer, intent(in) :: d | |
| 1371 | + double precision, intent(in) :: a(d,d) | |
| 1372 | + double complex, intent(out) :: evala(d) | |
| 1373 | + double complex, intent(out) :: eveca(d,d) | |
| 1374 | + integer, intent(out), optional :: status | |
| 1375 | + logical, intent(in), optional :: sortval | |
| 1376 | + | |
| 1377 | + double precision, allocatable :: wc_a(:,:) ! a working copy of a | |
| 1378 | + integer :: info | |
| 1379 | + integer :: lwork | |
| 1380 | + double precision, allocatable :: wr(:),wi(:) | |
| 1381 | + double precision, allocatable :: vl(:,:) | |
| 1382 | + double precision, allocatable :: vr(:,:) | |
| 1383 | + double precision, allocatable :: work(:) | |
| 1384 | + double precision :: twork(1) | |
| 1385 | + integer i | |
| 1386 | + integer j | |
| 1387 | + | |
| 1388 | + integer :: ilo,ihi | |
| 1389 | + double precision, allocatable, dimension(:) :: scal,rconde,rcondv | |
| 1390 | + double precision :: abnrm | |
| 1391 | + integer, allocatable, dimension(:) :: iwork | |
| 1392 | + | |
| 1393 | + if (present(status)) status=1 | |
| 1394 | + | |
| 1395 | + ! making a working copy of a | |
| 1396 | + allocate(wc_a(d,d)) | |
| 1397 | + !call dcopy(d*d,a,1,wc_a,1) | |
| 1398 | + wc_a(:,:)=a(:,:) | |
| 1399 | + | |
| 1400 | + allocate(wr(d)) | |
| 1401 | + allocate(wi(d)) | |
| 1402 | + allocate(vr(d,d),vl(d,d)) | |
| 1403 | + allocate(scal(d),rconde(d),rcondv(d),iwork(2*d-2)) | |
| 1404 | + ! query optimal work size | |
| 1405 | + call dgeevx('B','V','V','B',d,wc_a,d,wr,wi,vl,d,vr,d,ilo,ihi,scal,abnrm,rconde,rcondv,twork,-1,iwork,info) | |
| 1406 | + lwork=int(twork(1)) | |
| 1407 | + allocate(work(lwork)) | |
| 1408 | + call dgeevx('B','V','V','B',d,wc_a,d,wr,wi,vl,d,vr,d,ilo,ihi,scal,abnrm,rconde,rcondv,work,lwork,iwork,info) | |
| 1409 | + | |
| 1410 | + if (info /= 0) then | |
| 1411 | + if (present(status)) status=0 | |
| 1412 | + deallocate(work) | |
| 1413 | + deallocate(iwork) | |
| 1414 | + deallocate(rcondv) | |
| 1415 | + deallocate(rconde) | |
| 1416 | + deallocate(scal) | |
| 1417 | + deallocate(vr) | |
| 1418 | + deallocate(vl) | |
| 1419 | + deallocate(wi) | |
| 1420 | + deallocate(wr) | |
| 1421 | + deallocate(wc_a) | |
| 1422 | + return | |
| 1423 | + end if | |
| 1424 | + | |
| 1425 | + ! now fill in the results | |
| 1426 | + i=1 | |
| 1427 | + do while(i<=d) | |
| 1428 | + evala(i)=dcmplx(wr(i),wi(i)) | |
| 1429 | + if (wi(i) == 0.) then ! eigenvalue is real | |
| 1430 | + eveca(:,i)=dcmplx(vr(:,i),0.) | |
| 1431 | + else ! eigenvalue is complex | |
| 1432 | + evala(i+1)=dcmplx(wr(i+1),wi(i+1)) | |
| 1433 | + eveca(:,i)=dcmplx(vr(:,i),vr(:,i+1)) | |
| 1434 | + eveca(:,i+1)=dcmplx(vr(:,i),-vr(:,i+1)) | |
| 1435 | + i=i+1 | |
| 1436 | + end if | |
| 1437 | + i=i+1 | |
| 1438 | + enddo | |
| 1439 | + | |
| 1440 | + deallocate(work) | |
| 1441 | + deallocate(iwork) | |
| 1442 | + deallocate(rcondv) | |
| 1443 | + deallocate(rconde) | |
| 1444 | + deallocate(scal) | |
| 1445 | + deallocate(vr) | |
| 1446 | + deallocate(vl) | |
| 1447 | + deallocate(wi) | |
| 1448 | + deallocate(wr) | |
| 1449 | + deallocate(wc_a) | |
| 1450 | + | |
| 1451 | + ! sorting | |
| 1452 | + if (present(sortval) .and. sortval) then | |
| 1453 | + call fvn_z_sort_eigen(d,evala,eveca) | |
| 1454 | + end if | |
| 1455 | +end subroutine | |
| 1456 | + | |
| 1359 | 1457 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
| 1360 | 1458 | ! |
| 1361 | 1459 | ! Least square problem |
fvn_test/test_matev.f90
| 1 | -program test_matev | |
| 2 | -use fvn_linear | |
| 3 | -implicit none | |
| 4 | -complex(kind=dp_kind),dimension(3,3) :: a | |
| 5 | -real(kind=dp_kind),dimension(3,3) :: ra,ia | |
| 6 | -complex(kind=dp_kind),dimension(3) :: evala | |
| 7 | -complex(kind=dp_kind),dimension(3,3) :: eveca | |
| 8 | -integer :: status,i,j | |
| 9 | - | |
| 10 | -call init_random_seed() | |
| 11 | -call random_number(ra) | |
| 12 | -call random_number(ia) | |
| 13 | -a=ra+fvn_i*ia | |
| 14 | -a=a*100 | |
| 15 | -call fvn_matev(3,a,evala,eveca,status) | |
| 16 | - | |
| 17 | -write(*,*) "The matrix :" | |
| 18 | -write (*,'(3("(",e12.5,",",e12.5,")"))') a | |
| 19 | -write (*,*) | |
| 20 | -do i=1,3 | |
| 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(*,*) | |
| 28 | -end do | |
| 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(*,*) | |
| 41 | -end do | |
| 42 | - | |
| 43 | - | |
| 44 | -end program |
fvn_test/test_matev_c.f90
| 1 | +program test_matev | |
| 2 | +use fvn_linear | |
| 3 | +implicit none | |
| 4 | +complex(8),dimension(3,3) :: a | |
| 5 | +real(8),dimension(3,3) :: ra,ia | |
| 6 | +complex(8),dimension(3) :: evala | |
| 7 | +complex(8),dimension(3,3) :: eveca | |
| 8 | +integer :: status,i,j | |
| 9 | + | |
| 10 | +call init_random_seed() | |
| 11 | +call random_number(ra) | |
| 12 | +call random_number(ia) | |
| 13 | +a=ra+fvn_i*ia | |
| 14 | +a=a*100 | |
| 15 | +call fvn_matev(3,a,evala,eveca,status) | |
| 16 | + | |
| 17 | +write(*,*) "The matrix :" | |
| 18 | +write (*,'(3("(",e12.5,",",e12.5,")"))') a | |
| 19 | +write (*,*) | |
| 20 | +do i=1,3 | |
| 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(*,*) | |
| 28 | +end do | |
| 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(*,*) | |
| 41 | +end do | |
| 42 | + | |
| 43 | + | |
| 44 | +end program |
fvn_test/test_matev_r.f90
| 1 | +program test_matev | |
| 2 | +use fvn_linear | |
| 3 | +implicit none | |
| 4 | +real(8),dimension(3,3) :: a | |
| 5 | +complex(8),dimension(3) :: evala | |
| 6 | +complex(8),dimension(3,3) :: eveca | |
| 7 | +integer :: status,i,j | |
| 8 | + | |
| 9 | +call init_random_seed() | |
| 10 | +call random_number(a) | |
| 11 | +a=a*100 | |
| 12 | +call fvn_matev(3,a,evala,eveca,status) | |
| 13 | + | |
| 14 | +write(*,*) "The matrix :" | |
| 15 | +write (*,'(3e12.5)') a | |
| 16 | +write (*,*) | |
| 17 | +do i=1,3 | |
| 18 | + write(*,'("Eigenvalue ",I3," : (",e12.5,",",e12.5,") ")') i,evala(i) | |
| 19 | + write(*,'("Modulus : ",e12.5)') abs(evala(i)) | |
| 20 | + write(*,*) "Associated Eigenvector :" | |
| 21 | + do j=1,3 | |
| 22 | + write(*,'("(",e12.5,",",e12.5,") ")') eveca(j,i) | |
| 23 | + end do | |
| 24 | + write(*,*) | |
| 25 | +end do | |
| 26 | + | |
| 27 | +write(*,*) "Computation using matevx" | |
| 28 | +call fvn_d_matevx(3,a,evala,eveca,status) | |
| 29 | +do i=1,3 | |
| 30 | + write(*,'("Eigenvalue ",I3," : (",e12.5,",",e12.5,") ")') i,evala(i) | |
| 31 | + write(*,'("Modulus : ",e12.5)') abs(evala(i)) | |
| 32 | + write(*,*) "Associated Eigenvector :" | |
| 33 | + do j=1,3 | |
| 34 | + write(*,'("(",e12.5,",",e12.5,") ")') eveca(j,i) | |
| 35 | + end do | |
| 36 | + write(*,*) | |
| 37 | +end do | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | +! tri | |
| 42 | +write(*,*) "With sort option" | |
| 43 | +call fvn_matev(3,a,evala,eveca,status,.true.) | |
| 44 | +do i=1,3 | |
| 45 | + write(*,'("Eigenvalue ",I3," : (",e12.5,",",e12.5,") ")') i,evala(i) | |
| 46 | + write(*,'("Modulus : ",e12.5)') abs(evala(i)) | |
| 47 | + write(*,*) "Associated Eigenvector :" | |
| 48 | + do j=1,3 | |
| 49 | + write(*,'("(",e12.5,",",e12.5,") ")') eveca(j,i) | |
| 50 | + end do | |
| 51 | + write(*,*) | |
| 52 | +end do | |
| 53 | + | |
| 54 | + | |
| 55 | +end program |