lammps/lib/atc/NonLinearSolver.h

106 lines
2.2 KiB
C
Raw Normal View History

#ifndef NON_LINEAR_SOLVER_H
#define NON_LINEAR_SOLVER_H
// ATC includes
#include "ATC_TypeDefs.h"
#include "MatrixLibrary.h"
#include "ATC_Error.h"
// other includes
#include <set>
#include <map>
namespace ATC {
/**
* @class TangentOperator
* @brief an adaptor to allow NonLinearSolver to work with a generic function
*/
class TangentOperator {
public:
TangentOperator(){};
virtual ~TangentOperator(){};
virtual void function(const VECTOR & x, DENS_VEC & f) {}; // =0;
virtual void tangent(const VECTOR & x, DENS_VEC & f, MATRIX & dfdx) =0;
//virtual void function(const VECTOR & x, VECTOR & f) {}; // =0;
//virtual void tangent(const VECTOR & x, VECTOR & f, MATRIX & dfdx) {}; // =0;
};
/**
* @class NonLinearSolver
* @brief a class to solve a system of non-linear equations
* f(x) = 0
*/
class NonLinearSolver {
public:
enum NonLinearSolveType {
NEWTON_RAPHSON=0,
};
/** Constructor */
NonLinearSolver(
TangentOperator * f, // provides f and f' at x, pointer for polymorphism
const BC_SET * bcs = NULL,
const int dof = 0,
bool parallel = false
);
/** Destructor */
virtual ~NonLinearSolver() {};
/** residual norm */
double residual_norm(VECTOR & x);
/** solve */
bool solve(VECTOR & x); // incoming: initial guess, outgoing: solution
/** line search */
bool line_search(VECTOR & x);
/** access to current state */
DENS_MAT & tangent() { return A_;}
DENS_VEC & residual() { return r_;}
/** change solver parameters */
void set_max_iterations(const int maxIter) { maxIterations_=maxIter; }
void set_residual_tolerance(const double tol) { tol_=tol;}
void set_solution_tolerance(const double tol) { tolx_=tol;}
protected:
/** function & tangent */
TangentOperator * f_;
DENS_VEC r_;
DENS_MAT A_;
DENS_VEC dx_;
/** equality constraints */
const BC_SET * bcs_;
/** degree of freedom */
int dof_;
/** flavors */
int solverType_;
/** state */
double rNorm0_, rNorm0P_, rNorm_, rNormP_;
/** parameters & tolerances */
double tol_; // tolerance on f
double tolx_; // tolerance on dx
double tol0_; // tolerance on initial f
int maxIterations_;
/** run solve in parallel */
bool parallel_;
};
} // namespace ATC
#endif