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