diff --git a/packages/nox/src/NOX_Abstract_PrePostOperator.H b/packages/nox/src/NOX_Abstract_PrePostOperator.H index f27e90f6412b..7dae01376b6f 100644 --- a/packages/nox/src/NOX_Abstract_PrePostOperator.H +++ b/packages/nox/src/NOX_Abstract_PrePostOperator.H @@ -127,6 +127,12 @@ public: //! User defined method that will be executed at the end of a call to NOX::Solver::Generic::solve(). virtual void runPostSolve(const NOX::Solver::Generic& solver); + //! User defined method that will be executed before a call to NOX::LineSearch::Generic::compute(). Only to be used in NOX::Solver::LineSearchBased! + virtual void runPreLineSearch(const NOX::Solver::Generic& solver); + + //! User defined method that will be executed after a call to NOX::LineSearch::Generic::compute(). Only to be used in NOX::Solver::LineSearchBased! + virtual void runPostLineSearch(const NOX::Solver::Generic& solver); + }; // class PrePostOperator } // namespace Abstract } // namespace NOX @@ -151,4 +157,14 @@ runPostSolve(const NOX::Solver::Generic& /*solver*/) { return; } +inline void NOX::Abstract::PrePostOperator:: +runPreLineSearch(const NOX::Solver::Generic& /*solver*/) { + return; +} + +inline void NOX::Abstract::PrePostOperator:: +runPostLineSearch(const NOX::Solver::Generic& /*solver*/) { + return; +} + #endif diff --git a/packages/nox/src/NOX_PrePostOperator_Vector.C b/packages/nox/src/NOX_PrePostOperator_Vector.C index a19995fb87ec..57463cf36c5d 100644 --- a/packages/nox/src/NOX_PrePostOperator_Vector.C +++ b/packages/nox/src/NOX_PrePostOperator_Vector.C @@ -72,6 +72,18 @@ void NOX::PrePostOperatorVector::runPostSolve(const NOX::Solver::Generic& solver (*i)->runPostSolve(solver); } +void NOX::PrePostOperatorVector::runPreLineSearch(const NOX::Solver::Generic& solver) +{ + for (it i=ppop_vec_.begin(); i != ppop_vec_.end(); ++i) + (*i)->runPreLineSearch(solver); +} + +void NOX::PrePostOperatorVector::runPostLineSearch(const NOX::Solver::Generic& solver) +{ + for (it i=ppop_vec_.begin(); i != ppop_vec_.end(); ++i) + (*i)->runPostLineSearch(solver); +} + void NOX::PrePostOperatorVector::pushBack(const Teuchos::RCP& ppop) { ppop_vec_.push_back(ppop); diff --git a/packages/nox/src/NOX_PrePostOperator_Vector.H b/packages/nox/src/NOX_PrePostOperator_Vector.H index 821d58e17ee4..7f2e69634527 100644 --- a/packages/nox/src/NOX_PrePostOperator_Vector.H +++ b/packages/nox/src/NOX_PrePostOperator_Vector.H @@ -79,6 +79,10 @@ public: void runPostSolve(const NOX::Solver::Generic& solver); + void runPreLineSearch(const NOX::Solver::Generic& solver); + + void runPostLineSearch(const NOX::Solver::Generic& solver); + //! Add PrePostOperator to end of vector. void pushBack(const Teuchos::RCP& ppop); diff --git a/packages/nox/src/NOX_Solver_LineSearchBased.C b/packages/nox/src/NOX_Solver_LineSearchBased.C index 0b6c237d60d7..437f65b60020 100644 --- a/packages/nox/src/NOX_Solver_LineSearchBased.C +++ b/packages/nox/src/NOX_Solver_LineSearchBased.C @@ -189,7 +189,9 @@ NOX::StatusTest::StatusType NOX::Solver::LineSearchBased::step() *oldSolnPtr = *solnPtr; // Do line search and compute new soln. + prePostOperator.runPreLineSearch(*this); ok = lineSearchPtr->compute(soln, stepSize, *dirPtr, *this); + prePostOperator.runPostLineSearch(*this); if (!ok) { if (stepSize == 0.0) diff --git a/packages/nox/src/NOX_Solver_PrePostOperator.H b/packages/nox/src/NOX_Solver_PrePostOperator.H index 9a2f34023511..a7db0bcb0ae8 100644 --- a/packages/nox/src/NOX_Solver_PrePostOperator.H +++ b/packages/nox/src/NOX_Solver_PrePostOperator.H @@ -126,6 +126,12 @@ public: //! User defined method that will be executed at the end of a call to NOX::Solver::Generic::solve(). virtual void runPostSolve(const NOX::Solver::Generic& solver); + //! User defined method that will be executed before a call to NOX::LineSearch::Generic::compute(). Only to be used in NOX::Solver::LineSearchBased! + virtual void runPreLineSearch(const NOX::Solver::Generic& solver); + + //! User defined method that will be executed after a call to NOX::LineSearch::Generic::compute(). Only to be used in NOX::Solver::LineSearchBased! + virtual void runPostLineSearch(const NOX::Solver::Generic& solver); + protected: //! Flag that determines if a pre/post operator has been supplied by user. @@ -166,4 +172,18 @@ runPostSolve(const NOX::Solver::Generic& solver) prePostOperatorPtr->runPostSolve(solver); } +inline void NOX::Solver::PrePostOperator:: +runPreLineSearch(const NOX::Solver::Generic& solver) +{ + if (havePrePostOperator) + prePostOperatorPtr->runPreLineSearch(solver); +} + +inline void NOX::Solver::PrePostOperator:: +runPostLineSearch(const NOX::Solver::Generic& solver) +{ + if (havePrePostOperator) + prePostOperatorPtr->runPostLineSearch(solver); +} + #endif diff --git a/packages/nox/test/basic/NOX_PrePostOperatorVector.C b/packages/nox/test/basic/NOX_PrePostOperatorVector.C index 0854f114849e..c96bdbc173e2 100644 --- a/packages/nox/test/basic/NOX_PrePostOperatorVector.C +++ b/packages/nox/test/basic/NOX_PrePostOperatorVector.C @@ -61,6 +61,8 @@ namespace NOX_UNIT_TEST { int post_it_count_; int pre_solve_count_; int post_solve_count_; + int pre_linesearch_count_; + int post_linesearch_count_; public: @@ -68,7 +70,9 @@ namespace NOX_UNIT_TEST { pre_it_count_(0), post_it_count_(0), pre_solve_count_(0), - post_solve_count_(0) + post_solve_count_(0), + pre_linesearch_count_(0), + post_linesearch_count_(0) {} void runPreIterate(const NOX::Solver::Generic& solver) @@ -83,6 +87,12 @@ namespace NOX_UNIT_TEST { void runPostSolve(const NOX::Solver::Generic& solver) {post_solve_count_ += 1;} + void runPreLineSearch(const NOX::Solver::Generic& solver) + {pre_linesearch_count_ += 1;} + + void runPostLineSearch(const NOX::Solver::Generic& solver) + {post_linesearch_count_ += 1;} + int preIterateCount() const {return pre_it_count_;} @@ -95,6 +105,12 @@ namespace NOX_UNIT_TEST { int postSolveCount() const {return post_solve_count_;} + int preLineSearchCount() const + {return pre_linesearch_count_;} + + int postLineSearchCount() const + {return post_linesearch_count_;} + }; class MockSolver : public NOX::Solver::Generic { @@ -170,20 +186,39 @@ namespace NOX_UNIT_TEST { ppop_vec.runPostSolve(solver); ppop_vec.runPostSolve(solver); + ppop_vec.runPreLineSearch(solver); + ppop_vec.runPreLineSearch(solver); + ppop_vec.runPreLineSearch(solver); + ppop_vec.runPreLineSearch(solver); + ppop_vec.runPreLineSearch(solver); + + ppop_vec.runPostLineSearch(solver); + ppop_vec.runPostLineSearch(solver); + ppop_vec.runPostLineSearch(solver); + ppop_vec.runPostLineSearch(solver); + ppop_vec.runPostLineSearch(solver); + ppop_vec.runPostLineSearch(solver); + TEST_EQUALITY(mock_ppop_1->preIterateCount(), 1); TEST_EQUALITY(mock_ppop_1->postIterateCount(), 2); TEST_EQUALITY(mock_ppop_1->preSolveCount(), 3); TEST_EQUALITY(mock_ppop_1->postSolveCount(), 4); + TEST_EQUALITY(mock_ppop_1->preLineSearchCount(), 5); + TEST_EQUALITY(mock_ppop_1->postLineSearchCount(), 6); TEST_EQUALITY(mock_ppop_2->preIterateCount(), 1); TEST_EQUALITY(mock_ppop_2->postIterateCount(), 2); TEST_EQUALITY(mock_ppop_2->preSolveCount(), 3); TEST_EQUALITY(mock_ppop_2->postSolveCount(), 4); + TEST_EQUALITY(mock_ppop_2->preLineSearchCount(), 5); + TEST_EQUALITY(mock_ppop_2->postLineSearchCount(), 6); TEST_EQUALITY(mock_ppop_3->preIterateCount(), 0); TEST_EQUALITY(mock_ppop_3->postIterateCount(), 0); TEST_EQUALITY(mock_ppop_3->preSolveCount(), 0); TEST_EQUALITY(mock_ppop_3->postSolveCount(), 0); + TEST_EQUALITY(mock_ppop_3->preLineSearchCount(), 0); + TEST_EQUALITY(mock_ppop_3->postLineSearchCount(), 0); } diff --git a/packages/nox/test/epetra/1Dfem/1Dfem.C b/packages/nox/test/epetra/1Dfem/1Dfem.C index ad601e4a75f5..294241eef88e 100644 --- a/packages/nox/test/epetra/1Dfem/1Dfem.C +++ b/packages/nox/test/epetra/1Dfem/1Dfem.C @@ -343,6 +343,10 @@ int main(int argc, char *argv[]) status = 4; if (ppo2.getNumRunPostSolve() != 1) status = 4; + if (ppo2.getNumRunPreLineSearch() != 10) + status = 4; + if (ppo2.getNumRunPostLineSearch() != 10) + status = 4; } success = status==0; diff --git a/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.C b/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.C index 21e0c07c66b0..5597977af28b 100644 --- a/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.C +++ b/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.C @@ -98,3 +98,19 @@ runPostSolve(const NOX::Solver::Generic& solver) utils.out(NOX::Utils::Details) << "1Dfem's runPostSolve() routine called!" << std::endl; } + +void UserPrePostOperator:: +runPreLineSearch(const NOX::Solver::Generic& solver) +{ + ++numRunPreLineSearch; + utils.out(NOX::Utils::Details) + << "1Dfem's runPreLineSearch() routine called!" << std::endl; +} + +void UserPrePostOperator:: +runPostLineSearch(const NOX::Solver::Generic& solver) +{ + ++numRunPostLineSearch; + utils.out(NOX::Utils::Details) + << "1Dfem's runPostLineSearch() routine called!" << std::endl; +} diff --git a/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.H b/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.H index 5eff2da7844c..2a58ab307aab 100644 --- a/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.H +++ b/packages/nox/test/epetra/1Dfem/1DfemPrePostOperator.H @@ -73,6 +73,10 @@ public: void runPostSolve(const NOX::Solver::Generic& solver); + void runPreLineSearch(const NOX::Solver::Generic& solver); + + void runPostLineSearch(const NOX::Solver::Generic& solver); + int getNumRunPreIterate() const { return numRunPreIterate; }; int getNumRunPostIterate() const { return numRunPostIterate; }; @@ -81,6 +85,10 @@ public: int getNumRunPostSolve() const { return numRunPostSolve; }; + int getNumRunPreLineSearch() const { return numRunPreLineSearch; }; + + int getNumRunPostLineSearch() const { return numRunPostLineSearch; }; + protected: NOX::Utils utils; @@ -89,6 +97,8 @@ protected: int numRunPostIterate; int numRunPreSolve; int numRunPostSolve; + int numRunPreLineSearch; + int numRunPostLineSearch; }; #endif