diff --git a/cbind/CMakeLists.txt b/cbind/CMakeLists.txt index 28497625..1f7bb259 100644 --- a/cbind/CMakeLists.txt +++ b/cbind/CMakeLists.txt @@ -26,11 +26,11 @@ set(PSB_cbind_source_files util/psb_util_cbind_mod.f90 util/psb_d_util_cbind_mod.f90 util/psb_z_util_cbind_mod.f90 - krylov/psb_ckrylov_cbind_mod.f90 - krylov/psb_base_krylov_cbind_mod.f90 - krylov/psb_skrylov_cbind_mod.f90 - krylov/psb_dkrylov_cbind_mod.f90 - krylov/psb_zkrylov_cbind_mod.f90 + linsolve/psb_clinsolve_cbind_mod.f90 + linsolve/psb_base_linsolve_cbind_mod.f90 + linsolve/psb_slinsolve_cbind_mod.f90 + linsolve/psb_dlinsolve_cbind_mod.f90 + linsolve/psb_zlinsolve_cbind_mod.f90 prec/psb_dprec_cbind_mod.f90 prec/psb_cprec_cbind_mod.f90 prec/psb_prec_cbind_mod.f90 @@ -75,7 +75,7 @@ list(APPEND PSB_cbind_header_C_files util/psb_c_sutil.h util/psb_c_cutil.h util/psb_util_cbind.h - krylov/psb_krylov_cbind.h + linsolve/psb_linsolve_cbind.h prec/psb_c_sprec.h prec/psb_c_cprec.h prec/psb_prec_cbind.h diff --git a/cbind/Makefile b/cbind/Makefile index 9724c711..3be3bd8f 100644 --- a/cbind/Makefile +++ b/cbind/Makefile @@ -6,13 +6,13 @@ INCDIR=../include MODDIR=../modules/ LIBNAME=$(CBINDLIBNAME) -objs: based precd krylovd utild +objs: based precd linsolved utild /bin/cp -p $(CPUPDFLAG) *.h $(INCDIR) /bin/cp -p $(CPUPDFLAG) *$(.mod) $(MODDIR) lib: objs cd base && $(MAKE) lib LIBNAME=$(LIBNAME) cd prec && $(MAKE) lib LIBNAME=$(LIBNAME) - cd krylov && $(MAKE) lib LIBNAME=$(LIBNAME) + cd linsolve && $(MAKE) lib LIBNAME=$(LIBNAME) cd util && $(MAKE) lib LIBNAME=$(LIBNAME) /bin/cp -p $(CPUPDFLAG) $(HERE)/$(LIBNAME) $(LIBDIR) @@ -21,15 +21,15 @@ based: cd base && $(MAKE) objs LIBNAME=$(LIBNAME) precd: based cd prec && $(MAKE) objs LIBNAME=$(LIBNAME) -krylovd: based precd - cd krylov && $(MAKE) objs LIBNAME=$(LIBNAME) +linsolved: based precd + cd linsolve && $(MAKE) objs LIBNAME=$(LIBNAME) utild: based cd util && $(MAKE) objs LIBNAME=$(LIBNAME) clean: cd base && $(MAKE) clean cd prec && $(MAKE) clean - cd krylov && $(MAKE) clean + cd linsolve && $(MAKE) clean cd util && $(MAKE) clean veryclean: clean diff --git a/cbind/krylov/Makefile b/cbind/linsolve/Makefile similarity index 59% rename from cbind/krylov/Makefile rename to cbind/linsolve/Makefile index 041e23d4..c0c64c67 100644 --- a/cbind/krylov/Makefile +++ b/cbind/linsolve/Makefile @@ -8,12 +8,12 @@ HERE=.. FINCLUDES=$(FMFLAG). $(FMFLAG)$(HERE) $(FMFLAG)$(MODDIR) CINCLUDES=-I. -I$(HERE) -I$(INCLUDEDIR) -OBJS=psb_base_krylov_cbind_mod.o \ -psb_skrylov_cbind_mod.o psb_dkrylov_cbind_mod.o psb_ckrylov_cbind_mod.o psb_zkrylov_cbind_mod.o -CMOD=psb_krylov_cbind.h +OBJS=psb_base_linsolve_cbind_mod.o \ +psb_slinsolve_cbind_mod.o psb_dlinsolve_cbind_mod.o psb_clinsolve_cbind_mod.o psb_zlinsolve_cbind_mod.o +CMOD=psb_linsolve_cbind.h -LIBNAME=$(CKRYLOVLIBNAME) +LIBNAME=$(CLINSOLVELIBNAME) objs: $(OBJS) $(CMOD) @@ -23,7 +23,7 @@ lib: objs $(RANLIB) $(HERE)/$(LIBNAME) /bin/cp -p $(HERE)/$(LIBNAME) $(LIBDIR) -psb_skrylov_cbind_mod.o psb_dkrylov_cbind_mod.o psb_ckrylov_cbind_mod.o psb_zkrylov_cbind_mod.o: psb_base_krylov_cbind_mod.o +psb_slinsolve_cbind_mod.o psb_dlinsolve_cbind_mod.o psb_clinsolve_cbind_mod.o psb_zlinsolve_cbind_mod.o: psb_base_linsolve_cbind_mod.o veryclean: clean /bin/rm -f $(HERE)/$(LIBNAME) diff --git a/cbind/krylov/psb_base_krylov_cbind_mod.f90 b/cbind/linsolve/psb_base_linsolve_cbind_mod.f90 similarity index 89% rename from cbind/krylov/psb_base_krylov_cbind_mod.f90 rename to cbind/linsolve/psb_base_linsolve_cbind_mod.f90 index 88ba819b..a00a68bf 100644 --- a/cbind/krylov/psb_base_krylov_cbind_mod.f90 +++ b/cbind/linsolve/psb_base_linsolve_cbind_mod.f90 @@ -1,4 +1,4 @@ -module psb_base_krylov_cbind_mod +module psb_base_linsolve_cbind_mod use iso_c_binding use psb_objhandle_mod @@ -26,4 +26,4 @@ contains end function psb_c_DefaultSolverOptions -end module psb_base_krylov_cbind_mod +end module psb_base_linsolve_cbind_mod diff --git a/cbind/krylov/psb_ckrylov_cbind_mod.f90 b/cbind/linsolve/psb_clinsolve_cbind_mod.f90 similarity index 50% rename from cbind/krylov/psb_ckrylov_cbind_mod.f90 rename to cbind/linsolve/psb_clinsolve_cbind_mod.f90 index 758ecd02..29a0b2fc 100644 --- a/cbind/krylov/psb_ckrylov_cbind_mod.f90 +++ b/cbind/linsolve/psb_clinsolve_cbind_mod.f90 @@ -1,6 +1,6 @@ -module psb_ckrylov_cbind_mod +module psb_clinsolve_cbind_mod - use psb_base_krylov_cbind_mod + use psb_base_linsolve_cbind_mod contains @@ -102,4 +102,97 @@ contains end function psb_c_ckrylov_opt -end module psb_ckrylov_cbind_mod + function psb_c_crichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_cprec) :: ph + type(psb_c_cvector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_crichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_crichardson + + + function psb_c_crichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_cprec) :: ph + type(psb_c_cvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_cspmat_type), pointer :: ap + type(psb_cprec_type), pointer :: precp + type(psb_c_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_spk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_crichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_crichardson_opt + +end module psb_clinsolve_cbind_mod diff --git a/cbind/krylov/psb_dkrylov_cbind_mod.f90 b/cbind/linsolve/psb_dlinsolve_cbind_mod.f90 similarity index 50% rename from cbind/krylov/psb_dkrylov_cbind_mod.f90 rename to cbind/linsolve/psb_dlinsolve_cbind_mod.f90 index b1119067..35612ec3 100644 --- a/cbind/krylov/psb_dkrylov_cbind_mod.f90 +++ b/cbind/linsolve/psb_dlinsolve_cbind_mod.f90 @@ -1,6 +1,6 @@ -module psb_dkrylov_cbind_mod +module psb_dlinsolve_cbind_mod - use psb_base_krylov_cbind_mod + use psb_base_linsolve_cbind_mod contains @@ -102,4 +102,97 @@ contains end function psb_c_dkrylov_opt -end module psb_dkrylov_cbind_mod + function psb_c_drichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_dprec) :: ph + type(psb_c_dvector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_drichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_drichardson + + + function psb_c_drichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_dprec) :: ph + type(psb_c_dvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_dspmat_type), pointer :: ap + type(psb_dprec_type), pointer :: precp + type(psb_d_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_dpk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_drichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_drichardson_opt + +end module psb_dlinsolve_cbind_mod diff --git a/cbind/krylov/psb_krylov_cbind.h b/cbind/linsolve/psb_linsolve_cbind.h similarity index 73% rename from cbind/krylov/psb_krylov_cbind.h rename to cbind/linsolve/psb_linsolve_cbind.h index 4ed45746..6dd7aa3c 100644 --- a/cbind/krylov/psb_krylov_cbind.h +++ b/cbind/linsolve/psb_linsolve_cbind.h @@ -1,5 +1,5 @@ -#ifndef PSB_KRYL_CBIND_ -#define PSB_KRYL_CBIND_ +#ifndef PSB_LINSLV_CBIND_ +#define PSB_LINSLV_CBIND_ #include "psb_base_cbind.h" #include "psb_prec_cbind.h" @@ -42,6 +42,24 @@ int psb_c_zkrylov(const char *method, psb_c_zspmat *ah, psb_c_zprec *ph, psb_c_zvector *bh, psb_c_zvector *xh, psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + + +int psb_c_srichardson(psb_c_sspmat *ah, psb_c_sprec *ph, + psb_c_svector *bh, psb_c_svector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + +int psb_c_drichardson(psb_c_dspmat *ah, psb_c_dprec *ph, + psb_c_dvector *bh, psb_c_dvector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + +int psb_c_crichardson(psb_c_cspmat *ah, psb_c_cprec *ph, + psb_c_cvector *bh, psb_c_cvector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + +int psb_c_zrichardson(psb_c_zspmat *ah, psb_c_zprec *ph, + psb_c_zvector *bh, psb_c_zvector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + #define PSB_VALID_KRYLOV_METHODS_STRINGS "CG","CGS","BICG","BICGSTAB","RGMRES","BICGSTABL","FCG","GCR" #define PSB_VALID_KRYLOV_METHODS_STRING "CG CGS BICG BICGSTAB RGMRES BICGSTABL FCG GCR" diff --git a/cbind/krylov/psb_skrylov_cbind_mod.f90 b/cbind/linsolve/psb_slinsolve_cbind_mod.f90 similarity index 50% rename from cbind/krylov/psb_skrylov_cbind_mod.f90 rename to cbind/linsolve/psb_slinsolve_cbind_mod.f90 index 41bb9506..e1823bd8 100644 --- a/cbind/krylov/psb_skrylov_cbind_mod.f90 +++ b/cbind/linsolve/psb_slinsolve_cbind_mod.f90 @@ -1,6 +1,6 @@ -module psb_skrylov_cbind_mod +module psb_slinsolve_cbind_mod - use psb_base_krylov_cbind_mod + use psb_base_linsolve_cbind_mod contains @@ -102,4 +102,97 @@ contains end function psb_c_skrylov_opt -end module psb_skrylov_cbind_mod + function psb_c_srichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_sspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_sprec) :: ph + type(psb_c_svector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_srichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_srichardson + + + function psb_c_srichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_sspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_sprec) :: ph + type(psb_c_svector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_sspmat_type), pointer :: ap + type(psb_sprec_type), pointer :: precp + type(psb_s_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_spk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_srichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_srichardson_opt + +end module psb_slinsolve_cbind_mod diff --git a/cbind/krylov/psb_zkrylov_cbind_mod.f90 b/cbind/linsolve/psb_zlinsolve_cbind_mod.f90 similarity index 50% rename from cbind/krylov/psb_zkrylov_cbind_mod.f90 rename to cbind/linsolve/psb_zlinsolve_cbind_mod.f90 index 37f24be7..3234c72c 100644 --- a/cbind/krylov/psb_zkrylov_cbind_mod.f90 +++ b/cbind/linsolve/psb_zlinsolve_cbind_mod.f90 @@ -1,6 +1,6 @@ -module psb_zkrylov_cbind_mod +module psb_zlinsolve_cbind_mod - use psb_base_krylov_cbind_mod + use psb_base_linsolve_cbind_mod contains @@ -102,4 +102,97 @@ contains end function psb_c_zkrylov_opt -end module psb_zkrylov_cbind_mod + function psb_c_zrichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_zprec) :: ph + type(psb_c_zvector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_zrichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_zrichardson + + + function psb_c_zrichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + use psb_base_string_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_zprec) :: ph + type(psb_c_zvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_zspmat_type), pointer :: ap + type(psb_zprec_type), pointer :: precp + type(psb_z_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_dpk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_zrichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_zrichardson_opt + +end module psb_zlinsolve_cbind_mod diff --git a/cbind/test/pdegen/pdegen3dc.c b/cbind/test/pdegen/pdegen3dc.c index 2d806180..d9f95b23 100644 --- a/cbind/test/pdegen/pdegen3dc.c +++ b/cbind/test/pdegen/pdegen3dc.c @@ -74,7 +74,7 @@ #include "psb_base_cbind.h" #include "psb_prec_cbind.h" -#include "psb_krylov_cbind.h" +#include "psb_linsolve_cbind.h" #define LINEBUFSIZE 1024 #define NBMAX 20