Skip to content

Commit

Permalink
Merge Pull Request #3448 from rppawlo/Trilinos/nox-observer-refactor
Browse files Browse the repository at this point in the history
Automatically Merged using Trilinos Pull Request AutoTester
PR Title: NOX: observer refactor
PR Author: rppawlo
  • Loading branch information
trilinos-autotester authored Sep 17, 2018
2 parents cc749ea + 5a37c6c commit 1d0e85e
Show file tree
Hide file tree
Showing 30 changed files with 368 additions and 536 deletions.
18 changes: 10 additions & 8 deletions packages/nox/src-epetra/NOX_Epetra_BroydenOperator.C
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
//@HEADER

#include "NOX_Common.H"
#include "NOX_Solver_SolverUtils.H"
#include "NOX_Epetra_BroydenOperator.H"

// EpetraExt includes for dumping Epetra objects
Expand All @@ -72,14 +73,15 @@ BroydenOperator::BroydenOperator(
crsMatrix ( Teuchos::rcp( new Epetra_CrsMatrix(*mat)) ) ,
nlParams ( nlParams_ ) ,
utils ( utils_ ) ,
prePostOperator( utils, nlParams.sublist("Solver Options") ) ,
label ( "NOX::Epetra::BroydenOperator" ) ,
isValidStep ( false ) ,
isValidYield ( false ) ,
isValidBroyden ( false ) ,
entriesRemoved ( mat->NumMyRows(), false )
{
initialize( nlParams, solnVec );
NOX::Solver::validateSolverOptionsSublist(nlParams.sublist("Solver Options"));
observer = NOX::Solver::parseObserver(nlParams.sublist("Solver Options"));
}

//-----------------------------------------------------------------------------
Expand All @@ -98,13 +100,13 @@ BroydenOperator::BroydenOperator(const BroydenOperator & bOp) :
precMatrixPtr ( bOp.precMatrixPtr ) ,
nlParams ( bOp.nlParams ) ,
utils ( bOp.utils ) ,
prePostOperator( utils, nlParams.sublist("Solver Options") ),
label ( "NOX::Epetra::BroydenOperator" ),
isValidStep ( bOp.isValidStep ) ,
isValidYield ( bOp.isValidYield ) ,
isValidBroyden ( bOp.isValidBroyden ) ,
entriesRemoved ( bOp.entriesRemoved )
{
observer = NOX::Solver::parseObserver(nlParams.sublist("Solver Options"));
}

//-----------------------------------------------------------------------------
Expand All @@ -124,9 +126,9 @@ BroydenOperator::initialize( Teuchos::ParameterList & nlParams, const Epetra_Vec

// RPP 9/20/2005: This is a very bad idea! It breaks the rcp and
// user's expectations. For now we will have to create rcp without
// ownership. What happens if a user write their own PPO?
// ownership. What happens if a user write their own observer?
Teuchos::RCP<NOX::Abstract::PrePostOperator> me = Teuchos::rcp(this, false);
nlParams.sublist("Solver Options").set("User Defined Pre/Post Operator", me);
nlParams.sublist("Solver Options").set("Observer", me);

return true;
}
Expand Down Expand Up @@ -395,7 +397,7 @@ BroydenOperator::runPreSolve( const NOX::Solver::Generic & solver)
isValidStep = false;
isValidYield = false;

prePostOperator.runPreSolve( solver );
observer->runPreSolve( solver );

return;
}
Expand All @@ -405,7 +407,7 @@ BroydenOperator::runPreSolve( const NOX::Solver::Generic & solver)
void
BroydenOperator::runPreIterate( const NOX::Solver::Generic & solver)
{
prePostOperator.runPreIterate( solver );
observer->runPreIterate( solver );

return;
}
Expand Down Expand Up @@ -442,7 +444,7 @@ BroydenOperator::runPostIterate( const NOX::Solver::Generic & solver)
// gets called
}

prePostOperator.runPostIterate( solver );
observer->runPostIterate( solver );

return;
}
Expand All @@ -452,7 +454,7 @@ BroydenOperator::runPostIterate( const NOX::Solver::Generic & solver)
void
BroydenOperator::runPostSolve( const NOX::Solver::Generic & solver)
{
prePostOperator.runPostSolve( solver );
observer->runPostSolve( solver );

return;
}
Expand Down
8 changes: 4 additions & 4 deletions packages/nox/src-epetra/NOX_Epetra_BroydenOperator.H
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
#include "NOX_Common.H"
#include "NOX_Epetra.H"
#include "Teuchos_ParameterList.hpp"
#include "NOX_Solver_PrePostOperator.H"
#include "NOX_Observer.hpp"
#include "NOX_Abstract_PrePostOperator.H"

#include "Epetra_Vector.h"
Expand Down Expand Up @@ -105,7 +105,7 @@ namespace Epetra {
*/
class BroydenOperator : public Epetra_RowMatrix,
public NOX::Abstract::PrePostOperator,
public NOX::Observer,
public NOX::Epetra::Interface::Jacobian,
public NOX::Epetra::Interface::Preconditioner
{
Expand Down Expand Up @@ -365,8 +365,8 @@ class BroydenOperator : public Epetra_RowMatrix,
//! Reference to NOX::Utils object
const Teuchos::RCP<NOX::Utils>& utils;

//! Pointer to a user defined NOX::Abstract::PrePostOperator object.
NOX::Solver::PrePostOperator prePostOperator;
//! Pointer to a user defined NOX::Observer object.
Teuchos::RCP<NOX::Observer> observer;

//! label for the Epetra_RowMatrix
std::string label;
Expand Down
22 changes: 12 additions & 10 deletions packages/nox/src-thyra/NOX_Solver_PseudoTransient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
#include "NOX_LineSearch_Factory.H"
#include "NOX_Direction_Generic.H"
#include "NOX_Direction_Factory.H"
#include "NOX_Observer.hpp"
#include "NOX_SolverStats.hpp"
#include <limits>

Expand All @@ -82,7 +83,7 @@ PseudoTransient(const Teuchos::RCP<NOX::Abstract::Group>& xGrp,
NOX::Solver::validateSolverOptionsSublist(p->sublist("Solver Options"));
globalDataPtr = Teuchos::rcp(new NOX::GlobalData(p));
utilsPtr = globalDataPtr->getUtils();
prePostOperator.reset(utilsPtr,p->sublist("Solver Options"));
observer = NOX::Solver::parseObserver(p->sublist("Solver Options"));

this->setMyParamList(p);
thyraSolnGroup = Teuchos::rcp_dynamic_cast<NOX::Thyra::Group>(solnPtr,true);
Expand Down Expand Up @@ -191,7 +192,7 @@ NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::getStatus()

NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::step()
{
prePostOperator.runPreIterate(*this);
observer->runPreIterate(*this);

// On the first step, do some initializations
if (nIter == 0) {
Expand Down Expand Up @@ -227,7 +228,7 @@ NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::step()

// First check status
if (status != NOX::StatusTest::Unconverged) {
prePostOperator.runPostIterate(*this);
observer->runPostIterate(*this);
printUpdate();
return status;
}
Expand Down Expand Up @@ -311,7 +312,7 @@ NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::step()
{
utilsPtr->out() << "NOX::Solver::PseudoTransient::iterate - unable to calculate direction" << std::endl;
status = NOX::StatusTest::Failed;
prePostOperator.runPostIterate(*this);
observer->runPostIterate(*this);
printUpdate();
return status;
}
Expand All @@ -333,15 +334,16 @@ NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::step()
*oldSolnPtr = *solnPtr;

// Do line search and compute new soln.
prePostOperator.runPreSolutionUpdate(*dirPtr,*this);
observer->runPreSolutionUpdate(*dirPtr,*this);
ok = lineSearchPtr->compute(soln, stepSize, *dirPtr, *this);
observer->runPostSolutionUpdate(*this);
if (!ok)
{
if (stepSize == 0.0)
{
utilsPtr->out() << "NOX::Solver::PseudoTransient::iterate - line search failed" << std::endl;
status = NOX::StatusTest::Failed;
prePostOperator.runPostIterate(*this);
observer->runPostIterate(*this);
printUpdate();
return status;
}
Expand All @@ -356,15 +358,15 @@ NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::step()
{
utilsPtr->out() << "NOX::Solver::PseudoTransient::iterate - unable to compute F" << std::endl;
status = NOX::StatusTest::Failed;
prePostOperator.runPostIterate(*this);
observer->runPostIterate(*this);
printUpdate();
return status;
}

// Evaluate the current status.
status = test.checkStatus(*this, checkType);

prePostOperator.runPostIterate(*this);
observer->runPostIterate(*this);

printUpdate();

Expand All @@ -373,7 +375,7 @@ NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::step()

NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::solve()
{
prePostOperator.runPreSolve(*this);
observer->runPreSolve(*this);

// Iterate until converged or failed
while (status == NOX::StatusTest::Unconverged)
Expand All @@ -383,7 +385,7 @@ NOX::StatusTest::StatusType NOX::Solver::PseudoTransient::solve()
outputParams.set("Nonlinear Iterations", nIter);
outputParams.set("2-Norm of Residual", solnPtr->getNormF());

prePostOperator.runPostSolve(*this);
observer->runPostSolve(*this);

return status;
}
Expand Down
9 changes: 3 additions & 6 deletions packages/nox/src-thyra/NOX_Solver_PseudoTransient.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,14 @@

#include "NOX_Solver_Generic.H" // base class
#include "Teuchos_ParameterListAcceptorDefaultBase.hpp" // base class
#include "NOX_Solver_PrePostOperator.H" // class data element
#include "Teuchos_ParameterList.hpp" // class data element
#include "NOX_Utils.H" // class data element
#include "Teuchos_RCP.hpp" // class data element

// Forward declarations
namespace NOX {
class GlobalData;
class Observer;
namespace LineSearch {
class Generic;
}
Expand Down Expand Up @@ -169,11 +169,8 @@ namespace Solver {
//! Type of check to use for status tests. See NOX::StatusTest for more details.
NOX::StatusTest::CheckType checkType;

//! Pointer to a user defined NOX::Abstract::PrePostOperator object.
NOX::Solver::PrePostOperator prePostOperator;



//! Pointer to a user defined NOX::Observer object.
Teuchos::RCP<NOX::Observer> observer;

//! Pointer to solnPtr casted back to a thyra group
Teuchos::RCP<NOX::Thyra::Group> thyraSolnGroup;
Expand Down
3 changes: 1 addition & 2 deletions packages/nox/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ APPEND_SET(HEADERS
NOX_Abstract_Vector.H
NOX_Abstract_MultiVector.H
NOX_Abstract_Group.H
NOX_Observer.hpp
NOX_Abstract_PrePostOperator.H
NOX_Abstract_ImplicitWeighting.H
)
Expand Down Expand Up @@ -124,7 +125,6 @@ APPEND_SET(HEADERS
NOX_Solver_InexactTrustRegionBased.H
NOX_Solver_TensorBased.H
NOX_Solver_AndersonAcceleration.H
NOX_Solver_PrePostOperator.H
NOX_Solver_SingleStep.H
NOX_SolverStats.hpp
)
Expand All @@ -136,7 +136,6 @@ APPEND_SET(SOURCES
NOX_Solver_InexactTrustRegionBased.C
NOX_Solver_TensorBased.C
NOX_Solver_AndersonAcceleration.C
NOX_Solver_PrePostOperator.C
NOX_Solver_SingleStep.C
)

Expand Down
103 changes: 4 additions & 99 deletions packages/nox/src/NOX_Abstract_PrePostOperator.H
Original file line number Diff line number Diff line change
Expand Up @@ -39,114 +39,19 @@
//
// Questions? Contact Roger Pawlowski ([email protected]) or
// Eric Phipps ([email protected]), Sandia National Laboratories.
// ************************************************************************
// CVS Information
// $Source$
// $Author$
// $Date$
// $Revision$
// ************************************************************************
//@HEADER

#ifndef NOX_ABSTRACT_PREPOSTOPERATOR_H
#define NOX_ABSTRACT_PREPOSTOPERATOR_H

#include "NOX_Common.H" // for NOX_Config.h
#include "NOX_Observer.hpp"

// Forward Declarations
// Backwards compatibility for renaming the PrePostOperator to
// Observer.
namespace NOX {
namespace Solver {
class Generic;
}
namespace Abstract {
class Vector;
using PrePostOperator = NOX::Observer;
}
}

namespace NOX {
namespace Abstract {

/** \brief %NOX's pure virtual class to allow users to insert user
defined operations into nox's solvers (before and after the
NOX::Solver::Generic::iterate() and NOX::Solver::Generic::solve()
methods). This is an Observer from GoF design pattern book.
The user should implement their own concrete implementation of this
class and register it as a
Teuchos::RCP<NOX::Abstract::PrePostoperator> in the "Solver
Options" sublist.
To create and register a user defined pre/post operator:
<ol>
<li> Create a pre/post operator that derives from
NOX::Abstract::PrePostOperator. For example, the pre/post operator \c
Foo might be defined as shown below.
\code
class Foo : public NOX::Abstract::PrePostOperator {
// Insert class definition here
}
\endcode
<li> Create the appropriate entries in the parameter list, as follows.
\code
Teuchos::RCP<NOX::Abstract::PrePostOperator> foo = Teuchos::rcp(new Foo);
params.sublist("Solver Options").set("User Defined Pre/Post Operator", foo);
\endcode
</ol>
*/

class PrePostOperator {

public:

//! Constructor
PrePostOperator() {}

//! Copy constructor
PrePostOperator(const NOX::Abstract::PrePostOperator& /*source*/) {}

//! Destructor
virtual ~PrePostOperator() {}

//! User defined method that will be executed at the start of a call to NOX::Solver::Generic::iterate().
virtual void runPreIterate(const NOX::Solver::Generic& solver) {}

//! User defined method that will be executed at the end of a call to NOX::Solver::Generic::iterate().
virtual void runPostIterate(const NOX::Solver::Generic& solver) {}

//! User defined method that will be executed at the start of a call to NOX::Solver::Generic::solve().
virtual void runPreSolve(const NOX::Solver::Generic& solver) {}

//! 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) {}

/** \brief User defined method that will be executed prior to the
update of the solution vector during a call to
NOX::Solver::Generic::step(). This is intended to allow users to
adjust the direction before the solution update, typically based
on knowledge of the problem formulation. The direction is const
as we can't guarantee that changes to the direction won't
violate assumptions of the solution algorithm. Users can change
the update/direciton after a const cast, but NOX may not
function as expected. Use at your own risk!
\param [in] update - the direction vector that will be used to update the solution. This will not
\param [in] solver - the nox solver
*/
virtual void runPreSolutionUpdate(const NOX::Abstract::Vector& update, 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

#endif
Loading

0 comments on commit 1d0e85e

Please sign in to comment.