2 #ifndef DUNE_FEM_NEWTONINVERSEOPERATOR_HH 3 #define DUNE_FEM_NEWTONINVERSEOPERATOR_HH 36 : baseParam_( baseParameter.clone() ),
37 keyPrefix_( keyPrefix ),
42 : baseParam_( baseParameter.clone() ),
43 keyPrefix_(
"fem.solver.newton." ),
48 : baseParam_( nullptr ),
49 keyPrefix_(
"fem.solver.newton." ),
54 : baseParam_( nullptr ),
55 keyPrefix_( keyPrefix ),
63 return parameter_.
getValue<
double >( keyPrefix_ +
"tolerance", 1e-6 );
68 return parameter_.
getValue<
double >(keyPrefix_ +
"linabstol", tolerance / 8 );
73 return parameter_.
getValue<
double >( keyPrefix_ +
"linreduction", tolerance / 8 );
78 const bool v = baseParam_? baseParam_->verbose() :
false;
79 return parameter_.
getValue<
bool >(keyPrefix_ +
"verbose", v );
84 const bool v = baseParam_? baseParam_->verbose() :
false;
85 return parameter_.
getValue<
bool >( keyPrefix_ +
"linear.verbose", v );
115 template<
class JacobianOperator,
class LInvOp >
117 :
public Operator< typename JacobianOperator::RangeFunctionType, typename JacobianOperator::DomainFunctionType >
148 parameters_( parameter.clone() ),
160 parameters_( new ParametersType(
parameter ) ),
178 parameters_( parameter.clone() ),
179 tolerance_( epsilon ),
191 parameters_( new ParametersType(
parameter ) ),
192 tolerance_( epsilon ),
201 virtual void operator() (
const DomainFunctionType &u, RangeFunctionType &w )
const;
210 return finite && (iterations_ < maxIterations_) && (linearIterations_ < maxLinearIterations_);
215 template<
class ... Args>
216 JacobianOperatorType&
jacobian ( Args && ... args )
const 219 jOp_.reset(
new JacobianOperatorType( std::forward< Args >( args ) ... ) );
224 const OperatorType &op_;
227 const double tolerance_, linAbsTol_, linReduction_;
229 const bool linVerbose_;
230 const int maxIterations_;
231 const int maxLinearIterations_;
233 mutable DomainFieldType delta_;
234 mutable int iterations_;
235 mutable int linearIterations_;
236 mutable std::unique_ptr< JacobianOperatorType > jOp_;
244 template<
class JacobianOperator,
class LInvOp >
246 ::operator() (
const DomainFunctionType &u, RangeFunctionType &w )
const 248 DomainFunctionType residual( u );
249 RangeFunctionType dw( w );
250 JacobianOperatorType& jOp = jacobian(
"jacobianOperator", dw.space(), u.space() );
255 delta_ =
std::sqrt( residual.scalarProductDofs( residual ) );
257 for( iterations_ = 0, linearIterations_ = 0; converged() && (delta_ > tolerance_); ++iterations_ )
260 std::cerr <<
"Newton iteration " << iterations_ <<
": |residual| = " << delta_ << std::endl;
263 op_.jacobian( w, jOp );
268 const int remLinearIts = maxLinearIterations_ - linearIterations_;
269 const LinearInverseOperatorType jInv( jOp, linReduction_, linAbsTol_, remLinearIts, linVerbose_, parameters_->parameter() );
272 jInv( residual, dw );
273 linearIterations_ += jInv.iterations();
278 delta_ =
std::sqrt( residual.scalarProductDofs( residual ) );
281 std::cerr <<
"Newton iteration " << iterations_ <<
": |residual| = " << delta_ << std::endl;
288 #endif // #ifndef DUNE_FEM_NEWTONINVERSEOPERATOR_HH NewtonInverseOperator(const OperatorType &op, const DomainFieldType &epsilon, const ParameterReader ¶meter=Parameter::container())
Definition: newtoninverseoperator.hh:188
RangeFunction RangeFunctionType
type of discrete function in the operator's range
Definition: operator.hh:30
static double sqrt(const Double &v)
Definition: double.hh:870
ParameterReader parameter_
Definition: newtoninverseoperator.hh:32
virtual int maxLinearIterationsParameter() const
Definition: newtoninverseoperator.hh:93
JacobianOperatorType & jacobian(Args &&...args) const
Definition: newtoninverseoperator.hh:216
Definition: newtoninverseoperator.hh:23
int linearIterations() const
Definition: newtoninverseoperator.hh:204
static constexpr T max(T a)
Definition: utility.hh:65
virtual double linReductionParameter(const double &tolerance) const
Definition: newtoninverseoperator.hh:71
BaseType::RangeFunctionType RangeFunctionType
Definition: newtoninverseoperator.hh:133
virtual double linAbsTolParameter(const double &tolerance) const
Definition: newtoninverseoperator.hh:66
inverse operator based on a newton scheme
Definition: newtoninverseoperator.hh:116
BaseType::DomainFieldType DomainFieldType
Definition: newtoninverseoperator.hh:135
std::shared_ptr< SolverParameter > baseParam_
Definition: newtoninverseoperator.hh:28
const ParameterReader & parameter() const
Definition: newtoninverseoperator.hh:59
abstract operator
Definition: operator.hh:25
LInvOp LinearInverseOperatorType
type of linear inverse operator
Definition: newtoninverseoperator.hh:130
JacobianOperator JacobianOperatorType
type of operator's Jacobian
Definition: newtoninverseoperator.hh:124
Definition: io/parameter.hh:549
Definition: coordinate.hh:4
int iterations() const
Definition: newtoninverseoperator.hh:203
Definition: mpimanager.hh:19
virtual bool newtonVerbose() const
Definition: newtoninverseoperator.hh:76
BaseType::DomainFunctionType DomainFunctionType
Definition: newtoninverseoperator.hh:132
const std::string keyPrefix_
Definition: newtoninverseoperator.hh:30
NewtonInverseOperator(const OperatorType &op, const ParameterReader ¶meter=Parameter::container())
Definition: newtoninverseoperator.hh:158
virtual double toleranceParameter() const
Definition: newtoninverseoperator.hh:61
static ParameterContainer & container()
Definition: io/parameter.hh:190
NewtonParameter(const SolverParameter &baseParameter, const std::string keyPrefix, const ParameterReader ¶meter=Parameter::container())
Definition: newtoninverseoperator.hh:35
virtual void operator()(const DomainFunctionType &u, RangeFunctionType &w) const
Definition: newtoninverseoperator.hh:246
DomainFunction::RangeFieldType DomainFieldType
field type of the operator's domain
Definition: operator.hh:33
virtual bool linearSolverVerbose() const
Definition: newtoninverseoperator.hh:82
NewtonParameter(const ParameterReader ¶meter=Parameter::container())
Definition: newtoninverseoperator.hh:47
NewtonParameter ParametersType
Definition: newtoninverseoperator.hh:137
abstract differentiable operator
Definition: differentiableoperator.hh:26
T getValue(const std::string &key) const
get mandatory parameter
Definition: reader.hh:149
NewtonParameter(const SolverParameter &baseParameter, const ParameterReader ¶meter=Parameter::container())
Definition: newtoninverseoperator.hh:41
NewtonParameter(const std::string keyPrefix, const ParameterReader ¶meter=Parameter::container())
Definition: newtoninverseoperator.hh:53
Definition: solver/parameter.hh:14
NewtonInverseOperator(const OperatorType &op, const NewtonParameter ¶meter)
Definition: newtoninverseoperator.hh:146
bool converged() const
Definition: newtoninverseoperator.hh:206
virtual int maxIterationsParameter() const
Definition: newtoninverseoperator.hh:88
DifferentiableOperator< JacobianOperatorType > OperatorType
type of operator to invert
Definition: newtoninverseoperator.hh:127
NewtonInverseOperator(const OperatorType &op, const DomainFieldType &epsilon, const NewtonParameter ¶meter)
Definition: newtoninverseoperator.hh:175
DomainFunction DomainFunctionType
type of discrete function in the operator's domain
Definition: operator.hh:28