1c96caaccSSatish Balay! 2c96caaccSSatish Balay! 3c96caaccSSatish Balay! Fortran kernel for sparse matrix-vector product in the AIJ matrix format 4c96caaccSSatish Balay! 5c96caaccSSatish Balay#include <petsc/finclude/petscsys.h> 6c96caaccSSatish Balay! 7c96caaccSSatish Balay subroutine FortranMultTransposeAddAIJ(n,x,ii,jj,a,y) 8c96caaccSSatish Balay implicit none 9c96caaccSSatish Balay PetscScalar x(0:*),a(0:*),y(0:*) 10c96caaccSSatish Balay PetscScalar alpha 11c96caaccSSatish Balay PetscInt n,ii(*),jj(0:*) 12c96caaccSSatish Balay 13c96caaccSSatish Balay PetscInt i,j,jstart,jend 14c96caaccSSatish Balay 15c96caaccSSatish Balay jend = ii(1) 16c96caaccSSatish Balay do 10,i=1,n 17c96caaccSSatish Balay jstart = jend 18c96caaccSSatish Balay jend = ii(i+1) 19c96caaccSSatish Balay alpha = x(i-1) 20c96caaccSSatish Balay do 20 j=jstart,jend-1 21c96caaccSSatish Balay y(jj(j)) = y(jj(j)) + alpha*a(j) 22c96caaccSSatish Balay 20 continue 23c96caaccSSatish Balay 10 continue 24c96caaccSSatish Balay 25c96caaccSSatish Balay end 26c96caaccSSatish Balay 27c96caaccSSatish Balay subroutine FortranMultAIJ(n,x,ii,jj,a,y) 28c96caaccSSatish Balay implicit none 29c96caaccSSatish Balay PetscScalar x(0:*),a(0:*),y(*) 30c96caaccSSatish Balay PetscInt n,ii(*),jj(0:*) 31c96caaccSSatish Balay 32c96caaccSSatish Balay PetscInt i,j,jstart,jend 33c96caaccSSatish Balay PetscScalar sum 34c96caaccSSatish Balay 35*5161815cSJunchao Zhang#ifdef PETSC_USE_OPENMP_KERNELS 36*5161815cSJunchao Zhang !omp parallel do private(j,jstart,jend,sum) 37*5161815cSJunchao Zhang#endif 38c96caaccSSatish Balay do 10,i=1,n 39*5161815cSJunchao Zhang jstart = ii(i) 40c96caaccSSatish Balay jend = ii(i+1) 41c96caaccSSatish Balay sum = 0.d0 42c96caaccSSatish Balay do 20 j=jstart,jend-1 43c96caaccSSatish Balay sum = sum + a(j)*x(jj(j)) 44c96caaccSSatish Balay 20 continue 45c96caaccSSatish Balay y(i) = sum 46c96caaccSSatish Balay 10 continue 47c96caaccSSatish Balay 48c96caaccSSatish Balay end 49