Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_SolveSupportTypes.hpp
1// @HEADER
2// *****************************************************************************
3// Thyra: Interfaces and Support for Abstract Numerical Algorithms
4//
5// Copyright 2004 NTESS and the Thyra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef THYRA_SOLVE_SUPPORT_TYPES_HPP
11#define THYRA_SOLVE_SUPPORT_TYPES_HPP
12
13#include "Thyra_OperatorVectorTypes.hpp"
14#include "Teuchos_ParameterList.hpp"
15#include "Teuchos_FancyOStream.hpp"
16#include "Teuchos_Describable.hpp"
17
18
19namespace Thyra {
20
21
40
41
46inline
47const std::string toString(const ESolveMeasureNormType solveMeasureNormType)
48{
49 switch(solveMeasureNormType) {
51 return "SOLVE_MEASURE_ONE";
53 return "SOLVE_MEASURE_NORM_RESIDUAL";
55 return "SOLVE_MEASURE_NORM_SOLUTION";
57 return "SOLVE_MEASURE_NORM_INIT_RESIDUAL";
59 return "SOLVE_MEASURE_NORM_RHS";
60 default:
62 }
64}
65
66
91 :numerator(_numerator),denominator(_denominator)
92 {}
94 void set(ESolveMeasureNormType _numerator, ESolveMeasureNormType _denominator)
95 { numerator = _numerator; denominator = _denominator; }
103 ESolveMeasureNormType denominator_in
104 ) const
105 { return ( numerator==numerator_in && denominator==denominator_in ); }
107 bool contains(ESolveMeasureNormType measure) const
108 { return ( numerator==measure || denominator==measure ); }
109};
110
111
116inline
117std::ostream& operator<<(std::ostream &out, const SolveMeasureType &solveMeasureType)
118{
119 out << "("<<toString(solveMeasureType.numerator)
120 << "/"<<toString(solveMeasureType.denominator)<<")";
121 return out;
122}
123
124
128template<class Scalar>
130public:
131
134
144 reduce( const VectorBase<Scalar> &v ) const
145 {
146#ifdef THYRA_DEBUG
148 "Error, the vector v="<<v.description()<<" is not compatiable with"
149 " *this="<<this->description()<<"!");
150#endif
151 return reduceImpl(v);
152 }
153
157 bool isCompatible( const VectorBase<Scalar> &v ) const
158 { return isCompatibleImpl(v); }
159
161
162protected:
163
166
169 reduceImpl( const VectorBase<Scalar> &v ) const = 0;
170
172 virtual bool isCompatibleImpl( const VectorBase<Scalar> &v ) const = 0;
173
175
176};
177
178
279template <class Scalar>
284 static ScalarMag unspecifiedTolerance() { return ScalarMag(-1.0); }
309 SolveMeasureType solveMeasureType_in,
310 ScalarMag requestedTol_in,
311 const RCP<ParameterList> &extraParameters_in = Teuchos::null,
312 const RCP<ReductionFunctional<Scalar> > &numeratorReductionFunc_in = Teuchos::null,
313 const RCP<ReductionFunctional<Scalar> > &denominatorReductionFunc_in = Teuchos::null
314 )
315 : solveMeasureType(solveMeasureType_in),
316 requestedTol(requestedTol_in),
317 extraParameters(extraParameters_in),
318 numeratorReductionFunc(numeratorReductionFunc_in),
319 denominatorReductionFunc(denominatorReductionFunc_in)
320 {}
321};
322
323
328template<class Scalar>
329std::ostream& operator<<(std::ostream &out, const SolveCriteria<Scalar> &solveCriteria)
330{
331 out << typeName(solveCriteria) << "{";
332 out << "solveMeasureType="<<solveCriteria.solveMeasureType;
333 out << ", requestedTol="<<solveCriteria.requestedTol;
334 if (nonnull(solveCriteria.extraParameters)) {
335 out << ", extraParameters="<<solveCriteria.extraParameters;
336 }
337 if (nonnull(solveCriteria.numeratorReductionFunc)) {
338 out << ", numeratorReductionFunc="<<solveCriteria.numeratorReductionFunc->description();
339 }
340 if (nonnull(solveCriteria.denominatorReductionFunc)) {
341 out << ", denominatorReductionFunc="<<solveCriteria.denominatorReductionFunc->description();
342 }
343 out << "}";
344 return out;
345}
346
347
352class CatastrophicSolveFailure : public std::runtime_error
353{public: CatastrophicSolveFailure(const std::string& what_arg) : std::runtime_error(what_arg) {}};
354
355
365
366
371inline
372const std::string toString(const ESolveStatus solveStatus)
373{
374 switch(solveStatus) {
375 case SOLVE_STATUS_CONVERGED: return "SOLVE_STATUS_CONVERGED";
376 case SOLVE_STATUS_UNCONVERGED: return "SOLVE_STATUS_UNCONVERGED";
377 case SOLVE_STATUS_UNKNOWN: return "SOLVE_STATUS_UNKNOWN";
378 default: TEUCHOS_TEST_FOR_EXCEPT(true);
379 }
381}
382
383
390template <class Scalar>
395 static ScalarMag unknownTolerance() { return ScalarMag(-1); }
403 std::string message;
413 static std::string achievedTolToString( const ScalarMag &achievedTol )
414 {
415 if(achievedTol==unknownTolerance()) return "unknownTolerance()";
416 std::ostringstream oss; oss << achievedTol; return oss.str();
417 }
418};
419
420
425template <class Scalar>
426std::ostream& operator<<( std::ostream& out_arg, const SolveStatus<Scalar> &solveStatus )
427{
429 out = Teuchos::getFancyOStream(Teuchos::rcp(&out_arg,false));
430 Teuchos::OSTab tab(out);
431 *out
432 << "solveStatus = " << toString(solveStatus.solveStatus) << std::endl
433 << "achievedTol = " << SolveStatus<Scalar>::achievedTolToString(solveStatus.achievedTol) << std::endl;
434 *out << "message:";
435 if (solveStatus.message.length()) {
436 Teuchos::OSTab tab2(out);
437 *out << "\n" << solveStatus.message << "\n";
438 }
439 *out << "extraParameters:";
440 if(solveStatus.extraParameters.get()) {
441 *out << "\n";
442 Teuchos::OSTab tab3(out);
443 solveStatus.extraParameters->print(*out, 10, true);
444 }
445 else {
446 *out << " NONE\n";
447 }
448 return out_arg;
449}
450
451
463
464
473
474
479template <class Scalar>
481 const Ptr<SolveStatus<Scalar> > &overallSolveStatus
482 )
483{
484 overallSolveStatus->solveStatus = SOLVE_STATUS_CONVERGED;
485}
486
487
504template <class Scalar>
506 const SolveCriteria<Scalar>, // ToDo: Never used, need to take this out!
507 const SolveStatus<Scalar> &solveStatus,
508 const Ptr<SolveStatus<Scalar> > &overallSolveStatus
509 )
510{
511 switch(solveStatus.solveStatus) {
513 {
514 // First, if we see any unconverged solve status, then the entire block is
515 // unconverged!
516 overallSolveStatus->solveStatus = SOLVE_STATUS_UNCONVERGED;
517 overallSolveStatus->message = solveStatus.message;
518 overallSolveStatus->extraParameters = solveStatus.extraParameters;
519 break;
520 }
522 {
523 // Next, if any solve status is unknown, then if the overall solve
524 // status says converged, then we have to mark it as unknown. Note that
525 // unknown could mean that the system is actually converged!
526 switch(overallSolveStatus->solveStatus) {
528 overallSolveStatus->solveStatus = SOLVE_STATUS_UNKNOWN;
529 break;
532 // If we get here then the overall solve status is either unknown
533 // already or says unconverged and this will not change here!
534 overallSolveStatus->message = solveStatus.message;
535 overallSolveStatus->extraParameters = solveStatus.extraParameters;
536 break;
537 default:
538 TEUCHOS_TEST_FOR_EXCEPT(true); // Corrupted enum?
539 }
540 break;
541 }
543 {
544 // If we get here then the overall solve status is either unknown,
545 // unconverged, or converged and this will not change here!
546 if(overallSolveStatus->message == "")
547 overallSolveStatus->message = solveStatus.message;
548 break;
549 }
550 default:
551 TEUCHOS_TEST_FOR_EXCEPT(true); // Corrupted enum?
552 }
553 // Update the achieved tolerence to the maximum returned
554 if( solveStatus.achievedTol > overallSolveStatus->achievedTol ) {
555 overallSolveStatus->achievedTol = solveStatus.achievedTol;
556 }
557 // Set a message if none is set
558 if(overallSolveStatus->message == "")
559 overallSolveStatus->message = solveStatus.message;
560 // Set the extra parameters if none is set
561 if(overallSolveStatus->extraParameters.get()==NULL)
562 overallSolveStatus->extraParameters = solveStatus.extraParameters;
563}
564
565
566} // namespace Thyra
567
568
569#endif // THYRA_SOLVE_SUPPORT_TYPES_HPP
virtual std::string description() const
Exception type thrown on an catastrophic solve failure.
Thrown if vector spaces are incompatible.
A general reduction functional to be used in specialized solve convergence criteria.
virtual bool isCompatibleImpl(const VectorBase< Scalar > &v) const =0
ScalarTraits< Scalar >::magnitudeType reduce(const VectorBase< Scalar > &v) const
Compute the reduction over a vector.
bool isCompatible(const VectorBase< Scalar > &v) const
Returns true if v is compatible with *this.
virtual ScalarTraits< Scalar >::magnitudeType reduceImpl(const VectorBase< Scalar > &v) const =0
Abstract interface for finite-dimensional dense vectors.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
EPreconditionerInputType
Enum defining the status of a preconditioner object.
ESupportSolveUse
Enum that specifies how a LinearOpWithSolveBase object will be used for solves after it is constructe...
ESolveStatus
Solution status.
ESolveMeasureNormType
Type of solve measure norm.
@ PRECONDITIONER_INPUT_TYPE_AS_MATRIX
The input preconditioner should viewed as a matrix to be factored then backsolved as a preconditioner...
@ PRECONDITIONER_INPUT_TYPE_AS_OPERATOR
The input preconditioner should just be applied as an operator.
@ SUPPORT_SOLVE_FORWARD_ONLY
The output LOWSB object will only be used for forward solves.
@ SUPPORT_SOLVE_FORWARD_AND_TRANSPOSE
The output LOWSB object will used for forward and transpose solves.
@ SUPPORT_SOLVE_UNSPECIFIED
How the output LOWSB object will be useded for solves in unspecified.
@ SUPPORT_SOLVE_TRANSPOSE_ONLY
The output LOWSB object will only be used for transpose solves.
@ SOLVE_STATUS_UNCONVERGED
The requested solution criteria has likely not been achieved.
@ SOLVE_STATUS_CONVERGED
The requested solution criteria has likely been achieved.
@ SOLVE_STATUS_UNKNOWN
The final solution status is unknown but he solve did not totally fail.
@ SOLVE_MEASURE_NORM_INIT_RESIDUAL
Norm of the initial residual vector given a non-zero guess (i.e. ||A*xo-b||)
@ SOLVE_MEASURE_NORM_RESIDUAL
Norm of the current residual vector (i.e. ||A*x-b||)
@ SOLVE_MEASURE_NORM_RHS
Norm of the right-hand side (i.e. ||b||)
@ SOLVE_MEASURE_NORM_SOLUTION
Norm of the current solution vector (i.e. ||x||)
@ SOLVE_MEASURE_ONE
No solve measure (i.e. same as 1.0)
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
T_To & dyn_cast(T_From &from)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Simple struct that defines the requested solution criteria for a solve.
ScalarMag requestedTol
The requested solve tolerance (what the client would like to see). Only significant if !...
RCP< const ReductionFunctional< Scalar > > denominatorReductionFunc
Reduction function to be used in place of the natural norm of the numerator.
static ScalarMag unspecifiedTolerance()
SolveCriteria(SolveMeasureType solveMeasureType_in, ScalarMag requestedTol_in, const RCP< ParameterList > &extraParameters_in=Teuchos::null, const RCP< ReductionFunctional< Scalar > > &numeratorReductionFunc_in=Teuchos::null, const RCP< ReductionFunctional< Scalar > > &denominatorReductionFunc_in=Teuchos::null)
Construct with a specified solve criteria.
SolveCriteria()
Default construction to use default solve criteria.
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
RCP< const ReductionFunctional< Scalar > > numeratorReductionFunc
Reduction function to be used in place of the natural norm of the numerator.
RCP< ParameterList > extraParameters
Any extra control parameters (e.g. max iterations).
SolveMeasureType solveMeasureType
The type of solve tolerance requested as given in this->requestedTol.
std::ostream & operator<<(std::ostream &out, const SolveCriteria< Scalar > &solveCriteria)
Output operator.
void set(ESolveMeasureNormType _numerator, ESolveMeasureNormType _denominator)
bool useDefault() const
Return if this is a default solve measure (default constructed).
bool contains(ESolveMeasureNormType measure) const
bool operator()(ESolveMeasureNormType numerator_in, ESolveMeasureNormType denominator_in) const
Return if (numerator,denominataor) matches this.
std::ostream & operator<<(std::ostream &out, const SolveMeasureType &solveMeasureType)
Output operator.
SolveMeasureType(ESolveMeasureNormType _numerator, ESolveMeasureNormType _denominator)
ESolveMeasureNormType denominator
Simple struct for the return status from a solve.
static ScalarMag unknownTolerance()
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
std::ostream & operator<<(std::ostream &out_arg, const SolveStatus< Scalar > &solveStatus)
Print the solve status to a stream.
std::string message
A simple one-line message (i.e. no newlines) returned from the solver.
static std::string achievedTolToString(const ScalarMag &achievedTol)
Output the achieveTol field.
ESolveStatus solveStatus
The return status of the solve.
ScalarMag achievedTol
The maximum final tolerance actually achieved by the (block) linear solve. A value of unknownToleranc...
RCP< ParameterList > extraParameters
Any extra status parameters. Note that the contents of this parameter list is totally undefined.
void accumulateSolveStatusInit(const Ptr< SolveStatus< Scalar > > &overallSolveStatus)
Initial overallSolveStatus before calling accumulateSolveStatus().
void accumulateSolveStatus(const SolveCriteria< Scalar >, const SolveStatus< Scalar > &solveStatus, const Ptr< SolveStatus< Scalar > > &overallSolveStatus)
Accumulate solve status objects for solving a block of RHSs is smaller sub-blocks.