[COLOR=#a020f0]Program[/color] RankOfMatrix
[COLOR=#0000ff]! Computing singular values of a matrix using LAPACK[/color]
[COLOR=#2e8b57][b]Implicit[/b][/color] [COLOR=#2e8b57][b]none[/b][/color]
[COLOR=#0000ff]! declarations[/color]
[COLOR=#2e8b57][b]integer[/b][/color] :: i, m, n, lda, lds, lwork, lwmax, info, rank
[COLOR=#0000ff]! lwmax = max(3*min(m. n) + max(m,n), 5*min(m,n))[/color]
[COLOR=#0000ff]! = max(3*5 + 8, 25) = 25[/color]
[COLOR=#2e8b57][b]parameter[/b][/color](m [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]8[/color], n [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]5[/color], lwmax[COLOR=#804040][b]=[/b][/color][COLOR=#ff00ff]25[/color])
[COLOR=#0000ff]! lda = max(1, m)[/color]
[COLOR=#0000ff]! lds = max(1, m, n)[/color]
[COLOR=#2e8b57][b]parameter[/b][/color](lda [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]8[/color], lds [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]8[/color])
[COLOR=#2e8b57][b]double precision[/b][/color] :: A(lda,n), S(lds), U(m,m), VT(n), work(lwmax), eps
[COLOR=#0000ff]! matrix A[/color]
A([COLOR=#ff00ff]1[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/[/b][/color][COLOR=#ff00ff]22[/color], [COLOR=#ff00ff]10[/color], [COLOR=#ff00ff]2[/color], [COLOR=#ff00ff]3[/color], [COLOR=#ff00ff]7[/color][COLOR=#804040][b]/[/b][/color])
A([COLOR=#ff00ff]2[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/[/b][/color][COLOR=#ff00ff]14[/color], [COLOR=#ff00ff]7[/color], [COLOR=#ff00ff]10[/color], [COLOR=#ff00ff]0[/color], [COLOR=#ff00ff]8[/color][COLOR=#804040][b]/[/b][/color])
A([COLOR=#ff00ff]3[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/-[/b][/color][COLOR=#ff00ff]1[/color], [COLOR=#ff00ff]13[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]1[/color],[COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]11[/color], [COLOR=#ff00ff]3[/color][COLOR=#804040][b]/[/b][/color])
A([COLOR=#ff00ff]4[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/-[/b][/color][COLOR=#ff00ff]3[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]2[/color], [COLOR=#ff00ff]13[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]2[/color], [COLOR=#ff00ff]4[/color][COLOR=#804040][b]/[/b][/color])
A([COLOR=#ff00ff]5[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/[/b][/color] [COLOR=#ff00ff]9[/color], [COLOR=#ff00ff]8[/color], [COLOR=#ff00ff]1[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]2[/color], [COLOR=#ff00ff]4[/color][COLOR=#804040][b]/[/b][/color])
A([COLOR=#ff00ff]6[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/[/b][/color] [COLOR=#ff00ff]9[/color], [COLOR=#ff00ff]1[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]7[/color], [COLOR=#ff00ff]5[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]1[/color][COLOR=#804040][b]/[/b][/color])
A([COLOR=#ff00ff]7[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/[/b][/color] [COLOR=#ff00ff]2[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]6[/color], [COLOR=#ff00ff]6[/color], [COLOR=#ff00ff]5[/color], [COLOR=#ff00ff]1[/color][COLOR=#804040][b]/[/b][/color])
A([COLOR=#ff00ff]8[/color],:)[COLOR=#804040][b]=[/b][/color]([COLOR=#804040][b]/[/b][/color] [COLOR=#ff00ff]4[/color], [COLOR=#ff00ff]5[/color], [COLOR=#ff00ff]0[/color], [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]2[/color], [COLOR=#ff00ff]2[/color][COLOR=#804040][b]/[/b][/color])
[COLOR=#0000ff]! workspace query: calculates the optimal size of the WORK array[/color]
lwork [COLOR=#804040][b]=[/b][/color] [COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]1[/color]
[COLOR=#008080]CALL[/color] DGESVD([COLOR=#ff00ff]'N'[/color], [COLOR=#ff00ff]'N'[/color], m, n, A, lda, S, U, m, VT, n, WORK, lwork, info)
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'lwmax = '[/color], lwmax
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'work(1) = '[/color], work([COLOR=#ff00ff]1[/color])
[COLOR=#0000ff]! compute workspace size[/color]
lwork [COLOR=#804040][b]=[/b][/color] [COLOR=#008080]min[/color](lwmax, [COLOR=#008080]int[/color](work([COLOR=#ff00ff]1[/color])))
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'lwork = '[/color], lwork
[COLOR=#0000ff]! solve[/color]
[COLOR=#008080]CALL[/color] DGESVD([COLOR=#ff00ff]'N'[/color], [COLOR=#ff00ff]'N'[/color], m, n, A, lda, S, U, m, VT, n, WORK, lwork, info)
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'info = '[/color], info
[COLOR=#804040][b]if[/b][/color] (info [COLOR=#804040][b].eq.[/b][/color] [COLOR=#ff00ff]0[/color]) [COLOR=#804040][b]then[/b][/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'Singular values were succesfully computed:'[/color]
[COLOR=#0000ff]! print the solution x[/color]
[COLOR=#804040][b]do[/b][/color] i[COLOR=#804040][b]=[/b][/color][COLOR=#ff00ff]1[/color], lds
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#ff00ff]9[/color]) i, S(i)
[COLOR=#804040][b]end do[/b][/color]
[COLOR=#804040][b]else[/b][/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'* Error computing singula values!'[/color]
[COLOR=#804040][b]end if[/b][/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color])
[COLOR=#0000ff]! The rank of the matrix is the number of singular values that are not zero[/color]
eps [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]5e-10[/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'epsilon = '[/color], eps
rank [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]0[/color]
[COLOR=#804040][b]do[/b][/color] i[COLOR=#804040][b]=[/b][/color][COLOR=#ff00ff]1[/color], lds
[COLOR=#804040][b]if[/b][/color] (S(i) [COLOR=#804040][b].gt.[/b][/color] eps) [COLOR=#804040][b]then[/b][/color]
rank [COLOR=#804040][b]=[/b][/color] rank [COLOR=#804040][b]+[/b][/color] [COLOR=#ff00ff]1[/color]
[COLOR=#804040][b]end if[/b][/color]
[COLOR=#804040][b]end do[/b][/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'Rank of the Matrix ='[/color], rank
[COLOR=#6a5acd]9[/color] [COLOR=#804040][b]format[/b][/color]([COLOR=#ff00ff]'s['[/color], i1, [COLOR=#ff00ff]']= '[/color], [COLOR=#008080]f27.20[/color])
[COLOR=#a020f0]end program[/color] RankOfMatrix