170 nnz += (M - 1) * N * K;
171 nnz += (N - 1) * M * K;
172 nnz += (K - 1) * M * N;
177 nnz += 2 * M * (N - 1) * (K - 1);
178 nnz += 2 * N * (M - 1) * (K - 1);
179 nnz += 2 * K * (M - 1) * (N - 1);
184 nnz += 4 * (M - 1) * (N - 1) * (K - 1);
196 nnz += 2 * N * (K - 1);
197 nnz += 2 * K * (N - 1);
202 nnz += 4 * (N - 1) * (K - 1);
282#if !defined(PRECISION_p)
283 spm_complex64_t *valptr;
284 spm_complex64_t lalpha = (spm_complex64_t)alpha;
285 spm_complex64_t lbeta = (spm_complex64_t)beta;
298 assert( spm->
gN == dim1 * dim2 * dim3 );
308 spm->
n = ldim1 * dim2 * dim3;
324#if !defined(PRECISION_p)
325 spm->
values = malloc(spm->
nnz *
sizeof(spm_complex64_t));
327 valptr = (spm_complex64_t*)(spm->
values);
339 for(i=0; i<dim3; i++)
348 if ( i < (dim3-1) ) {
352 for(j=0; j<dim2; j++)
361 if ( j < (dim2-1) ) {
366 l = i * dim1 * dim2 + j * dim1 + fk;
376 if ( k < (dim1-1) ) {
379 degree = di + dj + dk;
381 colptr[1] = colptr[0];
385 l, (spm_complex64_t)degree * lalpha );
400 if ( i < (dim3 - 1) ) {
402 l + dim1 * dim2, lbeta );
410 if ( k == (dim1-1) ) {
419 if ( (spm->
clustnbr > 1) && (spm->
n > 0) ) {
424 for(i=0; i<dim3; i++) {
425 for(j=0; j<dim2; j++) {
426 l = i * dim1 * dim2 + j * dim1 + fk;
427 for(k=fk; k<lk; k++, l++, loc2glob++ ) {
511#if !defined(PRECISION_p)
512 spm_complex64_t *valptr;
513 spm_complex64_t lalpha = (spm_complex64_t)alpha;
514 spm_complex64_t lbeta = (spm_complex64_t)beta;
515 spm_complex64_t lgamma = (spm_complex64_t)beta / sqrt(2.);
516 spm_complex64_t ldelta = (spm_complex64_t)beta / sqrt(3.);
529 assert( spm->
gN == dim1 * dim2 * dim3 );
539 spm->
n = ldim1 * dim2 * dim3;
555#if !defined(PRECISION_p)
556 spm->
values = malloc( spm->
nnz *
sizeof(spm_complex64_t) );
558 valptr = (spm_complex64_t*)(spm->
values);
568 l = dim2 * dim3 * fk;
569 for( k=fk; k<lk; k++ )
575 if ( k < (dim1-1) ) {
579 for( i=0; i<dim2; i++ )
585 if ( i < (dim2-1) ) {
589 for( j=0; j<dim3; j++, l++ )
595 if ( j < (dim3-1) ) {
599 colptr[1] = colptr[0];
602 degree = dk * di * dj - 1;
638 if ( j < (dim3 - 1) ) {
647 row, (j > 0), (j < (dim3-1)),
652 if ( k < (dim1 - 1) ) {
655 row = l + dim3 * dim2 - dim3;
657 row, (j > 0), (j < (dim3-1)),
661 row = l + dim3 * dim2;
663 row, (j > 0), (j < (dim3-1)),
668 row = l + dim3 * dim2 + dim3;
670 row, (j > 0), (j < (dim3-1)),
683 if (( spm->
clustnbr > 1 ) && (spm->
n > 0) ) {
688 l = dim2 * dim3 * fk;
689 for(k=0; k<spm->
n; k++, l++, loc2glob++ ) {
void z_spmLaplacian_7points(spmatrix_t *spm, spm_int_t dim1, spm_int_t dim2, spm_int_t dim3, spm_fixdbl_t alpha, spm_fixdbl_t beta)
Generate a laplacian matrix for a 3D 7-points stencil.
void z_spmLaplacian_27points(spmatrix_t *spm, spm_int_t dim1, spm_int_t dim2, spm_int_t dim3, spm_fixdbl_t alpha, spm_fixdbl_t beta)
Generate an extended laplacian matrix for a 3D 27-points stencil.
#define laplacian_add_three_edges(_colptr_, _rowptr_, _valptr_, _dest_, _fcond_, _lcond_, _valone_, _valtwo_)
Add three edges of the 27 pts stencil. the direct one, and its two diagonal neighboor ones.
#define laplacian_add_one_edge(_colptr_, _rowptr_, _valptr_, _dest_, _value_)
Add an edge to the spm matrix.
static spm_int_t z_spmLaplacian_getnnz(spm_int_t M, spm_int_t N, spm_int_t K, int level, int connexion)
Return the number of edges in a laplacian of size MxNxK.