mld2p4-2:

mlprec/impl/mld_cslu_interface.c
 mlprec/impl/mld_dslu_interface.c
 mlprec/impl/mld_sslu_interface.c
 mlprec/impl/mld_zslu_interface.c
 mlprec/mld_c_slu_solver.F90
 mlprec/mld_d_slu_solver.F90
 mlprec/mld_s_slu_solver.F90
 mlprec/mld_z_slu_solver.F90


Fixed interface to SuperLU solver; SuperLU now working.
stopcriterion
Salvatore Filippone 12 years ago
parent 6b8ff2b597
commit 91d3f5a043

@ -38,7 +38,7 @@
* *
* File: mld_cslu_interface.c * File: mld_cslu_interface.c
* *
* Functions: mld_cslu_fact_, mld_cslu_solve_, mld_cslu_free_. * Functions: mld_cslu_fact, mld_cslu_solve, mld_cslu_free.
* *
* This file is an interface to the SuperLU routines for sparse factorization and * This file is an interface to the SuperLU routines for sparse factorization and
* solve. It was obtained by modifying the c_fortran_cgssv.c file from the SuperLU * solve. It was obtained by modifying the c_fortran_cgssv.c file from the SuperLU
@ -110,15 +110,13 @@ typedef struct {
int int mld_cslu_fact(int n, int nnz,
mld_cslu_fact(int n, int nnz,
#ifdef HAVE_SLU_ #ifdef HAVE_SLU_
complex *values, complex *values,
#else #else
void *values, void *values,
#endif #endif
int *rowptr, int *colind, void **f_factors) int *rowptr, int *colind, void **f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.
@ -140,7 +138,6 @@ mld_cslu_fact(int n, int nnz,
NCformat *Ustore; NCformat *Ustore;
int i, panel_size, permc_spec, relax; int i, panel_size, permc_spec, relax;
trans_t trans; trans_t trans;
float drop_tol = 0.0;
mem_usage_t mem_usage; mem_usage_t mem_usage;
superlu_options_t options; superlu_options_t options;
SuperLUStat_t stat; SuperLUStat_t stat;
@ -180,7 +177,7 @@ mld_cslu_fact(int n, int nnz,
panel_size = sp_ienv(1); panel_size = sp_ienv(1);
relax = sp_ienv(2); relax = sp_ienv(2);
cgstrf(&options, &AC, drop_tol, relax, panel_size, cgstrf(&options, &AC, relax, panel_size,
etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info); etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info);
if ( info == 0 ) { if ( info == 0 ) {
@ -191,17 +188,15 @@ mld_cslu_fact(int n, int nnz,
printf("No of nonzeros in factor L = %d\n", Lstore->nnz); printf("No of nonzeros in factor L = %d\n", Lstore->nnz);
printf("No of nonzeros in factor U = %d\n", Ustore->nnz); printf("No of nonzeros in factor U = %d\n", Ustore->nnz);
printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz); printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
#endif #endif
} else { } else {
printf("cgstrf() error returns INFO= %d\n", info); printf("cgstrf() error returns INFO= %d\n", info);
if ( info <= n ) { /* factorization completes */ if ( info <= n ) { /* factorization completes */
cQuerySpace(L, U, &mem_usage); cQuerySpace(L, U, &mem_usage);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
} }
} }
@ -226,15 +221,13 @@ mld_cslu_fact(int n, int nnz,
} }
int int mld_cslu_solve(int itrans, int n, int nrhs,
mld_cslu_solve(int itrans, int n, int nrhs,
#ifdef HAVE_SLU_ #ifdef HAVE_SLU_
complex *b, complex *b,
#else #else
void *b, void *b,
#endif #endif
int ldb,void *f_factors) int ldb,void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.
@ -296,9 +289,7 @@ mld_cslu_solve(int itrans, int n, int nrhs,
} }
int int mld_cslu_free(void *f_factors)
mld_cslu_free(void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.

@ -38,7 +38,7 @@
* *
* File: mld_slu_interface.c * File: mld_slu_interface.c
* *
* Functions: mld_dslu_fact_, mld_dslu_solve_, mld_dslu_free_. * Functions: mld_dslu_fact, mld_dslu_solve, mld_dslu_free.
* *
* This file is an interface to the SuperLU routines for sparse factorization and * This file is an interface to the SuperLU routines for sparse factorization and
* solve. It was obtained by modifying the c_fortran_dgssv.c file from the SuperLU * solve. It was obtained by modifying the c_fortran_dgssv.c file from the SuperLU
@ -110,10 +110,8 @@ typedef struct {
int int mld_dslu_fact(int n, int nnz, double *values,
mld_dslu_fact(int n, int nnz, double *values,
int *rowptr, int *colind, void **f_factors) int *rowptr, int *colind, void **f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.
@ -135,7 +133,6 @@ mld_dslu_fact(int n, int nnz, double *values,
NCformat *Ustore; NCformat *Ustore;
int i, panel_size, permc_spec, relax; int i, panel_size, permc_spec, relax;
trans_t trans; trans_t trans;
double drop_tol = 0.0;
mem_usage_t mem_usage; mem_usage_t mem_usage;
superlu_options_t options; superlu_options_t options;
SuperLUStat_t stat; SuperLUStat_t stat;
@ -166,8 +163,9 @@ mld_dslu_fact(int n, int nnz, double *values,
* permc_spec = 2: minimum degree on structure of A'+A * permc_spec = 2: minimum degree on structure of A'+A
* permc_spec = 3: approximate minimum degree for unsymmetric matrices * permc_spec = 3: approximate minimum degree for unsymmetric matrices
*/ */
options.ColPerm=2; /* options.ColPerm=2; */
permc_spec = options.ColPerm; /* permc_spec = options.ColPerm; */
permc_spec=0;
get_perm_c(permc_spec, &A, perm_c); get_perm_c(permc_spec, &A, perm_c);
sp_preorder(&options, &A, perm_c, etree, &AC); sp_preorder(&options, &A, perm_c, etree, &AC);
@ -175,7 +173,7 @@ mld_dslu_fact(int n, int nnz, double *values,
panel_size = sp_ienv(1); panel_size = sp_ienv(1);
relax = sp_ienv(2); relax = sp_ienv(2);
dgstrf(&options, &AC, drop_tol, relax, panel_size, dgstrf(&options, &AC, relax, panel_size,
etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info); etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info);
if ( info == 0 ) { if ( info == 0 ) {
@ -186,17 +184,15 @@ mld_dslu_fact(int n, int nnz, double *values,
printf("No of nonzeros in factor L = %d\n", Lstore->nnz); printf("No of nonzeros in factor L = %d\n", Lstore->nnz);
printf("No of nonzeros in factor U = %d\n", Ustore->nnz); printf("No of nonzeros in factor U = %d\n", Ustore->nnz);
printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz); printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
#endif #endif
} else { } else {
printf("dgstrf() error returns INFO= %d\n", info); printf("dgstrf() error returns INFO= %d\n", info);
if ( info <= n ) { /* factorization completes */ if ( info <= n ) { /* factorization completes */
dQuerySpace(L, U, &mem_usage); dQuerySpace(L, U, &mem_usage);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
} }
} }
@ -221,10 +217,8 @@ mld_dslu_fact(int n, int nnz, double *values,
} }
int int mld_dslu_solve(int itrans, int n, int nrhs, double *b, int ldb,
mld_dslu_solve(int itrans, int n, int nrhs, double *b, int ldb,
void *f_factors) void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.
@ -242,7 +236,6 @@ mld_dslu_solve(int itrans, int n, int nrhs, double *b, int ldb,
NCformat *Ustore; NCformat *Ustore;
int i, panel_size, permc_spec, relax; int i, panel_size, permc_spec, relax;
trans_t trans; trans_t trans;
double drop_tol = 0.0;
SuperLUStat_t stat; SuperLUStat_t stat;
factors_t *LUfactors; factors_t *LUfactors;
@ -279,9 +272,7 @@ mld_dslu_solve(int itrans, int n, int nrhs, double *b, int ldb,
} }
int int mld_dslu_free(void *f_factors)
mld_dslu_free(void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.

@ -38,7 +38,7 @@
* *
* File: mld_slu_interface.c * File: mld_slu_interface.c
* *
* Functions: mld_sslu_fact_, mld_sslu_solve_, mld_sslu_free_. * Functions: mld_sslu_fact, mld_sslu_solve, mld_sslu_free.
* *
* This file is an interface to the SuperLU routines for sparse factorization and * This file is an interface to the SuperLU routines for sparse factorization and
* solve. It was obtained by modifying the c_fortran_dgssv.c file from the SuperLU * solve. It was obtained by modifying the c_fortran_dgssv.c file from the SuperLU
@ -110,10 +110,8 @@ typedef struct {
int int mld_sslu_fact(int n, int nnz, float *values,
mld_sslu_fact(int n, int nnz, float *values,
int *rowptr, int *colind, void **f_factors) int *rowptr, int *colind, void **f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.
@ -135,7 +133,6 @@ mld_sslu_fact(int n, int nnz, float *values,
NCformat *Ustore; NCformat *Ustore;
int i, panel_size, permc_spec, relax; int i, panel_size, permc_spec, relax;
trans_t trans; trans_t trans;
float drop_tol = 0.0;
mem_usage_t mem_usage; mem_usage_t mem_usage;
superlu_options_t options; superlu_options_t options;
SuperLUStat_t stat; SuperLUStat_t stat;
@ -175,7 +172,7 @@ mld_sslu_fact(int n, int nnz, float *values,
panel_size = sp_ienv(1); panel_size = sp_ienv(1);
relax = sp_ienv(2); relax = sp_ienv(2);
sgstrf(&options, &AC, drop_tol, relax, panel_size, sgstrf(&options, &AC, relax, panel_size,
etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info); etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info);
if ( info == 0 ) { if ( info == 0 ) {
@ -186,17 +183,15 @@ mld_sslu_fact(int n, int nnz, float *values,
printf("No of nonzeros in factor L = %d\n", Lstore->nnz); printf("No of nonzeros in factor L = %d\n", Lstore->nnz);
printf("No of nonzeros in factor U = %d\n", Ustore->nnz); printf("No of nonzeros in factor U = %d\n", Ustore->nnz);
printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz); printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
#endif #endif
} else { } else {
printf("sgstrf() error returns INFO= %d\n", info); printf("sgstrf() error returns INFO= %d\n", info);
if ( info <= n ) { /* factorization completes */ if ( info <= n ) { /* factorization completes */
sQuerySpace(L, U, &mem_usage); sQuerySpace(L, U, &mem_usage);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
} }
} }
@ -221,10 +216,8 @@ mld_sslu_fact(int n, int nnz, float *values,
} }
int int mld_sslu_solve(int itrans, int n, int nrhs, float *b, int ldb,
mld_sslu_solve(int itrans, int n, int nrhs, float *b, int ldb,
void *f_factors) void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.
@ -242,7 +235,6 @@ mld_sslu_solve(int itrans, int n, int nrhs, float *b, int ldb,
NCformat *Ustore; NCformat *Ustore;
int i, panel_size, permc_spec, relax; int i, panel_size, permc_spec, relax;
trans_t trans; trans_t trans;
float drop_tol = 0.0;
SuperLUStat_t stat; SuperLUStat_t stat;
factors_t *LUfactors; factors_t *LUfactors;
@ -279,9 +271,7 @@ mld_sslu_solve(int itrans, int n, int nrhs, float *b, int ldb,
} }
int int mld_sslu_free(void *f_factors)
mld_sslu_free(void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.

@ -38,7 +38,7 @@
* *
* File: mld_zslu_interface.c * File: mld_zslu_interface.c
* *
* Functions: mld_zslu_fact_, mld_zslu_solve_, mld_zslu_free_. * Functions: mld_zslu_fact, mld_zslu_solve, mld_zslu_free.
* *
* This file is an interface to the SuperLU routines for sparse factorization and * This file is an interface to the SuperLU routines for sparse factorization and
* solve. It was obtained by modifying the c_fortran_zgssv.c file from the SuperLU * solve. It was obtained by modifying the c_fortran_zgssv.c file from the SuperLU
@ -109,8 +109,7 @@ typedef struct {
int int mld_zslu_fact(int n, int nnz,
mld_zslu_fact(int n, int nnz,
#ifdef HAVE_SLU_ #ifdef HAVE_SLU_
doublecomplex *values, doublecomplex *values,
#else #else
@ -139,7 +138,6 @@ mld_zslu_fact(int n, int nnz,
NCformat *Ustore; NCformat *Ustore;
int i, panel_size, permc_spec, relax; int i, panel_size, permc_spec, relax;
trans_t trans; trans_t trans;
double drop_tol = 0.0;
mem_usage_t mem_usage; mem_usage_t mem_usage;
superlu_options_t options; superlu_options_t options;
SuperLUStat_t stat; SuperLUStat_t stat;
@ -179,7 +177,7 @@ mld_zslu_fact(int n, int nnz,
panel_size = sp_ienv(1); panel_size = sp_ienv(1);
relax = sp_ienv(2); relax = sp_ienv(2);
zgstrf(&options, &AC, drop_tol, relax, panel_size, zgstrf(&options, &AC, relax, panel_size,
etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info); etree, NULL, 0, perm_c, perm_r, L, U, &stat, &info);
if ( info == 0 ) { if ( info == 0 ) {
@ -190,17 +188,15 @@ mld_zslu_fact(int n, int nnz,
printf("No of nonzeros in factor L = %d\n", Lstore->nnz); printf("No of nonzeros in factor L = %d\n", Lstore->nnz);
printf("No of nonzeros in factor U = %d\n", Ustore->nnz); printf("No of nonzeros in factor U = %d\n", Ustore->nnz);
printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz); printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
#endif #endif
} else { } else {
printf("zgstrf() error returns INFO= %d\n", info); printf("zgstrf() error returns INFO= %d\n", info);
if ( info <= n ) { /* factorization completes */ if ( info <= n ) { /* factorization completes */
zQuerySpace(L, U, &mem_usage); zQuerySpace(L, U, &mem_usage);
printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", printf("L\\U MB %.3f\ttotal MB needed %.3f\n",
mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, mem_usage.for_lu/1e6, mem_usage.total_needed/1e6);
mem_usage.expansions);
} }
} }
@ -225,15 +221,13 @@ mld_zslu_fact(int n, int nnz,
} }
int int mld_zslu_solve(int itrans, int n, int nrhs,
mld_zslu_solve(int itrans, int n, int nrhs,
#ifdef HAVE_SLU_ #ifdef HAVE_SLU_
doublecomplex *b, doublecomplex *b,
#else #else
void *b, void *b,
#endif #endif
int ldb,void *f_factors) int ldb,void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.
@ -295,9 +289,7 @@ mld_zslu_solve(int itrans, int n, int nrhs,
} }
int int mld_zslu_free(void *f_factors)
mld_zslu_free(void *f_factors)
{ {
/* /*
* This routine can be called from Fortran. * This routine can be called from Fortran.

@ -95,12 +95,12 @@ module mld_c_slu_solver
end interface end interface
interface interface
function mld_cslu_solve(itrans,n,x, b, ldb, lufactors)& function mld_cslu_solve(itrans,n,nrhs,b,ldb,lufactors)&
& bind(c,name='mld_cslu_solve') result(info) & bind(c,name='mld_cslu_solve') result(info)
use iso_c_binding use iso_c_binding
integer(c_int) :: info integer(c_int) :: info
integer(c_int), value :: itrans,n,ldb integer(c_int), value :: itrans,n,nrhs,ldb
complex(c_float_complex) :: x(*), b(ldb,*) complex(c_float_complex) :: b(ldb,*)
type(c_ptr), value :: lufactors type(c_ptr), value :: lufactors
end function mld_cslu_solve end function mld_cslu_solve
end interface end interface
@ -162,23 +162,27 @@ contains
end if end if
endif endif
ww(1:n_row) = x(1:n_row)
select case(trans_) select case(trans_)
case('N') case('N')
info = mld_cslu_solve(0,n_row,ww,x,n_row,sv%lufactors) info = mld_cslu_solve(0,n_row,1,ww,n_row,sv%lufactors)
case('T') case('T')
info = mld_cslu_solve(1,n_row,ww,x,n_row,sv%lufactors) info = mld_cslu_solve(1,n_row,1,ww,n_row,sv%lufactors)
case('C') case('C')
info = mld_cslu_solve(2,n_row,ww,x,n_row,sv%lufactors) info = mld_cslu_solve(2,n_row,1,ww,n_row,sv%lufactors)
case default case default
call psb_errpush(psb_err_internal_error_,name,a_err='Invalid TRANS in ILU subsolve') call psb_errpush(psb_err_internal_error_, &
& name,a_err='Invalid TRANS in ILU subsolve')
goto 9999 goto 9999
end select end select
if (info == psb_success_) call psb_geaxpby(alpha,ww,beta,y,desc_data,info) if (info == psb_success_) &
& call psb_geaxpby(alpha,ww,beta,y,desc_data,info)
if (info /= psb_success_) then if (info /= psb_success_) then
call psb_errpush(psb_err_internal_error_,name,a_err='Error in subsolve') call psb_errpush(psb_err_internal_error_,&
& name,a_err='Error in subsolve')
goto 9999 goto 9999
endif endif

@ -95,12 +95,12 @@ module mld_d_slu_solver
end interface end interface
interface interface
function mld_dslu_solve(itrans,n,x, b, ldb, lufactors)& function mld_dslu_solve(itrans,n,nrhs,b,ldb,lufactors)&
& bind(c,name='mld_dslu_solve') result(info) & bind(c,name='mld_dslu_solve') result(info)
use iso_c_binding use iso_c_binding
integer(c_int) :: info integer(c_int) :: info
integer(c_int), value :: itrans,n,ldb integer(c_int), value :: itrans,n,nrhs,ldb
real(c_double) :: x(*), b(ldb,*) real(c_double) :: b(ldb,*)
type(c_ptr), value :: lufactors type(c_ptr), value :: lufactors
end function mld_dslu_solve end function mld_dslu_solve
end interface end interface
@ -162,23 +162,27 @@ contains
end if end if
endif endif
ww(1:n_row) = x(1:n_row)
select case(trans_) select case(trans_)
case('N') case('N')
info = mld_dslu_solve(0,n_row,ww,x,n_row,sv%lufactors) info = mld_dslu_solve(0,n_row,1,ww,n_row,sv%lufactors)
case('T') case('T')
info = mld_dslu_solve(1,n_row,ww,x,n_row,sv%lufactors) info = mld_dslu_solve(1,n_row,1,ww,n_row,sv%lufactors)
case('C') case('C')
info = mld_dslu_solve(2,n_row,ww,x,n_row,sv%lufactors) info = mld_dslu_solve(2,n_row,1,ww,n_row,sv%lufactors)
case default case default
call psb_errpush(psb_err_internal_error_,name,a_err='Invalid TRANS in ILU subsolve') call psb_errpush(psb_err_internal_error_, &
& name,a_err='Invalid TRANS in ILU subsolve')
goto 9999 goto 9999
end select end select
if (info == psb_success_) call psb_geaxpby(alpha,ww,beta,y,desc_data,info) if (info == psb_success_) &
& call psb_geaxpby(alpha,ww,beta,y,desc_data,info)
if (info /= psb_success_) then if (info /= psb_success_) then
call psb_errpush(psb_err_internal_error_,name,a_err='Error in subsolve') call psb_errpush(psb_err_internal_error_,&
& name,a_err='Error in subsolve')
goto 9999 goto 9999
endif endif

@ -95,12 +95,12 @@ module mld_s_slu_solver
end interface end interface
interface interface
function mld_sslu_solve(itrans,n,x, b, ldb, lufactors)& function mld_sslu_solve(itrans,n,nrhs,b,ldb,lufactors)&
& bind(c,name='mld_sslu_solve') result(info) & bind(c,name='mld_sslu_solve') result(info)
use iso_c_binding use iso_c_binding
integer(c_int) :: info integer(c_int) :: info
integer(c_int), value :: itrans,n,ldb integer(c_int), value :: itrans,n,nrhs,ldb
real(c_float) :: x(*), b(ldb,*) real(c_float) :: b(ldb,*)
type(c_ptr), value :: lufactors type(c_ptr), value :: lufactors
end function mld_sslu_solve end function mld_sslu_solve
end interface end interface
@ -162,23 +162,27 @@ contains
end if end if
endif endif
ww(1:n_row) = x(1:n_row)
select case(trans_) select case(trans_)
case('N') case('N')
info = mld_sslu_solve(0,n_row,ww,x,n_row,sv%lufactors) info = mld_sslu_solve(0,n_row,1,ww,n_row,sv%lufactors)
case('T') case('T')
info = mld_sslu_solve(1,n_row,ww,x,n_row,sv%lufactors) info = mld_sslu_solve(1,n_row,1,ww,n_row,sv%lufactors)
case('C') case('C')
info = mld_sslu_solve(2,n_row,ww,x,n_row,sv%lufactors) info = mld_sslu_solve(2,n_row,1,ww,n_row,sv%lufactors)
case default case default
call psb_errpush(psb_err_internal_error_,name,a_err='Invalid TRANS in ILU subsolve') call psb_errpush(psb_err_internal_error_, &
& name,a_err='Invalid TRANS in ILU subsolve')
goto 9999 goto 9999
end select end select
if (info == psb_success_) call psb_geaxpby(alpha,ww,beta,y,desc_data,info) if (info == psb_success_) &
& call psb_geaxpby(alpha,ww,beta,y,desc_data,info)
if (info /= psb_success_) then if (info /= psb_success_) then
call psb_errpush(psb_err_internal_error_,name,a_err='Error in subsolve') call psb_errpush(psb_err_internal_error_,&
& name,a_err='Error in subsolve')
goto 9999 goto 9999
endif endif

@ -95,12 +95,12 @@ module mld_z_slu_solver
end interface end interface
interface interface
function mld_zslu_solve(itrans,n,x, b, ldb, lufactors)& function mld_zslu_solve(itrans,n,nrhs,b,ldb,lufactors)&
& bind(c,name='mld_zslu_solve') result(info) & bind(c,name='mld_zslu_solve') result(info)
use iso_c_binding use iso_c_binding
integer(c_int) :: info integer(c_int) :: info
integer(c_int), value :: itrans,n,ldb integer(c_int), value :: itrans,n,nrhs,ldb
complex(c_double_complex) :: x(*), b(ldb,*) complex(c_double_complex) :: b(ldb,*)
type(c_ptr), value :: lufactors type(c_ptr), value :: lufactors
end function mld_zslu_solve end function mld_zslu_solve
end interface end interface
@ -162,23 +162,27 @@ contains
end if end if
endif endif
ww(1:n_row) = x(1:n_row)
select case(trans_) select case(trans_)
case('N') case('N')
info = mld_zslu_solve(0,n_row,ww,x,n_row,sv%lufactors) info = mld_zslu_solve(0,n_row,1,ww,n_row,sv%lufactors)
case('T') case('T')
info = mld_zslu_solve(1,n_row,ww,x,n_row,sv%lufactors) info = mld_zslu_solve(1,n_row,1,ww,n_row,sv%lufactors)
case('C') case('C')
info = mld_zslu_solve(2,n_row,ww,x,n_row,sv%lufactors) info = mld_zslu_solve(2,n_row,1,ww,n_row,sv%lufactors)
case default case default
call psb_errpush(psb_err_internal_error_,name,a_err='Invalid TRANS in ILU subsolve') call psb_errpush(psb_err_internal_error_, &
& name,a_err='Invalid TRANS in ILU subsolve')
goto 9999 goto 9999
end select end select
if (info == psb_success_) call psb_geaxpby(alpha,ww,beta,y,desc_data,info) if (info == psb_success_) &
& call psb_geaxpby(alpha,ww,beta,y,desc_data,info)
if (info /= psb_success_) then if (info /= psb_success_) then
call psb_errpush(psb_err_internal_error_,name,a_err='Error in subsolve') call psb_errpush(psb_err_internal_error_,&
& name,a_err='Error in subsolve')
goto 9999 goto 9999
endif endif

Loading…
Cancel
Save