20 real(kind=
kreal),
allocatable :: ajad(:)
21 integer(kind=kint),
allocatable :: JAJAD(:)
22 integer(kind=kint),
allocatable :: JADORD(:)
23 integer(kind=kint),
allocatable :: IAJAD(:)
24 integer(kind=kint) :: MJAD
25 real(kind=
kreal),
allocatable :: wp1(:), wp2(:), wp3(:), wp4(:)
26 integer(kind=kint) :: INITIALIZED = 0
32 allocate(wp1(hecmat%NP), wp2(hecmat%NP), wp3(hecmat%NP), wp4(hecmat%NP))
33 allocate(ajad((hecmat%NPL+hecmat%NPU)*16))
34 allocate(jajad(hecmat%NPL+hecmat%NPU))
35 allocate(jadord(hecmat%NP))
36 allocate(iajad(hecmat%NP+1))
37 call repack(hecmat%N, hecmat, mjad, ajad, jajad, iajad, jadord)
46 deallocate(wp1,wp2,wp3,wp4)
53 real(kind=
kreal),
intent(in) :: x(:)
54 real(kind=
kreal),
intent(out) :: y(:)
55 real(kind=
kreal),
intent(inout) :: commtime
56 real(kind=
kreal) :: start_time, end_time
57 real(kind=
kreal),
pointer :: d(:)
58 integer(kind=kint) :: i
59 real(kind=
kreal) :: x1, x2, x3, x4
64 commtime = commtime + end_time - start_time
75 y(4*i-3)= d(16*i-15)*x1 + d(16*i-14)*x2 + d(16*i-13)*x3 + d(16*i-12)*x4
76 y(4*i-2)= d(16*i-11)*x1 + d(16*i-10)*x2 + d(16*i- 9)*x3 + d(16*i- 8)*x4
77 y(4*i-1)= d(16*i- 7)*x1 + d(16*i- 6)*x2 + d(16*i- 5)*x3 + d(16*i- 4)*x4
78 y(4*i )= d(16*i- 3)*x1 + d(16*i- 2)*x2 + d(16*i- 1)*x3 + d(16*i- 0)*x4
82 call matjad(hecmat%N, mjad, iajad, jajad, ajad, jadord, x, y, wp1, wp2, wp3, wp4)
85 subroutine repack(N, hecMAT, MJAD, AJAD, JAJAD, IAJAD, JADORD)
90 integer(kind = kint) :: n, mjad
91 real(kind =
kreal),
dimension(*) :: ajad
92 integer(kind = kint),
dimension(*) :: jajad
93 integer(kind = kint),
dimension(*) :: iajad
94 integer(kind = kint),
dimension(*) :: jadord
96 integer(kind = kint) :: ijad, maxnz, minnz
97 integer(kind = kint) :: i, j, js, je, in, jc
98 integer(kind = kint),
allocatable :: len(:), lenz(:), jadreord(:)
101 allocate(jadreord(n))
103 len(i)= hecmat%indexL(i) - hecmat%indexL(i-1) &
104 & + hecmat%indexU(i) - hecmat%indexU(i-1)
106 maxnz=maxval(len(1:n))
107 minnz=minval(len(1:n))
109 allocate(lenz(0:mjad))
112 lenz(len(i))=lenz(len(i))+1
114 do i=maxnz-1,minnz,-1
115 lenz(i)=lenz(i)+lenz(i+1)
118 jadord(i)=lenz(len(i))
119 lenz(len(i))=lenz(len(i))-1
122 jadreord(jadord(i))=i
125 lenz(len(jadreord(i)))=i
128 lenz(i)=max(lenz(i+1),lenz(i))
132 iajad(i+1)=iajad(i)+lenz(i)
137 js= hecmat%indexL(i-1) + 1
138 je= hecmat%indexL(i )
141 len(ijad)=len(ijad)+1
142 jc=iajad(len(ijad))+ijad-1
143 ajad(jc*16-15:jc*16) = hecmat%AL(16*j-15:16*j)
149 js= hecmat%indexU(i-1) + 1
150 je= hecmat%indexU(i )
153 len(ijad)=len(ijad)+1
154 jc=iajad(len(ijad))+ijad-1
155 ajad(jc*16-15:jc*16) = hecmat%AU(16*j-15:16*j)
162 end subroutine repack
164 subroutine matjad(N, MJAD, IAJAD, JAJAD, AJAD, JADORD, X, Y, W1, W2, W3, W4)
166 integer(kind=kint) :: N, MJAD
167 integer(kind=kint) :: IAJAD(*), JAJAD(*), JADORD(*)
168 real(kind=
kreal) :: ajad(*), x(*), y(*), w1(*), w2(*), w3(*), w4(*)
170 integer(kind=kint) :: I, K, NZ, IXX
171 real(kind=
kreal) :: x1, x2, x3, x4
185 do k=iajad(nz),iajad(nz+1)-1
191 w1(ixx)=w1(ixx) + ajad(k*16-15)*x1 + ajad(k*16-14)*x2 + ajad(k*16-13)*x3 + ajad(k*16-12)*x4
192 w2(ixx)=w2(ixx) + ajad(k*16-11)*x1 + ajad(k*16-10)*x2 + ajad(k*16- 9)*x3 + ajad(k*16- 8)*x4
193 w3(ixx)=w3(ixx) + ajad(k*16- 7)*x1 + ajad(k*16- 6)*x2 + ajad(k*16- 5)*x3 + ajad(k*16- 4)*x4
194 w4(ixx)=w4(ixx) + ajad(k*16- 3)*x1 + ajad(k*16- 2)*x2 + ajad(k*16- 1)*x3 + ajad(k*16- 0)*x4
201 y(4*i-3)=y(4*i-3)+w1(jadord(i))
202 y(4*i-2)=y(4*i-2)+w2(jadord(i))
203 y(4*i-1)=y(4*i-1)+w3(jadord(i))
204 y(4*i )=y(4*i )+w4(jadord(i))
Jagged Diagonal Matrix storage for vector processors. Original code was provided by JAMSTEC.
subroutine, public hecmw_jad_init_44(hecMAT)
subroutine, public hecmw_jad_matvec_44(hecMESH, hecMAT, X, Y, COMMtime)
subroutine, public hecmw_jad_finalize_44()
subroutine matjad(N, MJAD, IAJAD, JAJAD, AJAD, JADORD, X, Y, W1, W2, W3, W4)
integer(kind=4), parameter kreal
real(kind=kreal) function hecmw_wtime()
subroutine hecmw_update_r(hecMESH, val, n, m)