escript
Revision_
|
00001 00002 /****************************************************************************** 00003 * 00004 * Copyright (c) 2003-2014 by University of Queensland 00005 * http://www.uq.edu.au 00006 * 00007 * Primary Business: Queensland, Australia 00008 * Licensed under the Open Software License version 3.0 00009 * http://www.opensource.org/licenses/osl-3.0.php 00010 * 00011 * Development until 2012 by Earth Systems Science Computational Center (ESSCC) 00012 * Development 2012-2013 by School of Earth Sciences 00013 * Development from 2014 by Centre for Geoscience Computing (GeoComp) 00014 * 00015 *****************************************************************************/ 00016 00017 #ifndef SOLVER_OPTIONS_H 00018 #define SOLVER_OPTIONS_H 00019 00020 #include <boost/python/object.hpp> 00021 #include "system_dep.h" 00022 namespace escript { 00023 00080 enum SolverOptions { 00081 ESCRIPT_DEFAULT, 00082 ESCRIPT_DIRECT = 1, 00083 ESCRIPT_CHOLEVSKY = 2, 00084 ESCRIPT_PCG = 3, 00085 ESCRIPT_CR = 4, 00086 ESCRIPT_CGS = 5, 00087 ESCRIPT_BICGSTAB = 6, 00088 ESCRIPT_ILU0 = 8, 00089 ESCRIPT_ILUT = 9, 00090 ESCRIPT_JACOBI = 10, 00091 ESCRIPT_GMRES = 11, 00092 ESCRIPT_PRES20 = 12, 00093 ESCRIPT_LUMPING = 13, 00094 ESCRIPT_ROWSUM_LUMPING = 13, 00095 ESCRIPT_HRZ_LUMPING = 14, 00096 ESCRIPT_NO_REORDERING = 17, 00097 ESCRIPT_MINIMUM_FILL_IN = 18, 00098 ESCRIPT_NESTED_DISSECTION = 19, 00099 ESCRIPT_MKL = 15, 00100 ESCRIPT_UMFPACK = 16, 00101 ESCRIPT_ITERATIVE = 20, 00102 ESCRIPT_PASO = 21, 00103 ESCRIPT_AMG = 22, 00104 ESCRIPT_REC_ILU = 23, 00105 ESCRIPT_TRILINOS = 24, 00106 ESCRIPT_NONLINEAR_GMRES = 25, 00107 ESCRIPT_TFQMR = 26, 00108 ESCRIPT_MINRES = 27, 00109 ESCRIPT_GAUSS_SEIDEL = 28, 00110 ESCRIPT_RILU = 29, 00111 ESCRIPT_DEFAULT_REORDERING = 30, 00112 ESCRIPT_SUPER_LU = 31, 00113 ESCRIPT_PASTIX = 32, 00114 ESCRIPT_YAIR_SHAPIRA_COARSENING = 33, 00115 ESCRIPT_RUGE_STUEBEN_COARSENING = 34, 00116 ESCRIPT_AGGREGATION_COARSENING = 35, 00117 ESCRIPT_NO_PRECONDITIONER = 36, 00118 ESCRIPT_MIN_COARSE_MATRIX_SIZE = 37, 00119 ESCRIPT_AMLI = 38, 00120 ESCRIPT_STANDARD_COARSENING = 39, 00121 ESCRIPT_CLASSIC_INTERPOLATION_WITH_FF_COUPLING = 50, 00122 ESCRIPT_CLASSIC_INTERPOLATION = 51, 00123 ESCRIPT_DIRECT_INTERPOLATION = 52, 00124 ESCRIPT_BOOMERAMG = 60, 00125 ESCRIPT_CIJP_FIXED_RANDOM_COARSENING = 61, 00126 ESCRIPT_CIJP_COARSENING = 62, 00127 ESCRIPT_FALGOUT_COARSENING = 63, 00128 ESCRIPT_PMIS_COARSENING = 64, 00129 ESCRIPT_HMIS_COARSENING = 65, 00130 ESCRIPT_LINEAR_CRANK_NICOLSON = 66, 00131 ESCRIPT_CRANK_NICOLSON = 67, 00132 ESCRIPT_BACKWARD_EULER = 68 00133 }; 00134 00135 class SolverBuddy { 00136 public: 00137 ESCRIPT_DLL_API SolverBuddy(); 00141 ESCRIPT_DLL_API std::string getSummary() const; 00142 00148 ESCRIPT_DLL_API const char *getName(int key) const; 00149 00156 ESCRIPT_DLL_API void resetDiagnostics(bool all=false); 00157 00166 ESCRIPT_DLL_API void updateDiagnostics(std::string key, boost::python::object value); 00167 00195 ESCRIPT_DLL_API double getDiagnostics(std::string name) const; 00196 00203 ESCRIPT_DLL_API bool hasConverged() const; 00204 00215 ESCRIPT_DLL_API void setCoarsening(int coarsening); 00216 00222 ESCRIPT_DLL_API SolverOptions getCoarsening() const; 00223 00229 ESCRIPT_DLL_API void setMinCoarseMatrixSize(int size); 00230 00234 ESCRIPT_DLL_API int getMinCoarseMatrixSize() const; 00235 00250 ESCRIPT_DLL_API void setPreconditioner(int preconditioner); 00251 00256 ESCRIPT_DLL_API SolverOptions getPreconditioner() const; 00257 00268 ESCRIPT_DLL_API void setSmoother(int smoother); 00269 00274 ESCRIPT_DLL_API SolverOptions getSmoother() const; 00275 00293 ESCRIPT_DLL_API void setSolverMethod(int method); 00294 00299 ESCRIPT_DLL_API SolverOptions getSolverMethod() const; 00300 00312 ESCRIPT_DLL_API void setPackage(int package); 00313 00318 ESCRIPT_DLL_API SolverOptions getPackage() const; 00319 00329 ESCRIPT_DLL_API void setReordering(int ordering); 00330 00336 ESCRIPT_DLL_API SolverOptions getReordering() const; 00337 00344 ESCRIPT_DLL_API void setRestart(int restart); 00345 00351 ESCRIPT_DLL_API int getRestart() const; 00352 00358 ESCRIPT_DLL_API int _getRestartForC() const; 00359 00365 ESCRIPT_DLL_API void setDiagonalDominanceThreshold(double threshold); 00366 00372 ESCRIPT_DLL_API double getDiagonalDominanceThreshold() const; 00373 00379 ESCRIPT_DLL_API void setTruncation(int truncation); 00380 00385 ESCRIPT_DLL_API int getTruncation() const; 00386 00392 ESCRIPT_DLL_API void setInnerIterMax(int iter_max); 00393 00398 ESCRIPT_DLL_API int getInnerIterMax() const; 00399 00405 ESCRIPT_DLL_API void setIterMax(int iter_max); 00406 00411 ESCRIPT_DLL_API int getIterMax() const; 00412 00419 ESCRIPT_DLL_API void setLevelMax(int level_max); 00420 00426 ESCRIPT_DLL_API int getLevelMax() const; 00427 00434 ESCRIPT_DLL_API void setCycleType(int cycle_type); 00435 00441 ESCRIPT_DLL_API int getCycleType() const; 00442 00449 ESCRIPT_DLL_API void setCoarseningThreshold(double theta); 00450 00456 ESCRIPT_DLL_API double getCoarseningThreshold() const; 00457 00463 ESCRIPT_DLL_API void setNumSweeps(int sweeps); 00464 00469 ESCRIPT_DLL_API int getNumSweeps() const; 00470 00477 ESCRIPT_DLL_API void setNumPreSweeps(int sweeps); 00478 00484 ESCRIPT_DLL_API int getNumPreSweeps() const; 00485 00492 ESCRIPT_DLL_API void setNumPostSweeps(int sweeps); 00493 00499 ESCRIPT_DLL_API int getNumPostSweeps() const; 00500 00506 ESCRIPT_DLL_API void setTolerance(double rtol); 00507 00512 ESCRIPT_DLL_API double getTolerance() const; 00513 00519 ESCRIPT_DLL_API void setAbsoluteTolerance(double atol); 00520 00525 ESCRIPT_DLL_API double getAbsoluteTolerance() const; 00526 00533 ESCRIPT_DLL_API void setInnerTolerance(double rtol); 00534 00539 ESCRIPT_DLL_API double getInnerTolerance() const; 00540 00546 ESCRIPT_DLL_API void setDropTolerance(double drop_tol); 00547 00552 ESCRIPT_DLL_API double getDropTolerance() const; 00553 00561 ESCRIPT_DLL_API void setDropStorage(double drop); 00562 00567 ESCRIPT_DLL_API double getDropStorage() const; 00568 00576 ESCRIPT_DLL_API void setRelaxationFactor(double factor); 00577 00578 00584 ESCRIPT_DLL_API double getRelaxationFactor() const; 00585 00591 ESCRIPT_DLL_API bool isSymmetric() const; 00592 00596 ESCRIPT_DLL_API void setSymmetryOn(); 00597 00601 ESCRIPT_DLL_API void setSymmetryOff(); 00602 ESCRIPT_DLL_API void setSymmetry(bool symmetry); 00608 00614 ESCRIPT_DLL_API bool isVerbose() const; 00615 00619 ESCRIPT_DLL_API void setVerbosityOn(); 00620 00624 ESCRIPT_DLL_API void setVerbosityOff(); 00625 00631 ESCRIPT_DLL_API void setVerbosity(bool verbosity); 00632 00640 ESCRIPT_DLL_API bool adaptInnerTolerance() const; 00641 00645 ESCRIPT_DLL_API void setInnerToleranceAdaptionOn(); 00646 00650 ESCRIPT_DLL_API void setInnerToleranceAdaptionOff(); 00651 00657 ESCRIPT_DLL_API void setInnerToleranceAdaption(bool adaption); 00658 00669 ESCRIPT_DLL_API bool acceptConvergenceFailure() const; 00670 00674 ESCRIPT_DLL_API void setAcceptanceConvergenceFailureOn(); 00675 00679 ESCRIPT_DLL_API void setAcceptanceConvergenceFailureOff(); 00680 00686 ESCRIPT_DLL_API void setAcceptanceConvergenceFailure(bool acceptance); 00687 00694 ESCRIPT_DLL_API bool useLocalPreconditioner() const; 00695 00699 ESCRIPT_DLL_API void setLocalPreconditionerOn(); 00700 00704 ESCRIPT_DLL_API void setLocalPreconditionerOff(); 00705 00711 ESCRIPT_DLL_API void setLocalPreconditioner(bool local); 00712 00720 ESCRIPT_DLL_API void setMinCoarseMatrixSparsity(double sparsity); 00721 00729 ESCRIPT_DLL_API double getMinCoarseMatrixSparsity() const; 00730 00737 ESCRIPT_DLL_API void setNumRefinements(int refinements); 00738 00744 ESCRIPT_DLL_API int getNumRefinements() const; 00745 00752 ESCRIPT_DLL_API void setNumCoarseMatrixRefinements(int refinements); 00753 00759 ESCRIPT_DLL_API int getNumCoarseMatrixRefinements() const; 00760 00767 ESCRIPT_DLL_API bool usePanel() const; 00768 00772 ESCRIPT_DLL_API void setUsePanelOn(); 00773 00777 ESCRIPT_DLL_API void setUsePanelOff(); 00778 00784 ESCRIPT_DLL_API void setUsePanel(bool use); 00785 00793 ESCRIPT_DLL_API void setAMGInterpolation(int interpolation); 00794 00799 ESCRIPT_DLL_API SolverOptions getAMGInterpolation() const; 00800 00808 ESCRIPT_DLL_API void setODESolver(int solver); 00809 00814 ESCRIPT_DLL_API SolverOptions getODESolver() const; 00815 00816 00817 protected: 00818 int level_max; 00819 double coarsening_threshold; 00820 SolverOptions smoother; 00821 int sweeps; 00822 int pre_sweeps; 00823 int post_sweeps; 00824 double tolerance; 00825 double absolute_tolerance; 00826 double inner_tolerance; 00827 double drop_tolerance; 00828 double drop_storage; 00829 int iter_max; 00830 int inner_iter_max; 00831 int truncation; 00832 int restart; //0 will have to be None in python, will get tricky 00833 bool symmetric; 00834 bool verbose; 00835 bool adapt_inner_tolerance; 00836 bool accept_convergence_failure; 00837 SolverOptions reordering; 00838 SolverOptions package; 00839 SolverOptions method; 00840 SolverOptions preconditioner; 00841 SolverOptions coarsening; 00842 int MinCoarseMatrixSize; 00843 double relaxation; 00844 bool use_local_preconditioner; 00845 double min_sparsity; 00846 int refinements; 00847 int coarse_refinements; 00848 bool use_panel; 00849 double diagonal_dominance_threshold; 00850 SolverOptions amg_interpolation_method; 00851 int cycle_type; 00852 SolverOptions ode_solver; 00853 00854 int num_iter; 00855 int num_level; 00856 int num_inner_iter; 00857 double time; 00858 double set_up_time; 00859 double net_time; 00860 double residual_norm; 00861 bool converged; 00862 int preconditioner_size; 00863 bool time_step_backtracking_used; 00864 int cum_num_inner_iter; 00865 int cum_num_iter; 00866 double cum_time; 00867 double cum_set_up_time; 00868 double cum_net_time; 00869 double coarse_level_sparsity; 00870 int num_coarse_unknowns; 00871 }; 00872 00873 typedef boost::shared_ptr<SolverBuddy> SB_ptr; 00874 00875 } 00876 00877 #endif