33 REAL(
mpd),
DIMENSION(:),
ALLOCATABLE ::
matv
34 REAL(
mpd),
DIMENSION(:),
ALLOCATABLE ::
matl
35 REAL(
mpd),
DIMENSION(:),
ALLOCATABLE ::
vecn
49 INTEGER(mpl) :: length
51 INTEGER(mpi),
INTENT(IN) :: n
52 INTEGER(mpi),
INTENT(IN) :: m
96 INTEGER(mpl) :: length
100 REAL(mpd),
INTENT(IN) :: a(*)
114 nrm = sqrt(dot_product(
vecn(1:kn),
vecn(1:kn)))
115 IF (nrm == 0.0_mpd) cycle
117 IF (
vecn(kn) >= 0.0_mpd)
THEN
123 nrm = sqrt(dot_product(
vecn(1:kn),
vecn(1:kn)))
128 sp=dot_product(
vecn(1:kn),
matv(ioff2+1:ioff2+kn))
129 matv(ioff2+1:ioff2+kn)=
matv(ioff2+1:ioff2+kn)-2.0_mpd*
vecn(1:kn)*sp
171 INTEGER(mpi) :: ifirst
172 INTEGER(mpi) :: ilast
173 INTEGER(mpl) :: ioff1
174 INTEGER(mpl) :: ioff2
175 INTEGER(mpl) :: ioff3
181 INTEGER(mpl) :: length
185 REAL(mpd),
INTENT(IN) :: a(*)
186 INTEGER(mpi),
INTENT(IN) :: nb
187 INTEGER(mpi),
INTENT(IN) :: b(3,*)
197 ncb=b(1,ib+1)-b(1,ib)
198 npb=b(3,ib)+1-b(2,ib)
202 matv(ioff1+ifirst:ioff1+ilast)=a(ioff2+1:ioff2+npb)
220 IF (ifirst > kn) cycle
222 ilast=min(b(3,ib),kn)
228 vecn(ifirst:ilast)=
matv(ioff1+ifirst:ioff1+ilast)
229 nrm = sqrt(dot_product(
vecn(ifirst:ilast),
vecn(ifirst:ilast)))
230 IF (nrm == 0.0_mpd) cycle
232 IF (
vecn(kn) >= 0.0_mpd)
THEN
240 nrm = sqrt(dot_product(
vecn(ifirst:ilast),
vecn(ifirst:ilast))+
vecn(kn)*
vecn(kn))
241 vecn(ifirst:ilast)=
vecn(ifirst:ilast)/nrm
245 sp=dot_product(
vecn(ifirst:ilast),
matv(ioff2+ifirst:ioff2+ilast))
246 matv(ioff2+ifirst:ioff2+ilast)=
matv(ioff2+ifirst:ioff2+ilast)-2.0_mpd*
vecn(ifirst:ilast)*sp
252 nrm = sqrt(dot_product(
vecn(ifirst:ilast),
vecn(ifirst:ilast)))
253 vecn(ifirst:ilast)=
vecn(ifirst:ilast)/nrm
256 sp=dot_product(
vecn(ifirst:ilast),
matv(ioff2+ifirst:ioff2+ilast))
257 matv(ioff2+ifirst:ioff2+ilast)=
matv(ioff2+ifirst:ioff2+ilast)-2.0_mpd*
vecn(ifirst:ilast)*sp
267 matv(ioff1+ifirst:ioff1+ilast)=
vecn(ifirst:ilast)
289 INTEGER(mpl) :: ioff1
290 INTEGER(mpl) :: ioff2
296 REAL(mpd),
INTENT(IN OUT) :: x(*)
297 INTEGER(mpi),
INTENT(IN) :: m
298 LOGICAL,
INTENT(IN) :: t
309 sp=dot_product(
matv(ioff1+1:ioff1+kn),x(ioff2+1:ioff2+kn))
310 x(ioff2+1:ioff2+kn)=x(ioff2+1:ioff2+kn)-2.0_mpd*
matv(ioff1+1:ioff1+kn)*sp
333 INTEGER(mpl) :: ioff1
340 REAL(mpd),
INTENT(IN OUT) :: x(*)
341 INTEGER(mpi),
INTENT(IN) :: m
342 LOGICAL,
INTENT(IN) :: t
346 IF (.not.t) k=
ncon+1-j
353 sp=dot_product(
matv(ioff1+1:ioff1+kn),x(i:iend:m))
354 x(i:iend:m)=x(i:iend:m)-2.0_mpd*
matv(ioff1+1:ioff1+kn)*sp
375 INTEGER(mpl) :: ioff1
376 INTEGER(mpl) :: ioff2
383 REAL(mpd),
INTENT(IN OUT) :: x(*)
384 LOGICAL,
INTENT(IN) :: t
395 sp=dot_product(
matv(ioff1+1:ioff1+kn),x(i:iend:
npar))
396 x(i:iend:
npar)=x(i:iend:
npar)-2.0_mpd*
matv(ioff1+1:ioff1+kn)*sp
400 sp=dot_product(
matv(ioff1+1:ioff1+kn),x(ioff2+1:ioff2+kn))
401 x(ioff2+1:ioff2+kn)=x(ioff2+1:ioff2+kn)-2.0_mpd*
matv(ioff1+1:ioff1+kn)*sp
427 INTEGER(mpl) :: ioff1
428 INTEGER(mpl) :: ioff2
433 INTEGER(mpl) :: length
435 REAL(mpd),
DIMENSION(:),
ALLOCATABLE :: Av
437 REAL(mpd),
INTENT(IN OUT) :: A(*)
438 LOGICAL,
INTENT(IN) :: t
441 SUBROUTINE aprod(n,x,y)
443 INTEGER(mpi),
INTENT(in) :: n
444 REAL(mpd),
INTENT(IN) :: x(n)
445 REAL(mpd),
INTENT(OUT) :: y(n)
450 CALL mpalloc(av,length,
'qlssq: A*v')
463 vtav=dot_product(
matv(ioff1+1:ioff1+kn),av(1:kn))
470 a(ioff2)=a(ioff2)+2.0_mpd*((2.0_mpd*
matv(ioff1+i)*vtav-av(i))*
matv(ioff1+l)-av(l)*
matv(ioff1+i))
476 a(ioff2+1:ioff2+kn)=a(ioff2+1:ioff2+kn)-2.0_mpd*
matv(ioff1+1:ioff1+kn)*av(i)
505 INTEGER(mpl) :: ioff1
506 INTEGER(mpl) :: ioff2
513 INTEGER(mpl) :: length
518 REAL(mpd),
DIMENSION(:),
ALLOCATABLE :: Av
520 REAL(mpd),
INTENT(IN OUT) :: B(*)
521 INTEGER(mpi),
INTENT(IN) :: m
522 LOGICAL,
INTENT(IN) :: t
525 SUBROUTINE aprod(n,x,y)
527 INTEGER(mpi),
INTENT(in) :: n
528 REAL(mpd),
INTENT(IN) :: x(n)
529 REAL(mpd),
INTENT(OUT) :: y(n)
535 CALL mpalloc(av,length,
'qlpssq: Av')
554 vtav=dot_product(
matv(ioff1+1:ioff1+kn),av(ioff1+1:ioff1+kn))
561 b(ioff2)=b(ioff2)+2.0_mpd*((2.0_mpd*
matv(ioff1+i)*vtav-av(ioff1+i))*
matv(ioff1+l)-av(ioff1+l)*
matv(ioff1+i))
569 b(ioff2)=b(ioff2)-2.0_mpd*av(ioff1+i)*
matv(ioff1+l)
578 vtavp=dot_product(
matv(ioff1+1:ioff1+
npar),av(ioff2+1:ioff2+
npar))
580 av(ioff2+i)=av(ioff2+i)+2.0_mpd*((2.0_mpd*
matv(ioff1+i)*vtav-av(ioff1+i))*vtvp-
matv(ioff1+i)*vtavp)
583 av(ioff2+i)=av(ioff2+i)-2.0_mpd*av(ioff1+i)*vtvp
606 INTEGER(mpl) :: idiag
608 REAL(mpd),
INTENT(OUT) :: emin
609 REAL(mpd),
INTENT(OUT) :: emax
616 IF (abs(emax) < abs(
matl(idiag))) emax=
matl(idiag)
617 IF (abs(emin) > abs(
matl(idiag))) emin=
matl(idiag)
634 INTEGER(mpl) :: idiag
637 REAL(mpd),
INTENT(IN) :: d(ncon)
638 REAL(mpd),
INTENT(OUT) :: y(ncon)
643 y(k)=(d(k)-dot_product(
matl(idiag+1:idiag+ncon-k),y(k+1:ncon)))/
matl(idiag)
subroutine qlmrq(x, m, t)
Multiply right by Q(t).
subroutine qldecb(a, nb, b)
QL decomposition (for disjoint block matrix).
subroutine qlsmq(x, t)
Similarity transformation by Q(t).
subroutine qldec(a)
QL decomposition.
subroutine qlmlq(x, m, t)
Multiply left by Q(t).
subroutine qlbsub(d, y)
Backward substitution.
subroutine qlgete(emin, emax)
Get eigenvalues.
subroutine qlssq(aprod, a, t)
Similarity transformation by Q(t).
subroutine qlpssq(aprod, b, m, t)
Partial similarity transformation by Q(t).
subroutine qlini(n, m)
Initialize QL decomposition.
(De)Allocate vectors and arrays.
integer(mpi) ncon
number of constraints
real(mpd), dimension(:), allocatable matv
unit normals (v_i) of Householder reflectors
real(mpd), dimension(:), allocatable matl
lower diagonal matrix L
real(mpd), dimension(:), allocatable vecn
normal vector
integer(mpi) npar
number of parameters