1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/libraries/libmbwrap/linsol.h,v 1.50 2017/01/12 14:44:25 masarati Exp $ */ 2 /* 3 * MBDyn (C) is a multibody analysis code. 4 * http://www.mbdyn.org 5 * 6 * Copyright (C) 1996-2017 7 * 8 * Pierangelo Masarati <masarati@aero.polimi.it> 9 * Paolo Mantegazza <mantegazza@aero.polimi.it> 10 * 11 * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano 12 * via La Masa, 34 - 20156 Milano, Italy 13 * http://www.aero.polimi.it 14 * 15 * Changing this copyright notice is forbidden. 16 * 17 * This program is free software; you can redistribute it and/or modify 18 * it under the terms of the GNU General Public License as published by 19 * the Free Software Foundation (version 2 of the License). 20 * 21 * 22 * This program is distributed in the hope that it will be useful, 23 * but WITHOUT ANY WARRANTY; without even the implied warranty of 24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 * GNU General Public License for more details. 26 * 27 * You should have received a copy of the GNU General Public License 28 * along with this program; if not, write to the Free Software 29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 30 */ 31 32 /* linear solver generico */ 33 34 #ifndef LINEARSOLVER_H 35 #define LINEARSOLVER_H 36 37 /* Integrator - begin */ 38 39 class LinSol { 40 public: 41 enum SolverType { 42 EMPTY_SOLVER = 0, 43 HARWELL_SOLVER, 44 LAPACK_SOLVER, 45 MESCHACH_SOLVER, 46 NAIVE_SOLVER, 47 SUPERLU_SOLVER, 48 TAUCS_SOLVER, 49 UMFPACK_SOLVER, 50 KLU_SOLVER, 51 Y12_SOLVER, 52 53 LAST_SOLVER 54 }; 55 56 enum SolverFlags { 57 SOLVER_FLAGS_NONE = 0x00U, 58 SOLVER_FLAGS_ALLOWS_MAP = 0x01U, 59 SOLVER_FLAGS_ALLOWS_CC = 0x02U, 60 SOLVER_FLAGS_ALLOWS_DIR = 0x04U, 61 SOLVER_FLAGS_TYPE_MASK = SOLVER_FLAGS_ALLOWS_MAP|SOLVER_FLAGS_ALLOWS_CC|SOLVER_FLAGS_ALLOWS_DIR, 62 SOLVER_FLAGS_ALLOWS_MT_FCT = 0x10U, 63 SOLVER_FLAGS_ALLOWS_MT_ASS = 0x20U, 64 //permutations 65 SOLVER_FLAGS_ALLOWS_COLAMD = 0x40U, 66 SOLVER_FLAGS_ALLOWS_MMDATA = 0x80U, 67 SOLVER_FLAGS_ALLOWS_REVERSE_CUTHILL_MC_KEE = 0x100U, 68 SOLVER_FLAGS_ALLOWS_KING = 0x200U, 69 SOLVER_FLAGS_ALLOWS_NESTED_DISSECTION = 0x400U, 70 SOLVER_FLAGS_ALLOWS_MDAPLUSAT = 0x800U, 71 SOLVER_FLAGS_ALLOWS_SLOAN = 0x1000U, 72 73 SOLVER_FLAGS_PERM_MASK = 74 SOLVER_FLAGS_ALLOWS_COLAMD | 75 SOLVER_FLAGS_ALLOWS_MMDATA | 76 SOLVER_FLAGS_ALLOWS_MDAPLUSAT | 77 SOLVER_FLAGS_ALLOWS_REVERSE_CUTHILL_MC_KEE | 78 SOLVER_FLAGS_ALLOWS_KING | 79 SOLVER_FLAGS_ALLOWS_SLOAN | 80 SOLVER_FLAGS_ALLOWS_NESTED_DISSECTION 81 }; 82 83 /* solver data */ 84 struct solver_t { 85 const char *const s_name; 86 const char *const s_alias; 87 enum SolverType s_type; 88 unsigned s_flags; 89 unsigned s_default_flags; 90 doublereal s_pivot_factor; 91 doublereal s_drop_tolerance; 92 }; 93 94 protected: 95 SolverType currSolver; 96 unsigned solverFlags; 97 98 /* 99 * number of threads 100 * currently used by: 101 * SparseLU 102 */ 103 unsigned nThreads; 104 105 /* 106 * max workspace size 107 * currently used by: 108 * Y12 109 */ 110 integer iWorkSpaceSize; 111 112 /* 113 * block size 114 * currently used by: 115 * Umfpack 116 */ 117 unsigned blockSize; 118 119 /* 120 * pivot factor 121 * currently used by: 122 * SparseLU 0.0 -> 1.0 123 * Y12 0.0=no, 1.0=full 124 * Umfpack 0.0 -> 1.0 125 * Naive 1.0 -> 0.0 126 */ 127 doublereal dPivotFactor; 128 129 /* 130 * drop tolerance 131 * currently used by: 132 * Umfpack >= 0.0 (0.0: use all) 133 */ 134 doublereal dDropTolerance; 135 136 /* 137 * matrix scaling 138 * currently used by: 139 * Naive, KLU, Umfpack 140 */ 141 SolutionManager::ScaleOpt scale; 142 143 /* 144 * maximum number of iterations for iterative refinement 145 * used only by: 146 * Umfpack 147 */ 148 integer iMaxIter; 149 150 public: 151 static SolverType defaultSolver; 152 153 LinSol(void); 154 virtual ~LinSol(void); 155 156 SolverType GetSolver(void) const; 157 const char *const GetSolverName(void) const; 158 unsigned GetSolverFlags(void) const; 159 unsigned GetNumThreads(void) const; 160 integer iGetWorkSpaceSize(void) const; 161 const doublereal& dGetPivotFactor(void) const; 162 const doublereal& dGetDropTolerance(void) const; 163 unsigned GetBlockSize(void) const; GetScale(void)164 const SolutionManager::ScaleOpt& GetScale(void) const{ return scale; } 165 integer GetMaxIterations(void) const; 166 167 const char *const GetSolverName(SolverType t) const; 168 unsigned GetSolverFlags(SolverType t) const; 169 170 bool SetSolver(SolverType t, unsigned f = SOLVER_FLAGS_NONE); 171 bool SetSolverFlags(unsigned f); 172 bool AddSolverFlags(unsigned f); 173 bool MaskSolverFlags(unsigned f); 174 bool SetNumThreads(unsigned nt); 175 bool SetWorkSpaceSize(integer); 176 bool SetPivotFactor(const doublereal &d); 177 bool SetDropTolerance(const doublereal &d); 178 bool SetBlockSize(unsigned bs); 179 bool SetScale(const SolutionManager::ScaleOpt& scale); 180 bool SetMaxIterations(integer iMaxIter); 181 SolutionManager *const 182 GetSolutionManager(integer iNLD, integer iLWS = 0) const; 183 }; 184 185 extern const LinSol::solver_t solver[]; 186 187 /* LinSol - end */ 188 189 #endif // LINEARSOLVER_H 190 191