20 integer(kind=kint) :: N
21 real(kind=
kreal),
pointer :: alu(:) => null()
23 logical,
save :: INITIALIZED = .false.
31 integer(kind=kint ) :: np,ndof,ndof2
32 real (kind=
kreal) :: sigma_diag
33 real(kind=
kreal),
pointer:: d(:)
35 real (kind=
kreal):: alutmp(hecmat%NDOF,hecmat%NDOF), pw(hecmat%NDOF)
36 integer(kind=kint ):: i, j, k, ii
39 if (hecmat%Iarray(98) == 0 .and. hecmat%Iarray(97) == 0)
return
50 allocate(alu(ndof2*np))
55 alu(ndof2*(ii-1)+i)=d(ndof2*(ii-1)+i)
59 if (hecmat%cmat%n_val.gt.0)
then
60 do k= 1, hecmat%cmat%n_val
61 if (hecmat%cmat%pair(k)%i.ne.hecmat%cmat%pair(k)%j) cycle
62 ii = hecmat%cmat%pair(k)%i
65 alu(ndof2*(ii-1)+(i-1)*ndof+j) = alu(ndof2*(ii-1)+(i-1)*ndof+j) + hecmat%cmat%pair(k)%val(i, j)
77 alutmp(i,j) = alu(ndof2*(ii-1)+(i-1)*ndof+j)
78 if (i==j) alutmp(i,j)=alutmp(i,j)*sigma_diag
82 alutmp(k,k)= 1.d0/alutmp(k,k)
84 alutmp(i,k)= alutmp(i,k) * alutmp(k,k)
86 pw(j)= alutmp(i,j) - alutmp(i,k)*alutmp(k,j)
95 alu(ndof2*(ii-1)+(i-1)*ndof+j)= alutmp(i,j)
102 hecmat%Iarray(98) = 0
103 hecmat%Iarray(97) = 0
109 real(kind=
kreal),
intent(inout) :: ww(:)
110 integer(kind=kint) :: i,j,k,ndof
111 real(kind=
kreal) :: x(ndof)
119 x(j)=ww(ndof*(i-1)+j)
123 x(j)=x(j)-alu(ndof*ndof*(i-1)+ndof*(j-1)+k )*x(k)
128 x(j)=x(j)-alu(ndof*ndof*(i-1)+ndof*(j-1)+k )*x(k)
130 x(j)=alu(ndof*ndof*(i-1)+(ndof+1)*(j-1)+1 )*x(j)
133 ww(ndof*(i-1)+j)=x(j)
144 if (
associated(alu))
deallocate(alu)
146 initialized = .false.
real(kind=kreal) function, public hecmw_mat_get_sigma_diag(hecMAT)
subroutine, public hecmw_precond_diag_nn_setup(hecMAT)
subroutine, public hecmw_precond_diag_nn_clear()
subroutine, public hecmw_precond_diag_nn_apply(WW, NDOF)
integer(kind=4), parameter kreal