21 real(kind=
kreal),
allocatable :: ajad(:)
22 integer(kind=kint),
allocatable :: JAJAD(:)
23 integer(kind=kint),
allocatable :: JADORD(:)
24 integer(kind=kint),
allocatable :: IAJAD(:)
25 integer(kind=kint) :: MJAD
26 real(kind=
kreal),
allocatable :: wp1(:), wp2(:), wp3(:)
27 integer(kind=kint) :: INITIALIZED = 0
33 allocate(wp1(hecmat%NP), wp2(hecmat%NP), wp3(hecmat%NP))
34 allocate(ajad((hecmat%NPL+hecmat%NPU)*9))
35 allocate(jajad(hecmat%NPL+hecmat%NPU))
36 allocate(jadord(hecmat%NP))
37 allocate(iajad(hecmat%NP+1))
38 call repack(hecmat%N, hecmat, mjad, ajad, jajad, iajad, jadord)
47 deallocate(wp1,wp2,wp3)
59 real(kind=
kreal),
intent(in) :: x(:)
60 real(kind=
kreal),
intent(out) :: y(:)
61 real(kind=
kreal),
intent(inout) :: commtime
62 real(kind=
kreal) :: start_time, end_time
63 real(kind=
kreal),
pointer :: d(:)
64 integer(kind=kint) :: i
65 real(kind=
kreal) :: x1, x2, x3
70 commtime = commtime + end_time - start_time
80 y(3*i -2)= d(9*i-8)*x1 + d(9*i-7)*x2 + d(9*i-6)*x3
81 y(3*i -1)= d(9*i-5)*x1 + d(9*i-4)*x2 + d(9*i-3)*x3
82 y(3*i )= d(9*i-2)*x1 + d(9*i-1)*x2 + d(9*i )*x3
87 call matjad(hecmat%N, mjad, iajad, jajad, ajad, jadord, x, y, wp1, wp2, wp3)
90 subroutine repack(N, hecMAT, MJAD, AJAD, JAJAD, IAJAD, JADORD)
95 integer(kind = kint) :: n, mjad
96 real(kind =
kreal),
dimension(*) :: ajad
97 integer(kind = kint),
dimension(*) :: jajad
98 integer(kind = kint),
dimension(*) :: iajad
99 integer(kind = kint),
dimension(*) :: jadord
101 integer(kind = kint) :: ijad, maxnz, minnz
102 integer(kind = kint) :: i, j, js, je, in, jc
103 integer(kind = kint),
allocatable :: len(:), lenz(:), jadreord(:)
106 allocate(jadreord(n))
108 len(i)= hecmat%indexL(i) - hecmat%indexL(i-1) &
109 & + hecmat%indexU(i) - hecmat%indexU(i-1)
111 maxnz=maxval(len(1:n))
112 minnz=minval(len(1:n))
114 allocate(lenz(0:mjad))
117 lenz(len(i))=lenz(len(i))+1
119 do i=maxnz-1,minnz,-1
120 lenz(i)=lenz(i)+lenz(i+1)
123 jadord(i)=lenz(len(i))
124 lenz(len(i))=lenz(len(i))-1
127 jadreord(jadord(i))=i
130 lenz(len(jadreord(i)))=i
133 lenz(i)=max(lenz(i+1),lenz(i))
137 iajad(i+1)=iajad(i)+lenz(i)
142 js= hecmat%indexL(i-1) + 1
143 je= hecmat%indexL(i )
146 len(ijad)=len(ijad)+1
147 jc=iajad(len(ijad))+ijad-1
148 ajad(jc*9-8:jc*9) = hecmat%AL(9*j-8:9*j)
154 js= hecmat%indexU(i-1) + 1
155 je= hecmat%indexU(i )
158 len(ijad)=len(ijad)+1
159 jc=iajad(len(ijad))+ijad-1
160 ajad(jc*9-8:jc*9) = hecmat%AU(9*j-8:9*j)
167 end subroutine repack
169 subroutine matjad(N, MJAD, IAJAD, JAJAD, AJAD, JADORD, X, Y, W1, W2, W3)
171 integer(kind=kint) :: N, MJAD
172 integer(kind=kint) :: IAJAD(*), JAJAD(*), JADORD(*)
173 real(kind=
kreal) :: ajad(*), x(*), y(*), w1(*), w2(*), w3(*)
175 integer(kind=kint) :: I, K, NZ, IXX
176 real(kind=
kreal) :: x1, x2, x3
189 do k=iajad(nz),iajad(nz+1)-1
194 w1(ixx)=w1(ixx) + ajad(k*9-8)*x1 + ajad(k*9-7)*x2 + ajad(k*9-6)*x3
195 w2(ixx)=w2(ixx) + ajad(k*9-5)*x1 + ajad(k*9-4)*x2 + ajad(k*9-3)*x3
196 w3(ixx)=w3(ixx) + ajad(k*9-2)*x1 + ajad(k*9-1)*x2 + ajad(k*9-0)*x3
203 y(3*i-2)=y(3*i-2)+w1(jadord(i))
204 y(3*i-1)=y(3*i-1)+w2(jadord(i))
205 y(3*i )=y(3*i )+w3(jadord(i))