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