Octopus
lalg_adv.F90
Go to the documentation of this file.
1!! Copyright (C) 2002-2006 M. Marques, A. Castro, A. Rubio, G. Bertsch
2!!
3!! This program is free software; you can redistribute it and/or modify
4!! it under the terms of the GNU General Public License as published by
5!! the Free Software Foundation; either version 2, or (at your option)
6!! any later version.
7!!
8!! This program is distributed in the hope that it will be useful,
9!! but WITHOUT ANY WARRANTY; without even the implied warranty of
10!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11!! GNU General Public License for more details.
12!!
13!! You should have received a copy of the GNU General Public License
14!! along with this program; if not, write to the Free Software
15!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16!! 02110-1301, USA.
17!!
18
19#include "global.h"
20
21module lalg_adv_oct_m
23 use blacs_oct_m
24 use debug_oct_m
25 use global_oct_m
26 use, intrinsic :: iso_fortran_env
27 use lapack_oct_m
29 use math_oct_m
31 use mpi_oct_m
34 use sort_oct_m
35 use utils_oct_m
36#ifdef HAVE_ELPA
37 use elpa
38#endif
39
40 implicit none
41
42 private
43 public :: &
57 zlalg_exp, &
58 zlalg_phi, &
63 lalg_zdni, &
65 lalg_zd2ni, &
70
71
72
73 interface lalg_cholesky
74 module procedure dcholesky, zcholesky
75 end interface lalg_cholesky
76
77 interface lalg_geneigensolve
78 module procedure dgeneigensolve, zgeneigensolve
79 end interface lalg_geneigensolve
80
81 interface lalg_eigensolve_nonh
82 module procedure zeigensolve_nonh, deigensolve_nonh
83 end interface lalg_eigensolve_nonh
84
85 interface lalg_eigensolve
86 module procedure deigensolve, zeigensolve
87 end interface lalg_eigensolve
88
91 end interface lalg_eigensolve_parallel
92
95
96 interface lalg_determinant
97 module procedure ddeterminant, zdeterminant
98 end interface lalg_determinant
99
100 interface lalg_inverse
101 module procedure dinverse, zinverse
102 end interface lalg_inverse
103
104 interface lalg_linsyssolve
105 module procedure dlinsyssolve, zlinsyssolve
106 end interface lalg_linsyssolve
107
110 end interface lalg_singular_value_decomp
111
112 interface lalg_pseudo_inverse
115
116 interface lalg_svd_inverse
117 module procedure dsvd_inverse, zsvd_inverse
118 end interface lalg_svd_inverse
119
122 end interface lalg_lowest_geneigensolve
123
124 interface lalg_lowest_eigensolve
125 module procedure dlowest_eigensolve, zlowest_eigensolve
126 end interface lalg_lowest_eigensolve
127
128 interface lapack_geev
129 module procedure lalg_dgeev, lalg_zgeev
130 end interface lapack_geev
131
132 interface lalg_least_squares
133 module procedure dleast_squares_vec, zleast_squares_vec
134 end interface lalg_least_squares
135
136 interface lalg_matrix_norm2
137 module procedure dmatrix_norm2, zmatrix_norm2
138 end interface lalg_matrix_norm2
139
140 interface lalg_matrix_function
142 end interface lalg_matrix_function
143
144contains
145
146 ! ---------------------------------------------------------
148 real(real64) function sfmin()
149 interface
150 real(real64) function dlamch(cmach)
151 import real64
152 implicit none
153 character(1), intent(in) :: cmach
154 end function dlamch
155 end interface
156
157 sfmin = dlamch('S')
158 end function sfmin
159
160 subroutine lalg_dgeev(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
161 character(1), intent(in) :: jobvl, jobvr
162 integer, intent(in) :: n, lda, ldvl, ldvr, lwork
163 real(real64), intent(inout) :: a(:, :)
164 complex(real64), intent(out) :: w(:)
165 real(real64), intent(out) :: vl(:, :), vr(:, :)
166 real(real64), intent(out) :: work(:)
167 real(real64), intent(out) :: rwork(:)
168 integer, intent(out) :: info
169
170 real(real64), allocatable :: wr(:), wi(:)
171
172 push_sub(lalg_dgeev)
173
174 safe_allocate(wr(1:n))
175 safe_allocate(wi(1:n))
176
177 call dgeev(jobvl, jobvr, n, a(1, 1), lda, wr(1), wi(1), vl(1, 1), ldvl, vr(1, 1), ldvr, work(1), lwork, info)
179 w(1:n) = cmplx(wr(1:n), wi(1:n), real64)
180
181 safe_deallocate_a(wr)
182 safe_deallocate_a(wi)
183
184 pop_sub(lalg_dgeev)
185 end subroutine lalg_dgeev
186
187 subroutine lalg_zgeev(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
188 character(1), intent(in) :: jobvl, jobvr
189 integer, intent(in) :: n, lda, ldvl, ldvr, lwork
190 complex(real64), intent(inout) :: a(:, :)
191 complex(real64), intent(out) :: w(:)
192 complex(real64), intent(out) :: vl(:, :), vr(:, :)
193 real(real64), intent(out) :: rwork(:)
194 complex(real64), intent(out) :: work(:)
195 integer, intent(out) :: info
196
197 push_sub(lalg_zgeev)
198
199 call zgeev(jobvl, jobvr, n, a(1, 1), lda, w(1), vl(1, 1), ldvl, vr(1, 1), ldvr, work(1), lwork, rwork(1), info)
200
201 pop_sub(lalg_zgeev)
202 end subroutine lalg_zgeev
203
221 subroutine zlalg_exp(nn, pp, aa, ex, hermitian)
222 integer, intent(in) :: nn
223 complex(real64), intent(in) :: pp
224 complex(real64), intent(in) :: aa(:, :)
225 complex(real64), intent(inout) :: ex(:, :)
226 logical, intent(in) :: hermitian
227
228 complex(real64), allocatable :: evectors(:, :), zevalues(:)
229 real(real64), allocatable :: evalues(:)
230
231 integer :: ii
232
233 push_sub(zlalg_exp)
234
235 safe_allocate(evectors(1:nn, 1:nn))
236
237 if (hermitian) then
238 safe_allocate(evalues(1:nn))
239 safe_allocate(zevalues(1:nn))
240
241 evectors(1:nn, 1:nn) = aa(1:nn, 1:nn)
242
243 call lalg_eigensolve(nn, evectors, evalues)
244
245 zevalues(1:nn) = exp(pp*evalues(1:nn))
246
247 do ii = 1, nn
248 ex(1:nn, ii) = zevalues(1:nn)*conjg(evectors(ii, 1:nn))
249 end do
250
251 ex(:, :) = matmul(evectors(:, :), ex(:, :))
252
253 safe_deallocate_a(evalues)
254 safe_deallocate_a(zevalues)
255 else
256 safe_allocate(zevalues(1:nn))
257
258 evectors(1:nn, 1:nn) = aa(1:nn, 1:nn)
259
260 call lalg_eigensolve_nonh(nn, evectors, zevalues)
261
262 zevalues(1:nn) = exp(pp*zevalues(1:nn))
263
264 ex(1:nn, 1:nn) = evectors(1:nn, 1:nn)
265
266 call lalg_inverse(nn, evectors, 'dir')
267
268 do ii = 1, nn
269 evectors(1:nn, ii) = zevalues(1:nn)*evectors(1:nn, ii)
270 end do
271
272 ex(:, :) = matmul(ex(:, :), evectors(:, :))
273
274 safe_deallocate_a(zevalues)
275 end if
276
277 safe_deallocate_a(evectors)
278
279 pop_sub(zlalg_exp)
280 end subroutine zlalg_exp
281
282
299 subroutine zlalg_phi(nn, pp, aa, ex, hermitian)
300 integer, intent(in) :: nn
301 complex(real64), intent(in) :: pp
302 complex(real64), intent(in) :: aa(:, :)
303 complex(real64), intent(inout) :: ex(:, :)
304 logical, intent(in) :: hermitian
305
306 complex(real64), allocatable :: evectors(:, :), zevalues(:)
307 real(real64), allocatable :: evalues(:)
308
309 integer :: ii
310
311 push_sub(zlalg_phi)
312
313 safe_allocate(evectors(1:nn, 1:nn))
315 if (hermitian) then
316 safe_allocate(evalues(1:nn))
317 safe_allocate(zevalues(1:nn))
318
319 evectors(:, :) = aa(:, :)
320
321 call lalg_eigensolve(nn, evectors, evalues)
322
323 do ii = 1, nn
324 zevalues(ii) = (exp(pp*evalues(ii)) - m_z1) / (pp*evalues(ii))
325 end do
326
327 do ii = 1, nn
328 ex(1:nn, ii) = zevalues(1:nn)*conjg(evectors(ii, 1:nn))
329 end do
330
331 ex(:, :) = matmul(evectors(:, :), ex(:, :))
332
333 safe_deallocate_a(evalues)
334 safe_deallocate_a(zevalues)
335 else
336 safe_allocate(zevalues(1:nn))
337
338 evectors(:, :) = aa(:, :)
339
340 call lalg_eigensolve_nonh(nn, evectors, zevalues)
341
342 do ii = 1, nn
343 zevalues(ii) = (exp(pp*zevalues(ii)) - m_z1) / (pp*zevalues(ii))
344 end do
345
346 ex(:, :) = evectors(:, :)
347
348 call lalg_inverse(nn, evectors, 'dir')
349
350 do ii = 1, nn
351 evectors(1:nn, ii) = zevalues(1:nn)*evectors(1:nn, ii)
352 end do
353
354 ex(:, :) = matmul(ex(:, :), evectors(:, :))
355
356 safe_deallocate_a(zevalues)
357 end if
358
359 pop_sub(zlalg_phi)
360 end subroutine zlalg_phi
361
362
374 subroutine lalg_zeigenderivatives(n, mat, zeigenvec, zeigenval, zmat)
375 integer, intent(in) :: n
376 complex(real64), contiguous, intent(in) :: mat(:, :)
377 complex(real64), contiguous, intent(out) :: zeigenvec(:, :)
378 complex(real64), contiguous, intent(out) :: zeigenval(:)
379 complex(real64), contiguous, intent(out) :: zmat(:, :, :)
380
381 integer :: i, alpha, beta
382 complex(real64), allocatable :: knaught(:, :)
383 complex(real64), allocatable :: lambdaminusdm(:, :)
384 complex(real64), allocatable :: ilambdaminusdm(:, :)
385 complex(real64), allocatable :: unit(:, :)
386
387 push_sub(lalg_zeigenderivatives)
388
389 safe_allocate(unit(1:n, 1:n))
390 safe_allocate(knaught(1:n, 1:n))
391 safe_allocate(lambdaminusdm(1:n, 1:n))
392 safe_allocate(ilambdaminusdm(1:n, 1:n))
393
394 zeigenvec = mat
395 call lalg_eigensolve_nonh(n, zeigenvec, zeigenval)
396
397 unit = m_z0
398 do i = 1, n
399 unit(i, i) = m_z1
400 end do
401
402 do i = 1, n
403 do alpha = 1, n
404 do beta = 1, n
405 knaught(alpha, beta) = - zeigenvec(alpha, i)*conjg(zeigenvec(beta, i))
406 end do
407 end do
408 knaught = knaught + unit
409 lambdaminusdm = zeigenval(i)*unit - mat
410 ! TODO(Alex) Swap this call
411 call lalg_zpseudoinverse(n, lambdaminusdm, ilambdaminusdm)
412 zmat(:, :, i) = matmul(ilambdaminusdm, knaught)
413 end do
414
415 safe_deallocate_a(unit)
416 safe_deallocate_a(knaught)
417 safe_deallocate_a(lambdaminusdm)
418 safe_deallocate_a(ilambdaminusdm)
420 end subroutine lalg_zeigenderivatives
421
422
423 ! TODO(Alex) Issue #1132.
424 ! * This routine is redunant. Its usage should be replaced with either zsvd_inverse or zlalg_pseudo_inverse.
426 subroutine lalg_zpseudoinverse(n, mat, imat)
427 integer, intent(in) :: n
428 complex(real64), contiguous, intent(in) :: mat(:, :)
429 complex(real64), contiguous, intent(out) :: imat(:, :)
430
431 integer :: i
432 complex(real64), allocatable :: u(:, :), vt(:, :), sigma(:, :)
433 real(real64), allocatable :: sg_values(:)
434
435 push_sub(lalg_zpseudoinverse)
436
437 safe_allocate(u(1:n, 1:n))
438 safe_allocate(vt(1:n, 1:n))
439 safe_allocate(sigma(1:n, 1:n))
440 safe_allocate(sg_values(1:n))
441
442 imat = mat
443 call lalg_singular_value_decomp(n, n, imat, u, vt, sg_values)
444
445 sigma = m_z0
446 do i = 1, n
447 if (abs(sg_values(i)) <= 1.0e-12_real64 * maxval(abs(sg_values))) then
448 sigma(i, i) = m_z0
449 else
450 sigma(i, i) = m_z1 / sg_values(i)
451 end if
452 end do
453
454 vt(:, :) = conjg(transpose(vt(:, :)))
455 u(:, :) = conjg(transpose(u(:, :)))
456 imat = matmul(vt, matmul(sigma, u))
457
458 ! Check if we truly have a pseudoinverse
459 vt(:, :) = matmul(mat(:, :), matmul(imat(:, :), mat(:, :))) - mat(:, :)
460 if (maxval(abs(vt)) > 1.0e-10_real64 * maxval(abs(mat))) then
461 write(*, *) maxval(abs(vt))
462 write(*, *) vt
463 write(*, *)
464 write(*, *) 1.0e-10_real64 * maxval(abs(mat))
465 write(*, *) maxval(abs(vt)) > 1.0e-10_real64 * maxval(abs(mat))
466 write(*, *) mat
467 write(message(1), '(a)') 'Pseudoinverse failed.'
468 call messages_fatal(1)
469 end if
470
471 safe_deallocate_a(u)
472 safe_deallocate_a(vt)
473 safe_deallocate_a(sigma)
474 safe_deallocate_a(sg_values)
475 pop_sub(lalg_zpseudoinverse)
476 end subroutine lalg_zpseudoinverse
477
478
485 subroutine lalg_check_zeigenderivatives(n, mat)
486 integer, intent(in) :: n
487 complex(real64), intent(in) :: mat(:, :)
488
489 integer :: alpha, beta, gamma, delta
490 complex(real64) :: deltah, zuder_direct, zder_direct, zuder_directplus, zuder_directminus
491 complex(real64), allocatable :: zeigenvec(:, :), dm(:, :), zeigref_(:, :), zeigenval(:), mmatrix(:, :, :)
492 complex(real64), allocatable :: zeigplus(:), zeigminus(:), zeig0(:), zeigplusminus(:), zeigminusplus(:)
493
495
496 safe_allocate(zeigenvec(1:n, 1:n))
497 safe_allocate(dm(1:n, 1:n))
498 safe_allocate(zeigref_(1:n, 1:n))
499 safe_allocate(zeigenval(1:n))
500 safe_allocate(mmatrix(1:n, 1:n, 1:n))
501 safe_allocate(zeigplus(1:n))
502 safe_allocate(zeigminus(1:n))
503 safe_allocate(zeig0(1:n))
504 safe_allocate(zeigplusminus(1:n))
505 safe_allocate(zeigminusplus(1:n))
506
507 assert(n == 2)
508
509 dm(:, :) = mat(:, :)
510 call lalg_zeigenderivatives(2, dm, zeigref_, zeigenval, mmatrix)
511
512
513 deltah = (0.000001_real64, 0.000_real64)
514 !deltah = M_z1 * maxval(abs(dm)) * 0.001_real64
515 do alpha = 1, n
516 do beta = 1, n
517 zder_direct = lalg_zdni(zeigref_(:, 2), alpha, beta)
518 zuder_direct = lalg_zduialpha(zeigref_(:, 2), mmatrix(:, :, 2), 2, alpha, beta)
520 zeigenvec(:, :) = dm(:, :)
521 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) + deltah
522 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigplus)
523 zeigenvec(:, 1) = zeigenvec(:, 1)/sum(conjg(zeigref_(1:2, 1))*zeigenvec(1:2, 1))
524 zeigenvec(:, 2) = zeigenvec(:, 2)/sum(conjg(zeigref_(1:2, 2))*zeigenvec(1:2, 2))
525 zuder_directplus = zeigenvec(2, 2)
526
527 zeigenvec(:, :) = dm(:, :)
528 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) - deltah
529 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigminus)
530 zeigenvec(:, 1) = zeigenvec(:, 1)/sum(conjg(zeigref_(1:2, 1))*zeigenvec(1:2, 1))
531 zeigenvec(:, 2) = zeigenvec(:, 2)/sum(conjg(zeigref_(1:2, 2))*zeigenvec(1:2, 2))
532 zuder_directminus = zeigenvec(2, 2)
533
534 write(*, '(2i1,4f24.12)') alpha, beta, zder_direct, (zeigplus(2) - zeigminus(2))/(m_two * deltah)
535 write(*, '(2i1,4f24.12)') alpha, beta, &
536 zuder_direct, (zuder_directplus - zuder_directminus) / (m_two * deltah)
537
538 do gamma = 1, n
539 do delta = 1, n
540 if (alpha == gamma .and. beta == delta) then
541 zder_direct = lalg_zd2ni(zeigref_(:, 1), mmatrix(:, :, 1), alpha, beta, gamma, delta)
542
543 zeigenvec(:, :) = dm(:, :)
544 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeig0)
545
546 zeigenvec(:, :) = dm(:, :)
547 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) + deltah
548 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigplus)
549
550 zeigenvec(:, :) = dm(:, :)
551 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) - deltah
552 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigminus)
553
554 write(*, '(4i1,4f24.12)') alpha, beta, gamma, delta, &
555 zder_direct, (zeigplus(1) + zeigminus(1) - m_two*zeig0(1))/(deltah**2)
556 else
557 zder_direct = lalg_zd2ni(zeigref_(:, 1), mmatrix(:, :, 1), alpha, beta, gamma, delta)
558
559 zeigenvec(:, :) = dm(:, :)
560 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) + deltah
561 zeigenvec(gamma, delta) = zeigenvec(gamma, delta) + deltah
562 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigplus)
563
564 zeigenvec(:, :) = dm(:, :)
565 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) - deltah
566 zeigenvec(gamma, delta) = zeigenvec(gamma, delta) - deltah
567 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigminus)
568
569 zeigenvec(:, :) = dm(:, :)
570 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) + deltah
571 zeigenvec(gamma, delta) = zeigenvec(gamma, delta) - deltah
572 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigplusminus)
573
574 zeigenvec(:, :) = dm(:, :)
575 zeigenvec(alpha, beta) = zeigenvec(alpha, beta) - deltah
576 zeigenvec(gamma, delta) = zeigenvec(gamma, delta) + deltah
577 call lalg_eigensolve_nonh(2, zeigenvec(:, :), zeigminusplus)
579 write(*, '(4i1,4f24.12)') alpha, beta, gamma, delta, &
580 zder_direct, (zeigplus(1) + zeigminus(1) - zeigplusminus(1) - zeigminusplus(1))/(m_four*deltah**2)
581
582
583 end if
584 end do
585 end do
586
587 end do
588 end do
589
590 safe_deallocate_a(zeigenval)
591 safe_deallocate_a(mmatrix)
592 safe_deallocate_a(zeigenvec)
593 safe_deallocate_a(dm)
594 safe_deallocate_a(zeigref_)
595 safe_deallocate_a(zeigplus)
596 safe_deallocate_a(zeigminus)
597 safe_deallocate_a(zeig0)
598 safe_deallocate_a(zeigplusminus)
599 safe_deallocate_a(zeigminusplus)
601 end subroutine lalg_check_zeigenderivatives
602
603 complex(real64) function lalg_zdni(eigenvec, alpha, beta)
604 integer, intent(in) :: alpha, beta
605 complex(real64), intent(in) :: eigenvec(2)
606 lalg_zdni = conjg(eigenvec(alpha)) * eigenvec(beta)
607 end function lalg_zdni
608
609 complex(real64) function lalg_zduialpha(eigenvec, mmatrix, alpha, gamma, delta)
610 integer, intent(in) :: alpha, gamma, delta
611 complex(real64),intent(in) :: eigenvec(2), mmatrix(2, 2)
612 lalg_zduialpha = mmatrix(alpha, gamma) * eigenvec(delta)
613 end function lalg_zduialpha
614
615 complex(real64) function lalg_zd2ni(eigenvec, mmatrix, alpha, beta, gamma, delta)
616 integer, intent(in) :: alpha, beta, gamma, delta
617 complex(real64), intent(in) :: eigenvec(2), mmatrix(2, 2)
618 lalg_zd2ni = conjg(mmatrix(alpha, delta) * eigenvec(gamma)) * eigenvec(beta) + &
619 conjg(eigenvec(alpha)) * mmatrix(beta, gamma) * eigenvec(delta)
620 end function lalg_zd2ni
621
622 ! ---------------------------------------------------------
627 pure real(real64) function pseudoinverse_default_tolerance(m, n, sg_values) result(tol)
628 integer, intent(in) :: m, n
629 real(real64), intent(in) :: sg_values(:)
630 tol = m_epsilon * m * n * maxval(sg_values)
632
633
639 function lalg_remove_rotation(n, A) result(P)
640 integer, intent(in) :: n
641 real(real64), intent(in) :: a(1:n, 1:n)
642 real(real64) :: p(1:n, 1:n)
643
644 real(real64) :: ata(1:n, 1:n)
645
646 push_sub(lalg_remove_rotation)
647
648 ata = matmul(transpose(a), a)
649 call lalg_matrix_function(n, m_one, ata, p, square_root, .true.)
650
651 pop_sub(lalg_remove_rotation)
652 end function lalg_remove_rotation
653
654#include "undef.F90"
655#include "complex.F90"
656#include "lalg_adv_lapack_inc.F90"
657
658#include "undef.F90"
659#include "real.F90"
660#include "lalg_adv_lapack_inc.F90"
661
662end module lalg_adv_oct_m
663
664!! Local Variables:
665!! mode: f90
666!! coding: utf-8
667!! End:
Note that lalg_determinant and lalg_inverse are just wrappers over the same routine.
Definition: lalg_adv.F90:189
lalg_gemm with both the (Hermitian) transpose of A and B.
Definition: lalg_basic.F90:252
scales a vector by a constant
Definition: lalg_basic.F90:157
double exp(double __x) __attribute__((__nothrow__
This module contains interfaces for BLACS routines Interfaces are from http:
Definition: blacs.F90:27
This module provides the BLACS processor grid.
subroutine zmatrix_norm2(m, n, a, norm_l2, preserve_mat)
Norm of a 2D matrix.
Definition: lalg_adv.F90:1501
complex(real64) function, public lalg_zd2ni(eigenvec, mmatrix, alpha, beta, gamma, delta)
Definition: lalg_adv.F90:709
subroutine zlowest_geneigensolve(k, n, a, b, e, v, preserve_mat, bof, err_code)
Computes the k lowest eigenvalues and the eigenvectors of a real symmetric or complex Hermitian gener...
Definition: lalg_adv.F90:1104
complex(real64) function zdeterminant(n, a, preserve_mat)
Invert a real symmetric or complex Hermitian square matrix a.
Definition: lalg_adv.F90:1386
subroutine zeigensolve_nonh(n, a, e, err_code, side, sort_eigenvectors)
Computes all the eigenvalues and the right (left) eigenvectors of a real or complex (non-Hermitian) e...
Definition: lalg_adv.F90:984
subroutine zlinsyssolve(n, nrhs, a, b, x)
compute the solution to a complex system of linear equations A*X = B, where A is an N-by-N matrix and...
Definition: lalg_adv.F90:1586
subroutine, public zlalg_exp(nn, pp, aa, ex, hermitian)
Definition: lalg_adv.F90:315
pure real(real64) function, public pseudoinverse_default_tolerance(m, n, sg_values)
Computes the default Moore-Penrose pseudoinverse tolerance for zeroing.
Definition: lalg_adv.F90:721
subroutine deigensolve_parallel(n, a, e, bof, err_code)
Computes all the eigenvalues and the eigenvectors of a real symmetric or complex Hermitian eigenprobl...
Definition: lalg_adv.F90:3513
subroutine dgeneigensolve(n, a, b, e, preserve_mat, bof, err_code)
Computes all the eigenvalues and the eigenvectors of a real symmetric or complex Hermitian generalize...
Definition: lalg_adv.F90:2397
subroutine lalg_zpseudoinverse(n, mat, imat)
Computes the Moore-Penrose pseudoinverse of a complex matrix.
Definition: lalg_adv.F90:520
subroutine zlalg_pseudo_inverse(a, threshold)
Invert a matrix with the Moore-Penrose pseudo-inverse.
Definition: lalg_adv.F90:1813
subroutine zeigensolve(n, a, e, bof, err_code)
Computes all eigenvalues and eigenvectors of a real symmetric or hermitian square matrix A.
Definition: lalg_adv.F90:1223
subroutine dsingular_value_decomp(m, n, a, u, vt, sg_values, preserve_mat)
Computes the singular value decomposition of a real M x N matrix a.
Definition: lalg_adv.F90:3183
subroutine deigensolve_nonh(n, a, e, err_code, side, sort_eigenvectors)
Computes all the eigenvalues and the right (left) eigenvectors of a real or complex (non-Hermitian) e...
Definition: lalg_adv.F90:2504
subroutine zinverse(n, a, method, det, threshold, uplo)
An interface to different method to invert a matrix.
Definition: lalg_adv.F90:2134
real(real64) function sfmin()
Auxiliary function.
Definition: lalg_adv.F90:242
subroutine dlinsyssolve(n, nrhs, a, b, x)
compute the solution to a real system of linear equations A*X = B, where A is an N-by-N matrix and X ...
Definition: lalg_adv.F90:3105
subroutine zsingular_value_decomp(m, n, a, u, vt, sg_values, preserve_mat)
Computes the singular value decomposition of a complex MxN matrix a.
Definition: lalg_adv.F90:1664
subroutine dcholesky(n, a, bof, err_code)
Compute the Cholesky decomposition of real symmetric or complex Hermitian positive definite matrix a,...
Definition: lalg_adv.F90:2342
subroutine deigensolve(n, a, e, bof, err_code)
Computes all eigenvalues and eigenvectors of a real symmetric or hermitian square matrix A.
Definition: lalg_adv.F90:2744
subroutine, public lalg_zeigenderivatives(n, mat, zeigenvec, zeigenval, zmat)
Definition: lalg_adv.F90:468
subroutine dmatrix_norm2(m, n, a, norm_l2, preserve_mat)
Norm of a 2D matrix.
Definition: lalg_adv.F90:3020
subroutine zlowest_eigensolve(k, n, a, e, v, preserve_mat)
Computes the k lowest eigenvalues and the eigenvectors of a standard symmetric-definite eigenproblem,...
Definition: lalg_adv.F90:1295
complex(real64) function, public lalg_zduialpha(eigenvec, mmatrix, alpha, gamma, delta)
Definition: lalg_adv.F90:703
subroutine zgeneigensolve(n, a, b, e, preserve_mat, bof, err_code)
Computes all the eigenvalues and the eigenvectors of a real symmetric or complex Hermitian generalize...
Definition: lalg_adv.F90:873
subroutine dleast_squares_vec(nn, aa, bb, xx, preserve_mat)
Definition: lalg_adv.F90:3440
subroutine dlowest_geneigensolve(k, n, a, b, e, v, preserve_mat, bof, err_code)
Computes the k lowest eigenvalues and the eigenvectors of a real symmetric or complex Hermitian gener...
Definition: lalg_adv.F90:2624
subroutine zcholesky(n, a, bof, err_code)
Compute the Cholesky decomposition of real symmetric or complex Hermitian positive definite matrix a,...
Definition: lalg_adv.F90:818
subroutine, public lalg_check_zeigenderivatives(n, mat)
Definition: lalg_adv.F90:579
complex(real64) function, public lalg_zdni(eigenvec, alpha, beta)
Definition: lalg_adv.F90:697
subroutine zleast_squares_vec(nn, aa, bb, xx, preserve_mat)
Definition: lalg_adv.F90:1925
real(real64) function, dimension(1:n, 1:n), public lalg_remove_rotation(n, A)
Remove rotation from affine transformation A by computing the polar decomposition and discarding the ...
Definition: lalg_adv.F90:733
subroutine lalg_zgeev(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
Definition: lalg_adv.F90:281
subroutine dlalg_matrix_function(n, factor, a, fun_a, fun, hermitian)
This routine calculates a function of a matrix by using an eigenvalue decomposition.
Definition: lalg_adv.F90:3694
subroutine dinverse(n, a, method, det, threshold, uplo)
An interface to different method to invert a matrix.
Definition: lalg_adv.F90:3646
subroutine zeigensolve_parallel(n, a, e, bof, err_code)
Computes all the eigenvalues and the eigenvectors of a real symmetric or complex Hermitian eigenprobl...
Definition: lalg_adv.F90:2001
real(real64) function ddeterminant(n, a, preserve_mat)
Invert a real symmetric or complex Hermitian square matrix a.
Definition: lalg_adv.F90:2905
subroutine lalg_dgeev(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
Definition: lalg_adv.F90:254
subroutine, public zlalg_matrix_function(n, factor, a, fun_a, fun, hermitian)
This routine calculates a function of a matrix by using an eigenvalue decomposition.
Definition: lalg_adv.F90:2182
subroutine dlowest_eigensolve(k, n, a, e, v, preserve_mat)
Computes the k lowest eigenvalues and the eigenvectors of a standard symmetric-definite eigenproblem,...
Definition: lalg_adv.F90:2816
subroutine dsvd_inverse(m, n, a, threshold)
Computes the inverse of a real M x N matrix, a, using the SVD decomposition.
Definition: lalg_adv.F90:3262
subroutine, public zlalg_phi(nn, pp, aa, ex, hermitian)
Definition: lalg_adv.F90:393
subroutine dlalg_pseudo_inverse(a, threshold)
Invert a matrix with the Moore-Penrose pseudo-inverse.
Definition: lalg_adv.F90:3328
subroutine zsvd_inverse(m, n, a, threshold)
Computes inverse of a complex MxN matrix, a, using the SVD decomposition.
Definition: lalg_adv.F90:1747
This module contains interfaces for LAPACK routines.
Definition: lapack.F90:118
This module is intended to contain "only mathematical" functions and procedures.
Definition: math.F90:115
This module contains interfaces for ScaLAPACK routines Interfaces are from http:
Definition: scalapack.F90:131
This module is intended to contain "only mathematical" functions and procedures.
Definition: sort.F90:117
This module is intended to contain simple general-purpose utility functions and procedures.
Definition: utils.F90:118
int true(void)