18#ifndef DOXYGEN_SHOULD_SKIP_THIS
22#if defined(SPM_WITH_MPI)
27 integer(kind=spm_int_t),
dimension(:),
pointer :: rowptr
28 integer(kind=spm_int_t),
dimension(:),
pointer :: colptr
29 real(kind=c_double),
dimension(:),
pointer :: values
30 real(kind=c_double),
dimension(:,:),
allocatable,
target :: x0, x, b
31 real(kind=c_double) :: eps = 1.e-15
32 type(spmatrix_t),
target :: spm
33 integer(kind=spm_int_t) :: dim1, dim2, dim3, n, nnz
34 integer(kind=spm_int_t) :: i, j, k, l, nrhs
35 integer(c_int) :: info
37#if defined(SPM_WITH_MPI)
49 n = dim1 * dim2 * dim3
50 nnz = (2*(dim1)-1) * dim2 * dim3 + (dim2-1)*dim1*dim3 + dim2*dim1*(dim3-1)
57 spm%mtxtype = spmsymmetric
58 spm%flttype = spmdouble
64 call spmupdatecomputedfields( spm )
67 call spmgetarray( spm, colptr=colptr, rowptr=rowptr, dvalues=values )
73 rowptr(l) = (i-1) + dim1 * (j-1) + dim1 * dim2 * (k-1) + 1
74 colptr(l) = (i-1) + dim1 * (j-1) + dim1 * dim2 * (k-1) + 1
78 values(l) = values(l) - 1.
81 values(l) = values(l) - 1.
84 values(l) = values(l) - 1.
87 values(l) = values(l) - 1.
90 values(l) = values(l) - 1.
93 values(l) = values(l) - 1.
96 values(l) = values(l) * 8.
100 rowptr(l) = i + dim1 * (j-1) + dim1 * dim2 * (k-1) + 1
101 colptr(l) = (i-1) + dim1 * (j-1) + dim1 * dim2 * (k-1) + 1
106 rowptr(l) = (i-1) + dim1 * j + dim1 * dim2 * (k-1) + 1
107 colptr(l) = (i-1) + dim1 * (j-1) + dim1 * dim2 * (k-1) + 1
112 rowptr(l) = (i-1) + dim1 * (j-1) + dim1 * dim2 * k + 1
113 colptr(l) = (i-1) + dim1 * (j-1) + dim1 * dim2 * (k-1) + 1
121 if ( l .ne. nnz+1 )
then
122 write(6,*)
'l ', l,
" nnz ", nnz
125 call spmprintinfo( spm )
129 allocate(x0(spm%nexp, nrhs))
130 allocate(x( spm%nexp, nrhs))
131 allocate(b( spm%nexp, nrhs))
134 call spmgenrhs( spmrhsrndx, nrhs, spm, x0, spm%nexp, b, spm%nexp, info )
142 call spmcheckaxb( eps, nrhs, spm, x0, spm%nexp, b, spm%nexp, x, spm%nexp, info )
149#if defined(SPM_WITH_MPI)
150 call mpi_finalize( info )