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 "LOCA_MultiPredictor_Constant.H"
00043 #include "LOCA_GlobalData.H"
00044 #include "NOX_Utils.H"
00045 #include "LOCA_MultiContinuation_ExtendedVector.H"
00046 #include "LOCA_MultiContinuation_ExtendedMultiVector.H"
00047
00048 LOCA::MultiPredictor::Constant::Constant(
00049 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00050 const Teuchos::RCP<Teuchos::ParameterList>& predParams) :
00051 globalData(global_data),
00052 predictor(),
00053 secant(),
00054 initialized(false)
00055 {
00056 }
00057
00058 LOCA::MultiPredictor::Constant::~Constant()
00059 {
00060 }
00061
00062 LOCA::MultiPredictor::Constant::Constant(
00063 const LOCA::MultiPredictor::Constant& source,
00064 NOX::CopyType type) :
00065 globalData(source.globalData),
00066 predictor(),
00067 secant(),
00068 initialized(source.initialized)
00069 {
00070 if (source.initialized) {
00071 predictor = Teuchos::rcp_dynamic_cast<LOCA::MultiContinuation::ExtendedMultiVector>(source.predictor->clone(type));
00072
00073 secant = Teuchos::rcp_dynamic_cast<LOCA::MultiContinuation::ExtendedVector>(source.secant->clone(type));
00074 }
00075 }
00076
00077 LOCA::MultiPredictor::AbstractStrategy&
00078 LOCA::MultiPredictor::Constant::operator=(
00079 const LOCA::MultiPredictor::AbstractStrategy& s)
00080 {
00081 const LOCA::MultiPredictor::Constant& source =
00082 dynamic_cast<const LOCA::MultiPredictor::Constant&>(s);
00083
00084 if (this != &source) {
00085 globalData = source.globalData;
00086 initialized = source.initialized;
00087
00088 if (source.initialized) {
00089 predictor = Teuchos::rcp_dynamic_cast<LOCA::MultiContinuation::ExtendedMultiVector>(source.predictor->clone(NOX::DeepCopy));
00090
00091 secant = Teuchos::rcp_dynamic_cast<LOCA::MultiContinuation::ExtendedVector>(source.secant->clone(NOX::DeepCopy));
00092 }
00093 }
00094
00095 return *this;
00096 }
00097
00098 Teuchos::RCP<LOCA::MultiPredictor::AbstractStrategy>
00099 LOCA::MultiPredictor::Constant::clone(NOX::CopyType type) const
00100 {
00101 return Teuchos::rcp(new Constant(*this, type));
00102 }
00103
00104 NOX::Abstract::Group::ReturnType
00105 LOCA::MultiPredictor::Constant::compute(
00106 bool baseOnSecant, const vector<double>& stepSize,
00107 LOCA::MultiContinuation::ExtendedGroup& grp,
00108 const LOCA::MultiContinuation::ExtendedVector& prevXVec,
00109 const LOCA::MultiContinuation::ExtendedVector& xVec)
00110 {
00111 if (globalData->locaUtils->isPrintType(NOX::Utils::StepperDetails))
00112 globalData->locaUtils->out() <<
00113 "\n\tCalling Predictor with method: Constant" << std::endl;
00114
00115
00116 int numParams = stepSize.size();
00117
00118 if (!initialized) {
00119
00120
00121 predictor = Teuchos::rcp_dynamic_cast<LOCA::MultiContinuation::ExtendedMultiVector>(xVec.createMultiVector(numParams, NOX::ShapeCopy));
00122
00123
00124 secant = Teuchos::rcp_dynamic_cast<LOCA::MultiContinuation::ExtendedVector>(xVec.clone(NOX::ShapeCopy));
00125
00126 initialized = true;
00127 }
00128
00129 predictor->init(0.0);
00130 for (int i=0; i<numParams; i++)
00131 predictor->getScalar(i,i) = 1.0;
00132
00133
00134 setPredictorOrientation(baseOnSecant, stepSize, grp, prevXVec,
00135 xVec, *secant, *predictor);
00136
00137 return NOX::Abstract::Group::Ok;
00138 }
00139
00140 NOX::Abstract::Group::ReturnType
00141 LOCA::MultiPredictor::Constant::evaluate(
00142 const vector<double>& stepSize,
00143 const LOCA::MultiContinuation::ExtendedVector& xVec,
00144 LOCA::MultiContinuation::ExtendedMultiVector& result) const
00145 {
00146
00147 int numParams = stepSize.size();
00148
00149 for (int i=0; i<numParams; i++)
00150 result[i].update(1.0, xVec, stepSize[i], (*predictor)[i], 0.0);
00151
00152 return NOX::Abstract::Group::Ok;
00153 }
00154
00155 NOX::Abstract::Group::ReturnType
00156 LOCA::MultiPredictor::Constant::computeTangent(
00157 LOCA::MultiContinuation::ExtendedMultiVector& v)
00158 {
00159 v = *predictor;
00160
00161 return NOX::Abstract::Group::Ok;
00162 }
00163
00164 bool
00165 LOCA::MultiPredictor::Constant::isTangentScalable() const
00166 {
00167 return false;
00168 }