$extrastylesheet
preconditioner.C
Go to the documentation of this file.
00001 // The libMesh Finite Element Library.
00002 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
00003 
00004 // This library is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Lesser General Public
00006 // License as published by the Free Software Foundation; either
00007 // version 2.1 of the License, or (at your option) any later version.
00008 
00009 // This library is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // Lesser General Public License for more details.
00013 
00014 // You should have received a copy of the GNU Lesser General Public
00015 // License along with this library; if not, write to the Free Software
00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 
00018 
00019 
00020 // C++ includes
00021 
00022 // Local Includes
00023 #include "libmesh/auto_ptr.h"
00024 #include "libmesh/preconditioner.h"
00025 #include "libmesh/eigen_preconditioner.h"
00026 #include "libmesh/petsc_preconditioner.h"
00027 #include "libmesh/trilinos_preconditioner.h"
00028 
00029 
00030 
00031 namespace libMesh
00032 {
00033 
00034 //------------------------------------------------------------------
00035 // Preconditioner members
00036 template <typename T>
00037 Preconditioner<T> *
00038 Preconditioner<T>::build(const libMesh::Parallel::Communicator &comm,
00039                          const SolverPackage solver_package)
00040 {
00041   // Build the appropriate solver
00042   switch (solver_package)
00043     {
00044 
00045 #ifdef LIBMESH_HAVE_PETSC
00046     case PETSC_SOLVERS:
00047       {
00048         return new PetscPreconditioner<T>(comm);
00049       }
00050 #endif
00051 
00052 #ifdef LIBMESH_HAVE_TRILINOS
00053     case TRILINOS_SOLVERS:
00054       return new TrilinosPreconditioner<T>(comm);
00055 #endif
00056 
00057 #ifdef LIBMESH_HAVE_EIGEN
00058     case EIGEN_SOLVERS:
00059       return new EigenPreconditioner<T>(comm);
00060 #endif
00061 
00062     default:
00063       libmesh_error_msg("ERROR:  Unrecognized solver package: " << solver_package);
00064     }
00065 
00066   return NULL;
00067 }
00068 
00069 
00070 
00071 //------------------------------------------------------------------
00072 // Explicit instantiations
00073 template class Preconditioner<Number>;
00074 
00075 } // namespace libMesh