@@ -299,14 +299,24 @@ contains
299
299
300
300
associate( data => matrix%data, colptr => matrix%colptr, row => matrix%row, &
301
301
& nnz => matrix%nnz, nrows => matrix%nrows, ncols => matrix%ncols, storage => matrix%storage )
302
- if( storage == sparse_full) then
302
+ if( storage == sparse_full .and. op_==sparse_op_none ) then
303
303
do concurrent(j=1:ncols)
304
+ aux = alpha_ * vec_x(${rksfx2(rank-1)}$j)
304
305
do i = colptr(j), colptr(j+1)-1
305
- vec_y(${rksfx2(rank-1)}$row(i)) = vec_y(${rksfx2(rank-1)}$row(i)) + alpha_ * data(i) * vec_x(${rksfx2(rank-1)}$j)
306
+ vec_y(${rksfx2(rank-1)}$row(i)) = vec_y(${rksfx2(rank-1)}$row(i)) + data(i) * aux
307
+ end do
308
+ end do
309
+
310
+ else if( storage == sparse_full .and. op_==sparse_op_transpose ) then
311
+ do concurrent(j=1:ncols)
312
+ aux = zero_${k1}$
313
+ do i = colptr(j), colptr(j+1)-1
314
+ aux = aux + data(i) * vec_x(${rksfx2(rank-1)}$row(i))
306
315
end do
316
+ vec_y(${rksfx2(rank-1)}$j) = vec_y(${rksfx2(rank-1)}$j) + alpha_ * aux
307
317
end do
308
318
309
- else if( storage == sparse_lower )then
319
+ else if( storage == sparse_lower .and. op_/=sparse_op_hermitian )then
310
320
do j = 1 , ncols
311
321
aux = vec_x(${rksfx2(rank-1)}$j) * data(colptr(j))
312
322
do i = colptr(j)+1, colptr(j+1)-1
@@ -316,7 +326,7 @@ contains
316
326
vec_y(${rksfx2(rank-1)}$j) = vec_y(${rksfx2(rank-1)}$j) + alpha_ * aux
317
327
end do
318
328
319
- else if( storage == sparse_upper )then
329
+ else if( storage == sparse_upper .and. op_/=sparse_op_hermitian )then
320
330
do j = 1 , ncols
321
331
aux = zero_${s1}$
322
332
do i = colptr(j), colptr(i+1)-2
@@ -326,7 +336,38 @@ contains
326
336
aux = aux + data(colptr(j)) * vec_x(${rksfx2(rank-1)}$j)
327
337
vec_y(${rksfx2(rank-1)}$j) = vec_y(${rksfx2(rank-1)}$j) + alpha_ * aux
328
338
end do
329
-
339
+
340
+ #:if t1.startswith('complex')
341
+ else if( storage == sparse_full .and. op_==sparse_op_hermitian ) then
342
+ do concurrent(j=1:ncols)
343
+ aux = zero_${k1}$
344
+ do i = colptr(j), colptr(j+1)-1
345
+ aux = aux + conjg(data(i)) * vec_x(${rksfx2(rank-1)}$row(i))
346
+ end do
347
+ vec_y(${rksfx2(rank-1)}$j) = vec_y(${rksfx2(rank-1)}$j) + alpha_ * aux
348
+ end do
349
+
350
+ else if( storage == sparse_lower .and. op_==sparse_op_hermitian )then
351
+ do j = 1 , ncols
352
+ aux = vec_x(${rksfx2(rank-1)}$j) * conjg(data(colptr(j)))
353
+ do i = colptr(j)+1, colptr(j+1)-1
354
+ aux = aux + conjg(data(i)) * vec_x(${rksfx2(rank-1)}$row(i))
355
+ vec_y(${rksfx2(rank-1)}$row(i)) = vec_y(${rksfx2(rank-1)}$row(i)) + alpha_ * conjg(data(i)) * vec_x(${rksfx2(rank-1)}$j)
356
+ end do
357
+ vec_y(${rksfx2(rank-1)}$j) = vec_y(${rksfx2(rank-1)}$j) + alpha_ * aux
358
+ end do
359
+
360
+ else if( storage == sparse_upper .and. op_==sparse_op_hermitian )then
361
+ do j = 1 , ncols
362
+ aux = zero_${s1}$
363
+ do i = colptr(j), colptr(i+1)-2
364
+ aux = aux + conjg(data(i)) * vec_x(${rksfx2(rank-1)}$j)
365
+ vec_y(${rksfx2(rank-1)}$i) = vec_y(${rksfx2(rank-1)}$i) + alpha_ * conjg(data(i)) * vec_x(${rksfx2(rank-1)}$row(i))
366
+ end do
367
+ aux = aux + conjg(data(colptr(j))) * vec_x(${rksfx2(rank-1)}$j)
368
+ vec_y(${rksfx2(rank-1)}$j) = vec_y(${rksfx2(rank-1)}$j) + alpha_ * aux
369
+ end do
370
+ #:endif
330
371
end if
331
372
end associate
332
373
end subroutine
0 commit comments