00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef OPM_NEWTONITERATIONBLACKOILINTERLEAVED_HEADER_INCLUDED
00026 #define OPM_NEWTONITERATIONBLACKOILINTERLEAVED_HEADER_INCLUDED
00027
00028 #include <opm/autodiff/NewtonIterationBlackoilInterface.hpp>
00029 #include <opm/core/utility/parameters/ParameterGroup.hpp>
00030
00031 #include <array>
00032 #include <memory>
00033
00034 namespace Opm
00035 {
00037 struct NewtonIterationBlackoilInterleavedParameters
00038 {
00039 double linear_solver_reduction_;
00040 double ilu_relaxation_;
00041 int linear_solver_maxiter_;
00042 int linear_solver_restart_;
00043 int linear_solver_verbosity_;
00044 int ilu_fillin_level_;
00045 bool newton_use_gmres_;
00046 bool require_full_sparsity_pattern_;
00047 bool ignoreConvergenceFailure_;
00048 bool linear_solver_use_amg_;
00049
00050 NewtonIterationBlackoilInterleavedParameters() { reset(); }
00051
00052 NewtonIterationBlackoilInterleavedParameters( const ParameterGroup& param )
00053 {
00054
00055 reset();
00056
00057
00058 newton_use_gmres_ = param.getDefault("newton_use_gmres", newton_use_gmres_ );
00059 linear_solver_reduction_ = param.getDefault("linear_solver_reduction", linear_solver_reduction_ );
00060 linear_solver_maxiter_ = param.getDefault("linear_solver_maxiter", linear_solver_maxiter_);
00061 linear_solver_restart_ = param.getDefault("linear_solver_restart", linear_solver_restart_);
00062 linear_solver_verbosity_ = param.getDefault("linear_solver_verbosity", linear_solver_verbosity_);
00063 require_full_sparsity_pattern_ = param.getDefault("require_full_sparsity_pattern", require_full_sparsity_pattern_);
00064 ignoreConvergenceFailure_ = param.getDefault("linear_solver_ignoreconvergencefailure", ignoreConvergenceFailure_);
00065 linear_solver_use_amg_ = param.getDefault("linear_solver_use_amg", linear_solver_use_amg_ );
00066 ilu_relaxation_ = param.getDefault("ilu_relaxation", ilu_relaxation_ );
00067 ilu_fillin_level_ = param.getDefault("ilu_fillin_level", ilu_fillin_level_ );
00068 }
00069
00070
00071 void reset()
00072 {
00073 newton_use_gmres_ = false;
00074 linear_solver_reduction_ = 1e-2;
00075 linear_solver_maxiter_ = 150;
00076 linear_solver_restart_ = 40;
00077 linear_solver_verbosity_ = 0;
00078 require_full_sparsity_pattern_ = false;
00079 ignoreConvergenceFailure_ = false;
00080 linear_solver_use_amg_ = false;
00081 ilu_fillin_level_ = 0;
00082 ilu_relaxation_ = 0.9;
00083 }
00084 };
00085
00086
00090 class NewtonIterationBlackoilInterleaved : public NewtonIterationBlackoilInterface
00091 {
00092 public:
00093
00098 NewtonIterationBlackoilInterleaved(const ParameterGroup& param,
00099 const boost::any& parallelInformation=boost::any());
00100
00106 virtual SolutionVector computeNewtonIncrement(const LinearisedBlackoilResidual& residual) const;
00107
00109 virtual int iterations () const { return iterations_; }
00110
00112 virtual const boost::any& parallelInformation() const;
00113
00114 private:
00115
00116 static const int maxNumberEquations_ = 6 ;
00117
00118 mutable std::array< std::unique_ptr< NewtonIterationBlackoilInterface >, maxNumberEquations_+1 > newtonIncrementDoublePrecision_;
00119 mutable std::array< std::unique_ptr< NewtonIterationBlackoilInterface >, maxNumberEquations_+1 > newtonIncrementSinglePrecision_;
00120 NewtonIterationBlackoilInterleavedParameters parameters_;
00121 boost::any parallelInformation_;
00122 mutable int iterations_;
00123 };
00124
00125 }
00126
00127
00128 #endif // OPM_NEWTONITERATIONBLACKOILINTERLEAVED_HEADER_INCLUDED