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 #include "Teuchos_ParameterList.hpp"
00043 #include "LOCA_GlobalData.H"
00044 #include "LOCA_ErrorCheck.H"
00045
00046 #include "LOCA_AnasaziOperator_Factory.H"
00047 #include "LOCA_AnasaziOperator_AbstractStrategy.H"
00048 #include "LOCA_AnasaziOperator_JacobianInverse.H"
00049 #include "LOCA_AnasaziOperator_ShiftInvert.H"
00050 #include "LOCA_AnasaziOperator_Cayley.H"
00051
00052 LOCA::AnasaziOperator::Factory::Factory(
00053 const Teuchos::RCP<LOCA::GlobalData>& global_data) :
00054 globalData(global_data)
00055 {
00056 }
00057
00058 LOCA::AnasaziOperator::Factory::~Factory()
00059 {
00060 }
00061
00062 Teuchos::RCP<LOCA::AnasaziOperator::AbstractStrategy>
00063 LOCA::AnasaziOperator::Factory::create(
00064 const Teuchos::RCP<LOCA::Parameter::SublistParser>& topParams,
00065 const Teuchos::RCP<Teuchos::ParameterList>& eigenParams,
00066 const Teuchos::RCP<Teuchos::ParameterList>& solverParams,
00067 const Teuchos::RCP<NOX::Abstract::Group>& grp)
00068 {
00069 string methodName = "LOCA::AnasaziOperator::Factory::create()";
00070 Teuchos::RCP<LOCA::AnasaziOperator::AbstractStrategy> strategy;
00071
00072
00073 const string& name = strategyName(*eigenParams);
00074
00075 if (name == "Jacobian Inverse")
00076 strategy =
00077 Teuchos::rcp(new LOCA::AnasaziOperator::JacobianInverse(globalData,
00078 topParams,
00079 eigenParams,
00080 solverParams,
00081 grp));
00082 else if (name == "Shift-Invert") {
00083 Teuchos::RCP<LOCA::TimeDependent::AbstractGroup> tdGrp =
00084 Teuchos::rcp_dynamic_cast<LOCA::TimeDependent::AbstractGroup>(grp);
00085 if (tdGrp == Teuchos::null)
00086 globalData->locaErrorCheck->throwError(
00087 methodName,
00088 std::string("Group argument for Shift-Invert Anasazi operator ") +
00089 std::string("strategy must be a LOCA::TimeDependent::AbstractGroup."));
00090 strategy =
00091 Teuchos::rcp(new LOCA::AnasaziOperator::ShiftInvert(globalData,
00092 topParams,
00093 eigenParams,
00094 solverParams,
00095 tdGrp));
00096 }
00097 else if (name == "Cayley") {
00098 Teuchos::RCP<LOCA::TimeDependent::AbstractGroup> tdGrp =
00099 Teuchos::rcp_dynamic_cast<LOCA::TimeDependent::AbstractGroup>(grp);
00100 if (tdGrp == Teuchos::null)
00101 globalData->locaErrorCheck->throwError(
00102 methodName,
00103 std::string("Group argument for Shift-Invert Anasazi operator ") +
00104 std::string("strategy must be a LOCA::TimeDependent::AbstractGroup."));
00105 strategy =
00106 Teuchos::rcp(new LOCA::AnasaziOperator::Cayley(globalData,
00107 topParams,
00108 eigenParams,
00109 solverParams,
00110 tdGrp));
00111 }
00112 else if (name == "User-Defined") {
00113
00114
00115 string userDefinedName =
00116 eigenParams->get("Operator User-Defined Name", "???");
00117 if ((*eigenParams).INVALID_TEMPLATE_QUALIFIER
00118 isType< Teuchos::RCP<LOCA::AnasaziOperator::AbstractStrategy> >(userDefinedName))
00119 strategy = (*eigenParams).INVALID_TEMPLATE_QUALIFIER
00120 get< Teuchos::RCP<LOCA::AnasaziOperator::AbstractStrategy> >(userDefinedName);
00121 else
00122 globalData->locaErrorCheck->throwError(
00123 methodName,
00124 "Cannot find user-defined strategy: " +
00125 userDefinedName);
00126 }
00127 else
00128 globalData->locaErrorCheck->throwError(
00129 methodName,
00130 "Invalid Anasazi operator strategy: " +
00131 name);
00132
00133 return strategy;
00134 }
00135
00136 const string&
00137 LOCA::AnasaziOperator::Factory::strategyName(
00138 Teuchos::ParameterList& eigenParams) const
00139 {
00140 return eigenParams.get("Operator", "Jacobian Inverse");
00141 }