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 #ifndef NOX_SOLVER_INEXACTTRUSTREGIONBASED_H
00043 #define NOX_SOLVER_INEXACTTRUSTREGIONBASED_H
00044
00045 #include "NOX_Solver_Generic.H"
00046
00047
00048 #include "Teuchos_ParameterList.hpp"
00049 #include "NOX_Direction_Utils_InexactNewton.H"
00050 #include "NOX_Solver_PrePostOperator.H"
00051 #include "Teuchos_RCP.hpp"
00052
00053
00054 namespace NOX {
00055 class Utils;
00056 class GlobalData;
00057 namespace MeritFunction {
00058 class Generic;
00059 }
00060 namespace Direction {
00061 class Generic;
00062 }
00063 }
00064
00065 namespace NOX {
00066 namespace Solver {
00067
00278 class InexactTrustRegionBased : public Generic {
00279
00280 public:
00281
00287 InexactTrustRegionBased(
00288 const Teuchos::RCP<NOX::Abstract::Group>& grp,
00289 const Teuchos::RCP<NOX::StatusTest::Generic>& tests,
00290 const Teuchos::RCP<Teuchos::ParameterList>& params);
00291
00293 virtual ~InexactTrustRegionBased();
00294
00295 virtual void reset(const NOX::Abstract::Vector& initialGuess,
00296 const Teuchos::RCP<NOX::StatusTest::Generic>& tests);
00297 virtual void reset(const NOX::Abstract::Vector& initialGuess);
00298 virtual NOX::StatusTest::StatusType getStatus();
00299 virtual NOX::StatusTest::StatusType step();
00300 virtual NOX::StatusTest::StatusType solve();
00301 virtual const NOX::Abstract::Group& getSolutionGroup() const;
00302 virtual const NOX::Abstract::Group& getPreviousSolutionGroup() const;
00303 virtual int getNumIterations() const;
00304 virtual const Teuchos::ParameterList& getList() const;
00305
00306 protected:
00307
00309 virtual NOX::StatusTest::StatusType iterateStandard();
00311 virtual NOX::StatusTest::StatusType iterateInexact();
00312
00314 virtual void init();
00315
00317 virtual void printUpdate();
00318
00320 virtual void invalid(const string& param, double value) const;
00321
00323 virtual void throwError(const string& method, const string& mesage) const;
00324
00326 virtual void resetCounters();
00327
00329 NOX::StatusTest::StatusType checkStep(const NOX::Abstract::Vector& step,
00330 double& radius);
00331
00333
00334 virtual double computeNorm(const NOX::Abstract::Vector& v);
00335
00336 protected:
00337
00339 enum TrustRegionType {
00341 Standard,
00343 Inexact
00344 };
00345
00347 TrustRegionType method;
00348
00350 enum InnerIterationReturnType {
00352 Converged,
00354 Unconverged,
00356 Failed
00357 };
00358
00360 Teuchos::RCP<NOX::GlobalData> globalDataPtr;
00361
00363 Teuchos::RCP<NOX::Utils> utils;
00364
00366 InnerIterationReturnType innerIterationStatus;
00367
00369 Teuchos::RCP<NOX::Abstract::Group> solnPtr;
00370
00372 Teuchos::RCP<NOX::Abstract::Group> oldSolnPtr;
00373
00375 Teuchos::RCP<NOX::Abstract::Vector> newtonVecPtr;
00376
00378 Teuchos::RCP<NOX::Abstract::Vector> cauchyVecPtr;
00379
00381 Teuchos::RCP<NOX::Abstract::Vector> rCauchyVecPtr;
00382
00384 Teuchos::RCP<NOX::Abstract::Vector> residualVecPtr;
00385
00387 Teuchos::RCP<NOX::Abstract::Vector> aVecPtr;
00388
00390 Teuchos::RCP<NOX::Abstract::Vector> bVecPtr;
00391
00393 Teuchos::RCP<NOX::StatusTest::Generic> testPtr;
00394
00396 Teuchos::RCP<Teuchos::ParameterList> paramsPtr;
00397
00399 NOX::Direction::Utils::InexactNewton inNewtonUtils;
00400
00402 Teuchos::RCP<NOX::Direction::Generic> newtonPtr;
00403
00405 Teuchos::RCP<NOX::Direction::Generic> cauchyPtr;
00406
00408 double radius;
00409
00411 double minRatio;
00412
00414 double minRadius;
00415
00417 double maxRadius;
00418
00420 double contractTriggerRatio;
00421
00423 double expandTriggerRatio;
00424
00426 double expandFactor;
00427
00429 double contractFactor;
00430
00433 double recoveryStep;
00434
00436 double newF;
00438 double oldF;
00439
00441 double dx;
00442
00444 int nIter;
00445
00447 double eta;
00448
00450 double eta_last;
00451
00453 NOX::StatusTest::StatusType status;
00454
00456 NOX::StatusTest::CheckType checkType;
00457
00459 enum StepType
00460 {
00462 Newton,
00464 Cauchy,
00466 Dogleg
00467 };
00468
00470 StepType stepType;
00471
00473 Teuchos::RCP<NOX::MeritFunction::Generic> meritFuncPtr;
00474
00476 bool useCauchyInNewtonDirection;
00477
00479 bool writeOutputParamsToList;
00480
00482 bool useCounters;
00483
00485 int numCauchySteps;
00486
00488 int numNewtonSteps;
00489
00491 int numDoglegSteps;
00492
00494 int numTrustRegionInnerIterations;
00495
00497 double sumDoglegFracCauchyToNewton;
00498
00500 double sumDoglegFracNewtonLength;
00501
00503 bool useAredPredRatio;
00504
00506 bool useDoglegMinimization;
00507
00509 NOX::Solver::PrePostOperator prePostOperator;
00510
00511 };
00512 }
00513 }
00514
00515 #endif