00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include "Teko_AddPreconditionerFactory.hpp"
00048
00049 namespace Teko {
00050
00051 using Teuchos::RCP;
00052
00053 AddPreconditionerFactory::AddPreconditionerFactory(
00054 const RCP<const BlockPreconditionerFactory> & FirstFactory,
00055 const RCP<const BlockPreconditionerFactory> & SecondFactory)
00056 : FirstFactory_(FirstFactory), SecondFactory_(SecondFactory)
00057 {}
00058
00059 AddPreconditionerFactory::AddPreconditionerFactory()
00060 {}
00061
00063 RCP<PreconditionerState> AddPreconditionerFactory::buildPreconditionerState() const
00064 {
00065 AddPrecondState* mystate = new AddPrecondState();
00066 mystate->StateOne_ = Teuchos::rcp_dynamic_cast<BlockPreconditionerState>(FirstFactory_->buildPreconditionerState());
00067 mystate->StateTwo_ = Teuchos::rcp_dynamic_cast<BlockPreconditionerState>(SecondFactory_->buildPreconditionerState());
00068 return rcp(mystate);
00069 }
00070
00071
00072 LinearOp AddPreconditionerFactory
00073 ::buildPreconditionerOperator(BlockedLinearOp & blockOp,
00074 BlockPreconditionerState & state) const
00075 {
00076
00077
00078
00079
00080
00081 AddPrecondState *MyState = dynamic_cast<AddPrecondState *> (&state);
00082 TEUCHOS_ASSERT(MyState != 0);
00083
00084 LinearOp M1 = FirstFactory_->buildPreconditionerOperator(blockOp, *MyState->StateOne_);
00085 LinearOp M2 = SecondFactory_->buildPreconditionerOperator(blockOp, *MyState->StateTwo_);
00086
00087 LinearOp invA = add(M1, M2);
00088
00089
00090 return invA;
00091 }
00092
00094 void AddPreconditionerFactory::initializeFromParameterList(const Teuchos::ParameterList & pl)
00095 {
00096 RCP<const InverseLibrary> invLib = getInverseLibrary();
00097
00098
00099 std::string aStr="", bStr="";
00100
00101
00102 aStr = pl.get<std::string>("Preconditioner A");
00103 bStr = pl.get<std::string>("Preconditioner B");
00104
00105 RCP<const Teuchos::ParameterList> aSettings = invLib->getParameterList(aStr);
00106 RCP<const Teuchos::ParameterList> bSettings = invLib->getParameterList(bStr);
00107
00108
00109 std::string aType = aSettings->get<std::string>("Preconditioner Type");
00110 RCP<Teko::PreconditionerFactory> precA
00111 = Teko::PreconditionerFactory::buildPreconditionerFactory(aType,aSettings->sublist("Preconditioner Settings"),invLib);
00112
00113
00114 std::string bType = bSettings->get<std::string>("Preconditioner Type");
00115 RCP<Teko::PreconditionerFactory> precB
00116 = Teko::PreconditionerFactory::buildPreconditionerFactory(bType,bSettings->sublist("Preconditioner Settings"),invLib);
00117
00118
00119 FirstFactory_ = Teuchos::rcp_dynamic_cast<const Teko::BlockPreconditionerFactory>(precA);
00120 SecondFactory_ = Teuchos::rcp_dynamic_cast<const Teko::BlockPreconditionerFactory>(precB);
00121 }
00122
00123 }