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, sigma, tolerance, max_eigval
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)
86 max_eigval = maxval(alpha)
87 do i = 1, min(nget, iter)
88 resid = dabs(tri%beta(iter+1)*l(iter,i))/max_eigval
90 if(tolerance < resid) is_converge = .false.
92 if(
myrank == 0)
write(*,
"(i8,1pe12.5)")iter, chk
94 if(iter < nget) is_converge = .false.
95 if(iter == maxiter-1) is_converge = .true.
99 if(fstreig%is_free) sigma = fstreig%sigma
101 if(alpha(i) /= 0.0d0)
then
102 eigval(i) = 1.0d0/alpha(i) - sigma
106 call evsort(eigval, iparm, iter)
116 eigvec(i, k) = eigvec(i, k) + q(j)%q(i) * l(j, in)
122 chk = maxval(eigvec(:,j))
123 call hecmw_allreduce_r1(hecmesh, chk, hecmw_max)
127 eigvec(i,j) = eigvec(i,j) * chk
208 integer(kind=kint) :: i, j, k, l, m, n, ii, l1, l2, nm, mml, ierror
209 real(kind=kreal) :: d(n), e(n), z(nm, n)
210 real(kind=kreal) :: c, c2, c3, dl1, el1, f, g, h, p, r, s, s2, tst1, tst2
213 if (n .eq. 1)
go to 1001
225 h = dabs(d(l)) + dabs(e(l))
226 if (tst1 .lt. h) tst1 = h
229 tst2 = tst1 + dabs(e(m))
230 if (tst2 .eq. tst1)
exit bb
235 if (m .eq. l)
go to 220
237 130
if (j .eq. 30)
go to 1000
243 p = (d(l1) - g) / (2.0d0 * e(l))
245 d(l) = e(l) / (p + dsign(r,p))
246 d(l1) = e(l) * (p + dsign(r,p))
249 if (l2 .gt. n)
go to 145
278 d(i+1) = h + s * (c * g + s * d(i))
282 z(k,i+1) = s * z(k,i) + c * h
283 z(k,i) = c * z(k,i) - s * h
287 p = -s * s2 * c3 * el1 * e(l) / dl1
290 tst2 = tst1 + dabs(e(l))
291 if (tst2 .gt. tst1)
go to 130
304 if (d(j) .ge. p)
exit aa
309 if (k .eq. i)
go to 300
332 real(kind=kreal) ::
a2b2
333 real(kind=kreal) :: a, b
334 real(kind=kreal) :: p, q, r, s, t, u
336 p = dmax1(dabs(a), dabs(b))
338 r = (dmin1(dabs(a),dabs(b))/p) ** 2