|
Teko Version of the Day
|
00001 /* 00002 // @HEADER 00003 // 00004 // *********************************************************************** 00005 // 00006 // Teko: A package for block and physics based preconditioning 00007 // Copyright 2010 Sandia Corporation 00008 // 00009 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00010 // the U.S. Government retains certain rights in this software. 00011 // 00012 // Redistribution and use in source and binary forms, with or without 00013 // modification, are permitted provided that the following conditions are 00014 // met: 00015 // 00016 // 1. Redistributions of source code must retain the above copyright 00017 // notice, this list of conditions and the following disclaimer. 00018 // 00019 // 2. Redistributions in binary form must reproduce the above copyright 00020 // notice, this list of conditions and the following disclaimer in the 00021 // documentation and/or other materials provided with the distribution. 00022 // 00023 // 3. Neither the name of the Corporation nor the names of the 00024 // contributors may be used to endorse or promote products derived from 00025 // this software without specific prior written permission. 00026 // 00027 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00028 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00029 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00030 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00031 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00032 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00033 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00034 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00035 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00036 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00037 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00038 // 00039 // Questions? Contact Eric C. Cyr (eccyr@sandia.gov) 00040 // 00041 // *********************************************************************** 00042 // 00043 // @HEADER 00044 00045 */ 00046 00047 #include "Teko_ProbingPreconditionerFactory.hpp" 00048 00049 #ifdef Teko_ENABLE_Isorropia 00050 00051 #include "Teko_EpetraOperatorWrapper.hpp" 00052 00053 #include "Thyra_get_Epetra_Operator.hpp" 00054 #include "Thyra_EpetraLinearOp.hpp" 00055 #include "Epetra_CrsMatrix.h" 00056 #include "Epetra_MpiComm.h" 00057 00058 using Teuchos::rcp; 00059 using Teuchos::rcp_dynamic_cast; 00060 using Teuchos::rcpFromRef; 00061 using Teuchos::RCP; 00062 00063 namespace Teko { 00064 00065 /*****************************************************/ 00066 00067 00068 ProbingPreconditionerFactory::ProbingPreconditionerFactory() 00069 { 00070 prober = rcp(new Isorropia::Epetra::Prober); 00071 } 00072 00073 LinearOp ProbingPreconditionerFactory::buildPreconditionerOperator(LinearOp & lo,PreconditionerState & state) const 00074 { 00075 // make an epetra operator to be probed 00076 RCP<Epetra_Operator> epetraLo = rcp(new Teko::Epetra::EpetraOperatorWrapper(lo)); 00077 00078 // build color scheme 00079 prober->color(); 00080 00081 // probe operator: take me to your leader 00082 RCP<Epetra_CrsMatrix> retOp = prober->probe(*epetraLo); 00083 Teko::LinearOp probedOp = Thyra::epetraLinearOp(retOp); 00084 00085 return Teko::buildInverse(*invFactory_,probedOp); 00086 } 00087 00088 void ProbingPreconditionerFactory::initializeFromParameterList(const Teuchos::ParameterList & pl) 00089 { 00090 RCP<const InverseLibrary> invLib = getInverseLibrary(); 00091 00092 const std::string inverse_type = "Inverse Type"; 00093 const std::string probing_graph_operator = "Probing Graph Operator"; 00094 const std::string probing_graph = "Probing Graph"; 00095 const std::string user_graph = "User Will Set Probing Graph"; 00096 00097 // get string specifying default inverse 00098 std::string invStr ="Amesos"; 00099 if(pl.isParameter(inverse_type)) 00100 invStr = pl.get<std::string>(inverse_type); 00101 00102 if(pl.isParameter(probing_graph_operator)) 00103 setGraphOperator(pl.get<Teko::LinearOp>(probing_graph_operator)); 00104 else if(pl.isParameter(probing_graph)) 00105 setGraph(pl.get<RCP<const Epetra_CrsGraph> >(probing_graph)); 00106 else if(pl.isParameter(user_graph) && pl.get<bool>("User Will Set Probing Graph")){ 00107 //noop 00108 } 00109 else { 00110 Teuchos::RCP<Teko::RequestHandler> rh = getRequestHandler(); 00111 rh->preRequest<RCP<const Epetra_CrsGraph> >(Teko::RequestMesg("Probing Graph")); 00112 setGraph(rh->request<RCP<const Epetra_CrsGraph> >(Teko::RequestMesg("Probing Graph"))); 00113 } 00114 00115 setInverseFactory(invLib->getInverseFactory(invStr)); 00116 } 00117 00118 void ProbingPreconditionerFactory::setGraphOperator(const Teko::LinearOp & graphOp) 00119 { 00120 RCP<const Epetra_CrsMatrix> crsMatrix = rcp_dynamic_cast<const Epetra_CrsMatrix>(Thyra::get_Epetra_Operator(*graphOp)); 00121 setGraph(Teuchos::rcpFromRef(crsMatrix->Graph())); 00122 } 00123 00124 void ProbingPreconditionerFactory::setGraph(const Teuchos::RCP<const Epetra_CrsGraph> & graph) 00125 { 00126 prober->setGraph(graph); 00127 } 00128 00129 void ProbingPreconditionerFactory::setProberList(const Teuchos::ParameterList & list) 00130 { 00131 prober->setList(list); 00132 } 00133 00134 } // end namespace Teko 00135 00136 #endif
1.7.4