diff --git a/Make.inc b/Make.inc new file mode 100644 index 00000000..2cc6be90 --- /dev/null +++ b/Make.inc @@ -0,0 +1,37 @@ +########################################################## +# # +# Note: directories external to the MLD2P4 subtree # +# must be specified here with absolute pathnames # +# # +########################################################## +PSBLASDIR=$(HOME)/NUMERICAL/PSBLAS2/psblas2-dev +include $(PSBLASDIR)/Make.inc + +########################################################## +# # +# Additional defines and libraries for multilevel # +# Note that these libraries should be compatible # +# (compiled with) the compilers specified in the # +# PSBLAS main Make.inc # +# # +# # +########################################################## +SLUINCDIR=/usr/local/SuperLU_3.0 +SLULIBDIR=/usr/local/SuperLU_3.0 +SLU=-lslu_lx_gcc42 -L$(SLULIBDIR) +#SLUDistLIBDIR=/usr/local/SLUDist_2.0 +#SLUDistINCDIR=/usr/local/SLUDist_2.0 +#SLUDist=-lslud-gcc42 -L$(SLUDistLIBDIR) -L $(HOME)/LIB +#SLUDISTDEF=-DHave_SLUDist_ -I$(SLUDistINCDIR) +SLUDEF=-DHave_SLU_ -I$(SLUINCDIR) + + +UMFINCDIR=$(HOME)/LIB/Umfpack_gcc41 +UMFLIBDIR=$(HOME)/LIB/Umfpack_gcc41 +UMF=-lumfpack -lamd -L$(UMFLIBDIR) +UMFDEF=-DHave_UMF_ -I$(UMFINCDIR) + +LDLIBS=$(BLACS) $(SLU) $(SLUDist) $(UMF) $(BLAS) $(METIS_LIB) + +# Add -DLargeFptr for 64-bit addresses +CDEFINES=-DAdd_ $(SLUDEF) $(UMFDEF) $(SLUDISTDEF) diff --git a/Makefile b/Makefile index c0a69e7c..e3caf7b8 100644 --- a/Makefile +++ b/Makefile @@ -1,51 +1,18 @@ -PSBLASDIR=../psblas2 - -include $(PSBLASDIR)/Make.inc -LIBDIR=$(PSBLASDIR)/lib -HERE=. -FINCLUDES=$(FMFLAG)$(LIBDIR) $(FMFLAG). - - -MODOBJS=mld_prec_type.o mld_prec_mod.o psb_prec_mod.o -MPFOBJS=mld_daggrmat_raw_asb.o mld_daggrmat_smth_asb.o \ - mld_zaggrmat_raw_asb.o mld_zaggrmat_smth_asb.o -MPCOBJS=mld_slud_impl.o mld_zslud_impl.o -F90OBJS=mld_dasmat_bld.o mld_dslu_bld.o mld_dumf_bld.o mld_dilu_fct.o\ - mld_dmlprec_bld.o mld_dsp_renum.o mld_dbjac_bld.o mld_dilu_bld.o \ - mld_dprecbld.o mld_dprecfree.o mld_dprecset.o mld_dprecinit.o\ - mld_dbaseprec_bld.o mld_ddiagsc_bld.o mld_daggrmap_bld.o \ - mld_dprec_aply.o mld_dmlprec_aply.o mld_dslud_bld.o\ - mld_dbaseprec_aply.o mld_dbjac_aply.o mld_daggrmat_asb.o \ - mld_zasmat_bld.o mld_zslu_bld.o mld_zumf_bld.o mld_zilu_fct.o\ - mld_zmlprec_bld.o mld_zsp_renum.o mld_zbjac_bld.o mld_zilu_bld.o \ - mld_zprecbld.o mld_zprecfree.o mld_zprecset.o mld_zprecinit.o \ - mld_zbaseprec_bld.o mld_zdiagsc_bld.o mld_zaggrmap_bld.o \ - mld_zprec_aply.o mld_zmlprec_aply.o mld_zslud_bld.o\ - mld_zbaseprec_aply.o mld_zbjac_aply.o mld_zaggrmat_asb.o\ - $(MPFOBJS) -COBJS=mld_slu_impl.o mld_umf_impl.o mld_zslu_impl.o mld_zumf_impl.o -OBJS=$(F90OBJS) $(COBJS) $(MPFOBJS) $(MPCOBJS) $(MODOBJS) - -LIBMOD=psb_prec_mod$(.mod) -LOCAL_MODS=$(LIBMOD) mld_prec_type$(.mod) mld_prec_mod$(.mod) -LIBNAME=$(PRECLIBNAME) - -lib: mpobjs $(OBJS) - $(AR) $(HERE)/$(LIBNAME) $(OBJS) - $(RANLIB) $(HERE)/$(LIBNAME) - /bin/cp -p $(HERE)/$(LIBNAME) $(LIBDIR) - /bin/cp -p $(LIBMOD) $(LOCAL_MODS) $(LIBDIR) - -$(F90OBJS) $(MPFOBJS): $(MODOBJS) -psb_prec_mod.o: mld_prec_mod.o -mld_prec_mod.o: mld_prec_type.o - -mpobjs: - (make $(MPFOBJS) F90="$(MPF90)" F90COPT="$(F90COPT)") - (make $(MPCOBJS) CC="$(MPCC)" CCOPT="$(CCOPT)") - -veryclean: clean - /bin/rm -f $(LIBNAME) +include Make.inc + +lib: mlp kryl + +mlp: + (cd mlprec; make lib) +kryl: + (cd krylov; make symlink) + (cd krylov; make lib) +veryclean: + (cd mlprec; make veryclean) + (cd krylov; make veryclean) + /bin/rm -f $(OBJS) $(LOCAL_MODS) clean: + (cd mlprec; make clean) + (cd krylov; make clean) /bin/rm -f $(OBJS) $(LOCAL_MODS) diff --git a/README b/README index 375d2564..3d74061e 100644 --- a/README +++ b/README @@ -7,13 +7,13 @@ Daniela di Serafino To compile: -0. Unpack the tar file in a directory of your choice; it can be inside - the main PSBLAS directory, or somewhere else. -1. Edit Makefile and point PSBLASDIR to the main PSBLAS directory -2. Edit PSBLASDIR/Makefile modifying the PREC variable to make it - point to this directory, e.g. - PREC=./mld2p4 -3. Run make from the main PSBLAS directory. +0. Unpack the tar file in a directory of your choice (preferrably + outside the main PSBLAS directory). +1. Edit Make.inc and point PSBLASDIR to the main PSBLAS directory; + this must be an ABSOLUTE pathname +2. Uncomment the variable definition for SLU, SLUDist, UMFPACK as + desired, and fix the installation directory/library names. Again, + directories must be ABSOLUTE pathnames. diff --git a/krylov/Makefile b/krylov/Makefile new file mode 100644 index 00000000..6d2d5ad2 --- /dev/null +++ b/krylov/Makefile @@ -0,0 +1,49 @@ +include ../Make.inc +LIBDIR=../lib +PSBLIBDIR=$(PSBLASDIR)/lib +HERE=. +# +# Don't you dare touch the include order here! +# The method source file are symlinked, so as not to duplicate +# code, and the symlinks are recompiled using the local version +# of psb_prec_mod, so that they are tricked into using the +# MLD preconditioners while believing to be using the PSB ones. +# +FINCLUDES=$(FMFLAG). $(FMFLAG)$(LIBDIR) $(FMFLAG)$(PSBLIBDIR) +PSBKRYLDIR=$(PSBLASDIR)/krylov + +METHDOBJS=psb_dcgstab.o psb_dcg.o psb_dcgs.o \ + psb_dbicg.o psb_dcgstabl.o psb_dgmresr.o\ + psb_zcgstab.o psb_zcgs.o psb_zgmresr.o + +LIBMOD=psb_krylov_mod$(.mod) +MODOBJS=$(LIBMOD:$(.mod)=.o) +LOCAL_MODS=psb_prec_mod$(.mod) +LOCAL_OBJS=$(LOCAL_MODS:$(.mod)=.o) +OBJS=$(METHDOBJS) $(MODOBJS) +LIBNAME=libmld_krylov.a + +lib: $(OBJS) + $(AR) $(HERE)/$(LIBNAME) $(OBJS) + $(RANLIB) $(HERE)/$(LIBNAME) + /bin/cp -p $(HERE)/$(LIBNAME) $(LIBDIR) + /bin/cp -p $(LIBMOD) $(LIBDIR) + +$(METHDOBJS): psb_prec_mod.o + +symlink: + (/bin/ln -fs $(PSBKRYLDIR)/*.f90 . ) + (/bin/ln -fs $(PSBKRYLDIR)/*.F90 . ) + +mld_krylov_mod.o: mld_krylov_mod.f90 $(LIBDIR)/mld_prec_mod$(.mod) + $(F90) $(F90COPT) $(FINCLUDES) -c $< +psb_krylov_mod.o: psb_krylov_mod.f90 $(LIBDIR)/mld_prec_mod$(.mod) + $(F90) $(F90COPT) $(FINCLUDES) -c $< + + +veryclean: clean + (sh ./cleansymlinks *f90 *F90) + /bin/rm -f $(LIBNAME) + +clean: + /bin/rm -f $(OBJS) $(LOCAL_MODS) $(LIBMOD) $(LOCAL_OBJS) diff --git a/krylov/cleansymlinks b/krylov/cleansymlinks new file mode 100644 index 00000000..a5f3c96c --- /dev/null +++ b/krylov/cleansymlinks @@ -0,0 +1,9 @@ +#!/bin/sh + +for file in $* +do +if [ -L $file ] +then +/bin/rm -f $file +fi +done diff --git a/krylov/mld_krylov_mod.f90 b/krylov/mld_krylov_mod.f90 new file mode 100644 index 00000000..03acc3ff --- /dev/null +++ b/krylov/mld_krylov_mod.f90 @@ -0,0 +1,354 @@ +!!$ +!!$ Parallel Sparse BLAS v2.0 +!!$ (C) Copyright 2006 Salvatore Filippone University of Rome Tor Vergata +!!$ Alfredo Buttari University of Rome Tor Vergata +!!$ +!!$ Redistribution and use in source and binary forms, with or without +!!$ modification, are permitted provided that the following conditions +!!$ are met: +!!$ 1. Redistributions of source code must retain the above copyright +!!$ notice, this list of conditions and the following disclaimer. +!!$ 2. Redistributions in binary form must reproduce the above copyright +!!$ notice, this list of conditions, and the following disclaimer in the +!!$ documentation and/or other materials provided with the distribution. +!!$ 3. The name of the PSBLAS group or the names of its contributors may +!!$ not be used to endorse or promote products derived from this +!!$ software without specific written permission. +!!$ +!!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +!!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +!!$ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +!!$ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +!!$ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +!!$ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +!!$ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +!!$ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +!!$ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +!!$ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +!!$ POSSIBILITY OF SUCH DAMAGE. +!!$ +!!$ +! +! This is a partial duplication of material already present in the Krylov +! part of the PSBLAS subtree. This is not as bad as it sounds, since +! 1. There is no actual computation here, these are just wrappers around +! the actual methods, so very little code is necessary; +! 2. Changing the wrappers enables issuing error messages with a subroutine +! name coherent with what the user sees; +! 3. At the very least we would need a layer renaming the PSBLAS krylov interfaces, +! so we are doing approx. the same amount of (re)coding. +! +Module mld_krylov_mod + + + interface mld_krylov + module procedure mld_dkrylov, mld_zkrylov + end interface + + interface psb_cg + subroutine psb_dcg(a,prec,b,x,eps,& + & desc_a,info,itmax,iter,err,itrace,istop) + use psb_base_mod + use psb_prec_mod + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(kind(1.d0)), intent(in) :: b(:) + real(kind(1.d0)), intent(inout) :: x(:) + real(kind(1.d0)), intent(in) :: eps + type(psb_dprec_type), intent(in) :: prec + integer, intent(out) :: info + integer, optional, intent(in) :: itmax, itrace,istop + integer, optional, intent(out) :: iter + real(kind(1.d0)), optional, intent(out) :: err + end subroutine psb_dcg + end interface + + interface psb_bicg + subroutine psb_dbicg(a,prec,b,x,eps,& + & desc_a,info,itmax,iter,err,itrace,istop) + use psb_base_mod + use psb_prec_mod + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(kind(1.d0)), intent(in) :: b(:) + real(kind(1.d0)), intent(inout) :: x(:) + real(kind(1.d0)), intent(in) :: eps + type(psb_dprec_type), intent(in) :: prec + integer, intent(out) :: info + integer, optional, intent(in) :: itmax, itrace,istop + integer, optional, intent(out) :: iter + real(kind(1.d0)), optional, intent(out) :: err + end subroutine psb_dbicg + end interface + + interface psb_bicgstab + subroutine psb_dcgstab(a,prec,b,x,eps,& + & desc_a,info,itmax,iter,err,itrace,istop) + use psb_base_mod + use psb_prec_mod + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(kind(1.d0)), intent(in) :: b(:) + real(kind(1.d0)), intent(inout) :: x(:) + real(kind(1.d0)), intent(in) :: eps + type(psb_dprec_type), intent(in) :: prec + integer, intent(out) :: info + integer, optional, intent(in) :: itmax, itrace,istop + integer, optional, intent(out) :: iter + real(kind(1.d0)), optional, intent(out) :: err + end subroutine psb_dcgstab + subroutine psb_zcgstab(a,prec,b,x,eps,& + & desc_a,info,itmax,iter,err,itrace,istop) + use psb_base_mod + use psb_prec_mod + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + complex(kind(1.d0)), intent(in) :: b(:) + complex(kind(1.d0)), intent(inout) :: x(:) + real(kind(1.d0)), intent(in) :: eps + type(psb_zprec_type), intent(in) :: prec + integer, intent(out) :: info + integer, optional, intent(in) :: itmax, itrace,istop + integer, optional, intent(out) :: iter + real(kind(1.d0)), optional, intent(out) :: err + end subroutine psb_zcgstab + end interface + + interface psb_bicgstabl + Subroutine psb_dcgstabl(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err, itrace,irst,istop) + use psb_base_mod + use psb_prec_mod + Type(psb_dspmat_type), Intent(in) :: a + Type(psb_desc_type), Intent(in) :: desc_a + type(psb_dprec_type), intent(in) :: prec + Real(Kind(1.d0)), Intent(in) :: b(:) + Real(Kind(1.d0)), Intent(inout) :: x(:) + Real(Kind(1.d0)), Intent(in) :: eps + integer, intent(out) :: info + Integer, Optional, Intent(in) :: itmax, itrace, irst,istop + Integer, Optional, Intent(out) :: iter + Real(Kind(1.d0)), Optional, Intent(out) :: err + end subroutine psb_dcgstabl + end interface + + interface psb_rgmres + Subroutine psb_dgmresr(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,irst,istop) + use psb_base_mod + use psb_prec_mod + Type(psb_dspmat_type), Intent(in) :: a + Type(psb_desc_type), Intent(in) :: desc_a + type(psb_dprec_type), intent(in) :: prec + Real(Kind(1.d0)), Intent(in) :: b(:) + Real(Kind(1.d0)), Intent(inout) :: x(:) + Real(Kind(1.d0)), Intent(in) :: eps + integer, intent(out) :: info + Integer, Optional, Intent(in) :: itmax, itrace, irst,istop + Integer, Optional, Intent(out) :: iter + Real(Kind(1.d0)), Optional, Intent(out) :: err + end subroutine psb_dgmresr + Subroutine psb_zgmresr(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,irst,istop) + use psb_base_mod + use psb_prec_mod + Type(psb_zspmat_type), Intent(in) :: a + Type(psb_desc_type), Intent(in) :: desc_a + type(psb_zprec_type), intent(in) :: prec + complex(Kind(1.d0)), Intent(in) :: b(:) + complex(Kind(1.d0)), Intent(inout) :: x(:) + Real(Kind(1.d0)), Intent(in) :: eps + integer, intent(out) :: info + Integer, Optional, Intent(in) :: itmax, itrace, irst,istop + Integer, Optional, Intent(out) :: iter + Real(Kind(1.d0)), Optional, Intent(out) :: err + end subroutine psb_zgmresr + end interface + + interface psb_cgs + subroutine psb_dcgs(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) + use psb_base_mod + use psb_prec_mod + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + type(psb_dprec_type), intent(in) :: prec + real(kind(1.d0)), intent(in) :: b(:) + real(kind(1.d0)), intent(inout) :: x(:) + real(kind(1.d0)), intent(in) :: eps + integer, intent(out) :: info + integer, optional, intent(in) :: itmax, itrace,istop + integer, optional, intent(out) :: iter + real(kind(1.d0)), optional, intent(out) :: err + end subroutine psb_dcgs + subroutine psb_zcgs(a,prec,b,x,eps,& + & desc_a,info,itmax,iter,err,itrace,istop) + use psb_base_mod + use psb_prec_mod + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + complex(kind(1.d0)), intent(in) :: b(:) + complex(kind(1.d0)), intent(inout) :: x(:) + real(kind(1.d0)), intent(in) :: eps + type(psb_zprec_type), intent(in) :: prec + integer, intent(out) :: info + integer, optional, intent(in) :: itmax, itrace,istop + integer, optional, intent(out) :: iter + real(kind(1.d0)), optional, intent(out) :: err + end subroutine psb_zcgs + end interface + +contains + + + Subroutine mld_dkrylov(method,a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,irst,istop) + + use psb_base_mod + use psb_prec_mod + + character(len=*) :: method + Type(psb_dspmat_type), Intent(in) :: a + Type(psb_desc_type), Intent(in) :: desc_a + type(psb_dprec_type), intent(in) :: prec + Real(Kind(1.d0)), Intent(in) :: b(:) + Real(Kind(1.d0)), Intent(inout) :: x(:) + Real(Kind(1.d0)), Intent(in) :: eps + integer, intent(out) :: info + Integer, Optional, Intent(in) :: itmax, itrace, irst,istop + Integer, Optional, Intent(out) :: iter + Real(Kind(1.d0)), Optional, Intent(out) :: err + + integer :: ictxt,me,np,err_act + character(len=20) :: name + + info = 0 + name = 'mld_krylov' + call psb_erractionsave(err_act) + + ictxt=psb_cd_get_context(desc_a) + + call psb_info(ictxt, me, np) + + select case(toupper(method)) + case('CG') + call psb_cg(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) + case('CGS') + call psb_cgs(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) + case('BICG') + call psb_bicg(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) + case('BICGSTAB') + call psb_bicgstab(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) + case('RGMRES') + call psb_rgmres(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,irst,istop) + case('BICGSTABL') + call psb_bicgstabl(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,irst,istop) + case default + if (me==0) write(0,*) 'Warning: Unknown method ',method,& + & ' in ',name,' defaulting to BiCGSTAB' + call psb_bicgstab(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) + end select + + if(info/=0) then + call psb_errpush(info,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return + +9999 continue + call psb_erractionrestore(err_act) + if (err_act.eq.psb_act_abort_) then + call psb_error(ictxt) + return + end if + + end subroutine mld_dkrylov + + + Subroutine mld_zkrylov(method,a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,irst,istop) + use psb_base_mod + use psb_prec_mod + character(len=*) :: method + Type(psb_zspmat_type), Intent(in) :: a + Type(psb_desc_type), Intent(in) :: desc_a + type(psb_zprec_type), intent(in) :: prec + complex(Kind(1.d0)), Intent(in) :: b(:) + complex(Kind(1.d0)), Intent(inout) :: x(:) + Real(Kind(1.d0)), Intent(in) :: eps + integer, intent(out) :: info + Integer, Optional, Intent(in) :: itmax, itrace, irst,istop + Integer, Optional, Intent(out) :: iter + Real(Kind(1.d0)), Optional, Intent(out) :: err + + integer :: ictxt,me,np,err_act + character(len=20) :: name + + info = 0 + name = 'mld_krylov' + call psb_erractionsave(err_act) + + + ictxt=psb_cd_get_context(desc_a) + + call psb_info(ictxt, me, np) + + + select case(toupper(method)) +!!$ case('CG') +!!$ call psb_cg(a,prec,b,x,eps,desc_a,info,& +!!$ &itmax,iter,err,itrace,istop) + case('CGS') + call psb_cgs(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) +!!$ case('BICG') +!!$ call psb_bicg(a,prec,b,x,eps,desc_a,info,& +!!$ &itmax,iter,err,itrace,istop) + case('BICGSTAB') + call psb_bicgstab(a,prec,b,x,eps,desc_a,info,& + & itmax,iter,err,itrace,istop) + case('RGMRES') + call psb_rgmres(a,prec,b,x,eps,desc_a,info,& + & itmax,iter,err,itrace,irst,istop) +!!$ case('BICGSTABL') +!!$ call psb_bicgstabl(a,prec,b,x,eps,desc_a,info,& +!!$ &itmax,iter,err,itrace,irst,istop) + case default + if (me==0) write(0,*) 'Warning: Unknown method ',method,& + & ' in ',name,' defaulting to BiCGSTAB' + call psb_bicgstab(a,prec,b,x,eps,desc_a,info,& + &itmax,iter,err,itrace,istop) + end select + + if(info/=0) then + call psb_errpush(info,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return + +9999 continue + call psb_erractionrestore(err_act) + if (err_act.eq.psb_act_abort_) then + call psb_error(ictxt) + return + end if + + end subroutine mld_zkrylov + + + +end module mld_krylov_mod + + + diff --git a/psb_prec_mod.F90 b/krylov/psb_prec_mod.F90 similarity index 89% rename from psb_prec_mod.F90 rename to krylov/psb_prec_mod.F90 index 2713bb91..a6590fcd 100644 --- a/psb_prec_mod.F90 +++ b/krylov/psb_prec_mod.F90 @@ -34,6 +34,15 @@ !!$ POSSIBILITY OF SUCH DAMAGE. !!$ !!$ +! +! This version of the preconditioner module PSB_PREC_MODE renames +! "on the fly" the MLD preconditioner routines and data types so that +! the Krylov iterations in PSBLAS can be tricked into using the MLD versions +! instead of the original ones. Since there is no native runtime polymorphism +! this implies a recompilation, but thanks to the renaming feature of +! Fortran 95 (and to the compatibility of the calling sequences) there is +! no need to change the source code for the Krylov methods. +! module psb_prec_mod #if (__GNUC__==4) && (__GNUC_MINOR__<=2) diff --git a/mlprec/Makefile b/mlprec/Makefile new file mode 100644 index 00000000..5bbf59f2 --- /dev/null +++ b/mlprec/Makefile @@ -0,0 +1,51 @@ +include ../Make.inc +LIBDIR=../lib +PSBLIBDIR=$(PSBLASDIR)/lib +HERE=. + +FINCLUDES=$(FMFLAG). $(FMFLAG)$(LIBDIR) $(FMFLAG)$(PSBLIBDIR) + + +MODOBJS=mld_prec_type.o mld_prec_mod.o +MPFOBJS=mld_daggrmat_raw_asb.o mld_daggrmat_smth_asb.o \ + mld_zaggrmat_raw_asb.o mld_zaggrmat_smth_asb.o +MPCOBJS=mld_slud_impl.o mld_zslud_impl.o +F90OBJS=mld_dasmat_bld.o mld_dslu_bld.o mld_dumf_bld.o mld_dilu_fct.o\ + mld_dmlprec_bld.o mld_dsp_renum.o mld_dbjac_bld.o mld_dilu_bld.o \ + mld_dprecbld.o mld_dprecfree.o mld_dprecset.o mld_dprecinit.o\ + mld_dbaseprec_bld.o mld_ddiagsc_bld.o mld_daggrmap_bld.o \ + mld_dprec_aply.o mld_dmlprec_aply.o mld_dslud_bld.o\ + mld_dbaseprec_aply.o mld_dbjac_aply.o mld_daggrmat_asb.o \ + mld_zasmat_bld.o mld_zslu_bld.o mld_zumf_bld.o mld_zilu_fct.o\ + mld_zmlprec_bld.o mld_zsp_renum.o mld_zbjac_bld.o mld_zilu_bld.o \ + mld_zprecbld.o mld_zprecfree.o mld_zprecset.o mld_zprecinit.o \ + mld_zbaseprec_bld.o mld_zdiagsc_bld.o mld_zaggrmap_bld.o \ + mld_zprec_aply.o mld_zmlprec_aply.o mld_zslud_bld.o\ + mld_zbaseprec_aply.o mld_zbjac_aply.o mld_zaggrmat_asb.o\ + $(MPFOBJS) +COBJS=mld_slu_impl.o mld_umf_impl.o mld_zslu_impl.o mld_zumf_impl.o +OBJS=$(F90OBJS) $(COBJS) $(MPFOBJS) $(MPCOBJS) $(MODOBJS) + +LIBMOD=mld_prec_mod$(.mod) +LOCAL_MODS=$(LIBMOD) mld_prec_type$(.mod) +LIBNAME=libmld_prec.a + +lib: mpobjs $(OBJS) + $(AR) $(HERE)/$(LIBNAME) $(OBJS) + $(RANLIB) $(HERE)/$(LIBNAME) + /bin/cp -p $(HERE)/$(LIBNAME) $(LIBDIR) + /bin/cp -p $(LIBMOD) $(LOCAL_MODS) $(LIBDIR) + +$(F90OBJS) $(MPFOBJS): $(MODOBJS) +psb_prec_mod.o: mld_prec_mod.o +mld_prec_mod.o: mld_prec_type.o + +mpobjs: + (make $(MPFOBJS) F90="$(MPF90)" F90COPT="$(F90COPT)") + (make $(MPCOBJS) CC="$(MPCC)" CCOPT="$(CCOPT)") + +veryclean: clean + /bin/rm -f $(LIBNAME) + +clean: + /bin/rm -f $(OBJS) $(LOCAL_MODS) diff --git a/mld_daggrmap_bld.f90 b/mlprec/mld_daggrmap_bld.f90 similarity index 100% rename from mld_daggrmap_bld.f90 rename to mlprec/mld_daggrmap_bld.f90 diff --git a/mld_daggrmat_asb.f90 b/mlprec/mld_daggrmat_asb.f90 similarity index 100% rename from mld_daggrmat_asb.f90 rename to mlprec/mld_daggrmat_asb.f90 diff --git a/mld_daggrmat_raw_asb.F90 b/mlprec/mld_daggrmat_raw_asb.F90 similarity index 100% rename from mld_daggrmat_raw_asb.F90 rename to mlprec/mld_daggrmat_raw_asb.F90 diff --git a/mld_daggrmat_smth_asb.F90 b/mlprec/mld_daggrmat_smth_asb.F90 similarity index 100% rename from mld_daggrmat_smth_asb.F90 rename to mlprec/mld_daggrmat_smth_asb.F90 diff --git a/mld_dasmat_bld.f90 b/mlprec/mld_dasmat_bld.f90 similarity index 100% rename from mld_dasmat_bld.f90 rename to mlprec/mld_dasmat_bld.f90 diff --git a/mld_dbaseprec_aply.f90 b/mlprec/mld_dbaseprec_aply.f90 similarity index 100% rename from mld_dbaseprec_aply.f90 rename to mlprec/mld_dbaseprec_aply.f90 diff --git a/mld_dbaseprec_bld.f90 b/mlprec/mld_dbaseprec_bld.f90 similarity index 100% rename from mld_dbaseprec_bld.f90 rename to mlprec/mld_dbaseprec_bld.f90 diff --git a/mld_dbjac_aply.f90 b/mlprec/mld_dbjac_aply.f90 similarity index 100% rename from mld_dbjac_aply.f90 rename to mlprec/mld_dbjac_aply.f90 diff --git a/mld_dbjac_bld.f90 b/mlprec/mld_dbjac_bld.f90 similarity index 100% rename from mld_dbjac_bld.f90 rename to mlprec/mld_dbjac_bld.f90 diff --git a/mld_ddiagsc_bld.f90 b/mlprec/mld_ddiagsc_bld.f90 similarity index 100% rename from mld_ddiagsc_bld.f90 rename to mlprec/mld_ddiagsc_bld.f90 diff --git a/mld_dilu_bld.f90 b/mlprec/mld_dilu_bld.f90 similarity index 100% rename from mld_dilu_bld.f90 rename to mlprec/mld_dilu_bld.f90 diff --git a/mld_dilu_fct.f90 b/mlprec/mld_dilu_fct.f90 similarity index 100% rename from mld_dilu_fct.f90 rename to mlprec/mld_dilu_fct.f90 diff --git a/mld_dmlprec_aply.f90 b/mlprec/mld_dmlprec_aply.f90 similarity index 100% rename from mld_dmlprec_aply.f90 rename to mlprec/mld_dmlprec_aply.f90 diff --git a/mld_dmlprec_bld.f90 b/mlprec/mld_dmlprec_bld.f90 similarity index 100% rename from mld_dmlprec_bld.f90 rename to mlprec/mld_dmlprec_bld.f90 diff --git a/mld_dprec_aply.f90 b/mlprec/mld_dprec_aply.f90 similarity index 100% rename from mld_dprec_aply.f90 rename to mlprec/mld_dprec_aply.f90 diff --git a/mld_dprecbld.f90 b/mlprec/mld_dprecbld.f90 similarity index 100% rename from mld_dprecbld.f90 rename to mlprec/mld_dprecbld.f90 diff --git a/mld_dprecfree.f90 b/mlprec/mld_dprecfree.f90 similarity index 100% rename from mld_dprecfree.f90 rename to mlprec/mld_dprecfree.f90 diff --git a/mld_dprecinit.f90 b/mlprec/mld_dprecinit.f90 similarity index 100% rename from mld_dprecinit.f90 rename to mlprec/mld_dprecinit.f90 diff --git a/mld_dprecset.f90 b/mlprec/mld_dprecset.f90 similarity index 100% rename from mld_dprecset.f90 rename to mlprec/mld_dprecset.f90 diff --git a/mld_dslu_bld.f90 b/mlprec/mld_dslu_bld.f90 similarity index 100% rename from mld_dslu_bld.f90 rename to mlprec/mld_dslu_bld.f90 diff --git a/mld_dslud_bld.f90 b/mlprec/mld_dslud_bld.f90 similarity index 100% rename from mld_dslud_bld.f90 rename to mlprec/mld_dslud_bld.f90 diff --git a/mld_dsp_renum.f90 b/mlprec/mld_dsp_renum.f90 similarity index 100% rename from mld_dsp_renum.f90 rename to mlprec/mld_dsp_renum.f90 diff --git a/mld_dumf_bld.f90 b/mlprec/mld_dumf_bld.f90 similarity index 100% rename from mld_dumf_bld.f90 rename to mlprec/mld_dumf_bld.f90 diff --git a/mld_prec_mod.f90 b/mlprec/mld_prec_mod.f90 similarity index 100% rename from mld_prec_mod.f90 rename to mlprec/mld_prec_mod.f90 diff --git a/mld_prec_type.f90 b/mlprec/mld_prec_type.f90 similarity index 100% rename from mld_prec_type.f90 rename to mlprec/mld_prec_type.f90 diff --git a/mld_slu_impl.c b/mlprec/mld_slu_impl.c similarity index 100% rename from mld_slu_impl.c rename to mlprec/mld_slu_impl.c diff --git a/mld_slud_impl.c b/mlprec/mld_slud_impl.c similarity index 100% rename from mld_slud_impl.c rename to mlprec/mld_slud_impl.c diff --git a/mld_umf_impl.c b/mlprec/mld_umf_impl.c similarity index 100% rename from mld_umf_impl.c rename to mlprec/mld_umf_impl.c diff --git a/mld_zaggrmap_bld.f90 b/mlprec/mld_zaggrmap_bld.f90 similarity index 100% rename from mld_zaggrmap_bld.f90 rename to mlprec/mld_zaggrmap_bld.f90 diff --git a/mld_zaggrmat_asb.f90 b/mlprec/mld_zaggrmat_asb.f90 similarity index 100% rename from mld_zaggrmat_asb.f90 rename to mlprec/mld_zaggrmat_asb.f90 diff --git a/mld_zaggrmat_raw_asb.F90 b/mlprec/mld_zaggrmat_raw_asb.F90 similarity index 100% rename from mld_zaggrmat_raw_asb.F90 rename to mlprec/mld_zaggrmat_raw_asb.F90 diff --git a/mld_zaggrmat_smth_asb.F90 b/mlprec/mld_zaggrmat_smth_asb.F90 similarity index 100% rename from mld_zaggrmat_smth_asb.F90 rename to mlprec/mld_zaggrmat_smth_asb.F90 diff --git a/mld_zasmat_bld.f90 b/mlprec/mld_zasmat_bld.f90 similarity index 100% rename from mld_zasmat_bld.f90 rename to mlprec/mld_zasmat_bld.f90 diff --git a/mld_zbaseprec_aply.f90 b/mlprec/mld_zbaseprec_aply.f90 similarity index 100% rename from mld_zbaseprec_aply.f90 rename to mlprec/mld_zbaseprec_aply.f90 diff --git a/mld_zbaseprec_bld.f90 b/mlprec/mld_zbaseprec_bld.f90 similarity index 100% rename from mld_zbaseprec_bld.f90 rename to mlprec/mld_zbaseprec_bld.f90 diff --git a/mld_zbjac_aply.f90 b/mlprec/mld_zbjac_aply.f90 similarity index 100% rename from mld_zbjac_aply.f90 rename to mlprec/mld_zbjac_aply.f90 diff --git a/mld_zbjac_bld.f90 b/mlprec/mld_zbjac_bld.f90 similarity index 100% rename from mld_zbjac_bld.f90 rename to mlprec/mld_zbjac_bld.f90 diff --git a/mld_zdiagsc_bld.f90 b/mlprec/mld_zdiagsc_bld.f90 similarity index 100% rename from mld_zdiagsc_bld.f90 rename to mlprec/mld_zdiagsc_bld.f90 diff --git a/mld_zilu_bld.f90 b/mlprec/mld_zilu_bld.f90 similarity index 100% rename from mld_zilu_bld.f90 rename to mlprec/mld_zilu_bld.f90 diff --git a/mld_zilu_fct.f90 b/mlprec/mld_zilu_fct.f90 similarity index 100% rename from mld_zilu_fct.f90 rename to mlprec/mld_zilu_fct.f90 diff --git a/mld_zmlprec_aply.f90 b/mlprec/mld_zmlprec_aply.f90 similarity index 100% rename from mld_zmlprec_aply.f90 rename to mlprec/mld_zmlprec_aply.f90 diff --git a/mld_zmlprec_bld.f90 b/mlprec/mld_zmlprec_bld.f90 similarity index 100% rename from mld_zmlprec_bld.f90 rename to mlprec/mld_zmlprec_bld.f90 diff --git a/mld_zprec_aply.f90 b/mlprec/mld_zprec_aply.f90 similarity index 100% rename from mld_zprec_aply.f90 rename to mlprec/mld_zprec_aply.f90 diff --git a/mld_zprecbld.f90 b/mlprec/mld_zprecbld.f90 similarity index 100% rename from mld_zprecbld.f90 rename to mlprec/mld_zprecbld.f90 diff --git a/mld_zprecfree.f90 b/mlprec/mld_zprecfree.f90 similarity index 100% rename from mld_zprecfree.f90 rename to mlprec/mld_zprecfree.f90 diff --git a/mld_zprecinit.f90 b/mlprec/mld_zprecinit.f90 similarity index 100% rename from mld_zprecinit.f90 rename to mlprec/mld_zprecinit.f90 diff --git a/mld_zprecset.f90 b/mlprec/mld_zprecset.f90 similarity index 100% rename from mld_zprecset.f90 rename to mlprec/mld_zprecset.f90 diff --git a/mld_zslu_bld.f90 b/mlprec/mld_zslu_bld.f90 similarity index 100% rename from mld_zslu_bld.f90 rename to mlprec/mld_zslu_bld.f90 diff --git a/mld_zslu_impl.c b/mlprec/mld_zslu_impl.c similarity index 100% rename from mld_zslu_impl.c rename to mlprec/mld_zslu_impl.c diff --git a/mld_zslud_bld.f90 b/mlprec/mld_zslud_bld.f90 similarity index 100% rename from mld_zslud_bld.f90 rename to mlprec/mld_zslud_bld.f90 diff --git a/mld_zslud_impl.c b/mlprec/mld_zslud_impl.c similarity index 100% rename from mld_zslud_impl.c rename to mlprec/mld_zslud_impl.c diff --git a/mld_zsp_renum.f90 b/mlprec/mld_zsp_renum.f90 similarity index 100% rename from mld_zsp_renum.f90 rename to mlprec/mld_zsp_renum.f90 diff --git a/mld_zumf_bld.f90 b/mlprec/mld_zumf_bld.f90 similarity index 100% rename from mld_zumf_bld.f90 rename to mlprec/mld_zumf_bld.f90 diff --git a/mld_zumf_impl.c b/mlprec/mld_zumf_impl.c similarity index 100% rename from mld_zumf_impl.c rename to mlprec/mld_zumf_impl.c