PlayaIfpackICCOperator.cpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                 Playa: Programmable Linear Algebra
00005 //                 Copyright 2012 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
00041 
00042 #include "PlayaIfpackICCOperator.hpp"
00043 #include "Teuchos_Array.hpp"
00044 #include "PlayaMPIComm.hpp"
00045 #include "PlayaEpetraVector.hpp"
00046 
00047 
00048 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00049 #include "PlayaVectorImpl.hpp"
00050 #include "PlayaLinearOperatorImpl.hpp"
00051 #endif
00052 
00053 namespace Playa
00054 {
00055 
00056   using namespace Teuchos;
00057 
00058   IfpackICCOperator::IfpackICCOperator(const EpetraMatrix* A,
00059                int fillLevels,
00060                int overlapFill,
00061                double dropTol,
00062                double relaxationValue,
00063                double relativeThreshold,
00064                double absoluteThreshold)
00065     : LinearOpWithSpaces<double>(A->domain(), A->range()),
00066       precond_()
00067   {
00068     const Epetra_CrsMatrix* matrix = A->crsMatrix();
00069   
00070     Ifpack_ICT* precond = new Ifpack_ICT(matrix);
00071     precond_ = rcp(precond);
00072 
00073     Teuchos::ParameterList List;
00074   
00075     List.set("fact: ict level-of-fill", (double) fillLevels);
00076     List.set("fact: absolute threshold", absoluteThreshold);
00077     List.set("fact: relative threshold", relativeThreshold);
00078     List.set("fact: relax value", relaxationValue);
00079     List.set("fact: drop tolerance", dropTol);
00080 
00081     int ierr = precond->SetParameters(List);
00082     TEUCHOS_TEST_FOR_EXCEPTION(ierr < 0, std::runtime_error,
00083              "IfpackOperator ctor: "
00084              "precond->SetParameters() failed with ierr="
00085              << ierr);
00086   
00087     ierr = precond->Compute();
00088 
00089     TEUCHOS_TEST_FOR_EXCEPTION(ierr < 0, std::runtime_error,
00090              "IfpackOperator ctor: "
00091              "precond->Compute() failed with ierr="
00092              << ierr);
00093   }
00094   
00095   void IfpackICCOperator::apply(Teuchos::ETransp transApplyType,
00096         const Vector<double>& in,
00097         Vector<double> out) const
00098   {
00099     /* grab the epetra vector objects underlying the input and output vectors */
00100     const Epetra_Vector& epIn = EpetraVector::getConcrete(in);
00101     Epetra_Vector& epOut = EpetraVector::getConcrete(out);
00102 
00103     /* ifpack's solve is logically const but declared non-const because
00104      *  internal data changes. So, do a const_cast. */
00105     Ifpack_ICT* p = const_cast<Ifpack_ICT*>(precond_.get());
00106 
00107     int ierr;
00108 
00109     /* do the solve (or transpose solve) */
00110     if (transApplyType==NO_TRANS)
00111       {
00112   ierr = p->H().Solve(false,false,false, epIn, epOut);
00113       }
00114     else
00115       {
00116   ierr = p->H().Solve(false,true,false, epIn, epOut);
00117       }
00118 
00119     TEUCHOS_TEST_FOR_EXCEPTION(ierr < 0, std::runtime_error,
00120              "Playa::IfpackICCOperator apply: "
00121              "p->H().Solve() (transpose state="
00122              << transApplyType << ") failed with ierr="
00123              << ierr);
00124   }
00125   
00126   void IfpackICCOperator::print(std::ostream& os) const 
00127   {
00128     precond_->Print(os);
00129   }
00130 
00131   string IfpackICCOperator::description() const 
00132   {
00133     std::string rtn = "ICC Preconditioner";
00134     return rtn;
00135   }
00136 
00137 }

Site Contact