1 SUBROUTINE tridslv(a, d, b, c, jmin, jmax, mnd1, ns, nrhs)
7 INTEGER,
INTENT(in) :: jmax, mnd1, ns, nrhs
8 INTEGER,
DIMENSION(0:mnd1),
INTENT(in) :: jmin
9 REAL(rprec),
DIMENSION(ns,0:mnd1) :: a, d, b
10 REAL(rprec),
DIMENSION(ns,0:mnd1, nrhs),
INTENT(inout) :: c
14 REAL(rprec),
PARAMETER :: zero = 0, one = 1
18 INTEGER :: mn, in, i0, in1, jrhs
19 REAL(rprec),
ALLOCATABLE,
DIMENSION(:,:) :: alf
20 REAL(rprec),
DIMENSION(0:mnd1) :: psi0
28 IF (jmax .gt. ns) stop
'jmax>ns in tridslv'
30 ALLOCATE (alf(ns,0:mnd1), stat = in)
31 IF (in .ne. 0) stop
'Allocation error in tridslv'
42 c(in:in1, mn, 1:nrhs) = 0
51 IF (any(psi0 .eq. zero)) stop
'psi0 == 0 error in tridslv'
54 c(in,:,jrhs) = c(in,:,jrhs)*psi0(:)
58 alf(i0-1,:) = a(i0-1,:)*psi0(:)
59 psi0 = d(i0,:) - b(i0,:)*alf(i0-1,:)
60 IF (any(abs(psi0) .le. 1.e-8_dp*abs(d(i0,:))))
61 1 stop
'psi0/d(i0) < 1.E-8: possible singularity in tridslv'
64 c(i0,:,jrhs) = (c(i0,:,jrhs) - b(i0,:)*c(i0-1,:,jrhs))
69 DO i0 = jmax - 1, in, -1
71 c(i0,:,jrhs) = c(i0,:,jrhs) - alf(i0,:)*c(i0+1,:,jrhs)
77 END SUBROUTINE tridslv
81 SUBROUTINE tridslv_par(a, d, b, c, jmin, jmax, mnd1, ns, nrhs)
87 INTEGER,
INTENT(in) :: jmax, mnd1, ns, nrhs
88 INTEGER,
DIMENSION(0:mnd1),
INTENT(in) :: jmin
89 REAL(rprec),
DIMENSION(0:mnd1,ns) :: a, d, b
90 REAL(rprec),
DIMENSION(0:mnd1,ns,nrhs),
INTENT(inout) :: c
94 REAL(rprec),
PARAMETER :: zero = 0, one = 1
98 INTEGER :: mn, in, i0, in1, jrhs
99 REAL(rprec),
ALLOCATABLE,
DIMENSION(:,:) :: alf
100 REAL(rprec),
DIMENSION(0:mnd1) :: psi0
108 IF (jmax .gt. ns) stop
'jmax>ns in tridslv_par'
110 ALLOCATE (alf(0:mnd1,ns), stat=in)
111 IF (in .ne. 0) stop
'Allocation error in tridslv_par'
120 IF (in1 .ge. in)
THEN
122 c(mn, in:in1, 1:nrhs) = 0
131 IF (any(psi0 .eq. zero)) stop
'psi0 == 0 error in tridslv_par'
134 c(:,in,jrhs) = c(:,in,jrhs)*psi0(:)
138 alf(:,i0-1) = a(:,i0-1)*psi0(:)
139 psi0 = d(:,i0) - b(:,i0)*alf(:,i0-1)
140 IF (any(abs(psi0) .le. 1.e-8_dp*abs(d(:,i0))))
141 1 stop
'psi0/d(i0) < 1.E-8: possible singularity in tridslv'
144 c(:,i0,jrhs) = (c(:,i0,jrhs) - b(:,i0)*c(:,i0-1,jrhs))
149 DO i0 = jmax - 1, in, -1
151 c(:,i0,jrhs) = c(:,i0,jrhs) - alf(:,i0)*c(:,i0+1,jrhs)
157 END SUBROUTINE tridslv_par