15 real(kind=kreal),
pointer :: q(:) => null()
19 real(kind=kreal),
allocatable :: alpha(:)
20 real(kind=kreal),
allocatable :: beta(:)
25 subroutine tridiag(hecMESH, hecMAT, fstrEIG, Q, Tri, iter, is_converge)
30 type(hecmwst_local_mesh) :: hecmesh
31 type(hecmwst_matrix) :: hecMAT
36 integer(kind=kint),
intent(in) :: iter
37 integer(kind=kint) :: N, NP, NDOF, NNDOF, NPNDOF
38 integer(kind=kint) :: i, j, k, in, jn, kn, nget
39 integer(kind=kint) :: iter2, ierr, maxiter
40 real(kind=kreal) :: resid, chk, vmax, sigma, tolerance
41 real(kind=kreal),
allocatable :: alpha(:), beta(:), temp(:)
42 real(kind=kreal),
allocatable :: l(:,:)
44 integer(kind=kint),
allocatable :: iparm(:)
45 real(kind=kreal),
pointer :: eigvec(:,:)
46 real(kind=kreal),
pointer :: eigval(:)
47 logical :: is_converge
54 eigval => fstreig%eigval
55 eigvec => fstreig%eigvec
57 maxiter = fstreig%maxiter
58 tolerance = fstreig%tolerance
60 allocate( iparm(maxiter) )
61 allocate( temp(maxiter) )
62 allocate( alpha(iter) )
63 allocate( beta(iter) )
64 allocate( l(iter, iter) )
73 alpha(i) = tri%alpha(i)
85 if(fstreig%is_free) sigma = fstreig%sigma
87 if(alpha(i) /= 0.0d0)
then
88 eigval(i) = 1.0d0/alpha(i) - sigma
92 eigval(i) = huge(0.0d0)
98 call evsort(eigval, iparm, iter)
103 do i = 1, min(nget+2, iter)
105 if (dabs(alpha(in)) > 0.0d0)
then
107 resid = dabs(tri%beta(iter+1)*l(iter,in))/dabs(alpha(in))
108 chk = max(chk, resid)
109 if(tolerance < resid) is_converge = .false.
111 is_converge = .false.
114 if(
myrank == 0)
write(*,
"(i8,1pe12.5)")iter, chk
116 if(iter < nget) is_converge = .false.
118 if(iter == maxiter-1 .and. .not. is_converge)
then
120 write(*,*)
'### WARNING: eigen analysis stopped at maxiter without convergence.'
121 write(
ilog,*)
'### WARNING: eigen analysis stopped at maxiter without convergence.'
125 if(iter < nget) fstreig%nget = iter
138 eigvec(i, k) = eigvec(i, k) + q(j)%q(i) * l(j, in)
147 chk = max(chk, dabs(eigvec(i,j)))
148 vmax = max(vmax, eigvec(i,j))
150 call hecmw_allreduce_r1(hecmesh, chk, hecmw_max)
151 call hecmw_allreduce_r1(hecmesh, vmax, hecmw_max)
155 if(vmax /= chk) chk = -chk
158 eigvec(i,j) = eigvec(i,j) * chk
231 integer(kind=kint) :: i, j, k, l, m, n, ii, l1, l2, nm, mml, ierror
232 real(kind=kreal) :: d(n), e(n), z(nm, n)
233 real(kind=kreal) :: c, c2, c3, dl1, el1, f, g, h, p, r, s, s2, tst1, tst2
236 if (n .eq. 1)
go to 1001
248 h = dabs(d(l)) + dabs(e(l))
249 if (tst1 .lt. h) tst1 = h
252 tst2 = tst1 + dabs(e(m))
253 if (tst2 .eq. tst1)
exit bb
258 if (m .eq. l)
go to 220
260 130
if (j .eq. 30)
go to 1000
266 p = (d(l1) - g) / (2.0d0 * e(l))
268 d(l) = e(l) / (p + dsign(r,p))
269 d(l1) = e(l) * (p + dsign(r,p))
272 if (l2 .gt. n)
go to 145
301 d(i+1) = h + s * (c * g + s * d(i))
305 z(k,i+1) = s * z(k,i) + c * h
306 z(k,i) = c * z(k,i) - s * h
310 p = -s * s2 * c3 * el1 * e(l) / dl1
313 tst2 = tst1 + dabs(e(l))
314 if (tst2 .gt. tst1)
go to 130
329 real(kind=kreal) ::
a2b2
330 real(kind=kreal) :: a, b
331 real(kind=kreal) :: p, q, r, s, t, u
333 p = dmax1(dabs(a), dabs(b))
335 r = (dmin1(dabs(a),dabs(b))/p) ** 2
subroutine evsort(EIG, NEW, NEIG)
Sort eigenvalues.
This module provides a subroutine to find the eigenvalues and eigenvectors of a symmetric tridiagonal...
subroutine tridiag(hecMESH, hecMAT, fstrEIG, Q, Tri, iter, is_converge)
subroutine ql_decomposition(nm, n, d, e, z, ierror)
This subroutine has been adapted from the eispack routine tql2, which is a translation of the algol p...
real(kind=kreal) function a2b2(a, b)
This module defines common data and basic structures for analysis.
integer(kind=kint) myrank
PARALLEL EXECUTION.
integer(kind=kint), parameter ilog
FILE HANDLER.
Package of data used by Lanczos eigenvalue solver.