Branch data Line data Source code
1 : : /*
2 : : * eqnsys.h - equations system solver class definitions
3 : : *
4 : : * Copyright (C) 2004, 2005, 2006 Stefan Jahn <stefan@lkcc.org>
5 : : *
6 : : * This is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2, or (at your option)
9 : : * any later version.
10 : : *
11 : : * This software is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this package; see the file COPYING. If not, write to
18 : : * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
19 : : * Boston, MA 02110-1301, USA.
20 : : *
21 : : * $Id$
22 : : *
23 : : */
24 : :
25 : : #ifndef __EQNSYS_H__
26 : : #define __EQNSYS_H__
27 : :
28 : : #include <limits>
29 : :
30 : : //! Definition of equation system solving algorithms.
31 : : enum algo_type {
32 : : ALGO_INVERSE = 0x0001,
33 : : ALGO_GAUSS = 0x0002,
34 : : ALGO_GAUSS_JORDAN = 0x0004,
35 : : ALGO_LU_FACTORIZATION_CROUT = 0x0008,
36 : : ALGO_LU_FACTORIZATION_DOOLITTLE = 0x0010,
37 : : ALGO_LU_SUBSTITUTION_CROUT = 0x0020,
38 : : ALGO_LU_SUBSTITUTION_DOOLITTLE = 0x0040,
39 : : ALGO_LU_DECOMPOSITION = 0x0028,
40 : : ALGO_LU_DECOMPOSITION_CROUT = 0x0028,
41 : : ALGO_LU_DECOMPOSITION_DOOLITTLE = 0x0050,
42 : : ALGO_JACOBI = 0x0080,
43 : : ALGO_GAUSS_SEIDEL = 0x0100,
44 : : ALGO_SOR = 0x0200,
45 : : ALGO_QR_DECOMPOSITION = 0x0400,
46 : : ALGO_QR_DECOMPOSITION_LS = 0x0800,
47 : : ALGO_SV_DECOMPOSITION = 0x1000,
48 : : // testing
49 : : ALGO_QR_DECOMPOSITION_2 = 0x2000,
50 : : };
51 : :
52 : : //! Definition of pivoting strategies.
53 : : enum pivot_type {
54 : : PIVOT_NONE = 0x01,
55 : : PIVOT_PARTIAL = 0x02,
56 : : PIVOT_FULL = 0x04
57 : : };
58 : :
59 : : #include "tvector.h"
60 : : #include "tmatrix.h"
61 : :
62 : : namespace qucs {
63 : :
64 : : template <class nr_type_t>
65 : : class eqnsys
66 : : {
67 : : public:
68 : : eqnsys ();
69 : : eqnsys (eqnsys &);
70 : : ~eqnsys ();
71 : 1116291 : void setAlgo (int a) { algo = a; }
72 : : int getAlgo (void) { return algo; }
73 : : void passEquationSys (tmatrix<nr_type_t> *, tvector<nr_type_t> *,
74 : : tvector<nr_type_t> *);
75 : : void solve (void);
76 : :
77 : : private:
78 : : int update;
79 : : int algo;
80 : : int pivoting;
81 : : int * rMap;
82 : : int * cMap;
83 : : int N;
84 : : nr_double_t * nPvt;
85 : :
86 : : tmatrix<nr_type_t> * A;
87 : : tmatrix<nr_type_t> * V;
88 : : tvector<nr_type_t> * B;
89 : : tvector<nr_type_t> * X;
90 : : tvector<nr_type_t> * R;
91 : : tvector<nr_type_t> * T;
92 : : tvector<nr_double_t> * S;
93 : : tvector<nr_double_t> * E;
94 : :
95 : : void solve_inverse (void);
96 : : void solve_gauss (void);
97 : : void solve_gauss_jordan (void);
98 : : void solve_lu_crout (void);
99 : : void solve_lu_doolittle (void);
100 : : void factorize_lu_crout (void);
101 : : void factorize_lu_doolittle (void);
102 : : void substitute_lu_crout (void);
103 : : void substitute_lu_doolittle (void);
104 : : void solve_qr (void);
105 : : void solve_qr_ls (void);
106 : : void solve_qrh (void);
107 : : void factorize_qrh (void);
108 : : void substitute_qrh (void);
109 : : void factorize_qr_householder (void);
110 : : void substitute_qr_householder (void);
111 : : void substitute_qr_householder_ls (void);
112 : : nr_type_t householder_create_left (int);
113 : : void householder_apply_left (int, nr_type_t);
114 : : nr_type_t householder_left (int);
115 : : nr_type_t householder_create_right (int);
116 : : void householder_apply_right (int, nr_type_t);
117 : : void householder_apply_right_extern (int, nr_type_t);
118 : : nr_type_t householder_right (int);
119 : : nr_double_t euclidian_c (int, int r = 1);
120 : : nr_double_t euclidian_r (int, int c = 1);
121 : : void givens_apply_u (int, int, nr_double_t, nr_double_t);
122 : : void givens_apply_v (int, int, nr_double_t, nr_double_t);
123 : : void solve_svd (void);
124 : : void chop_svd (void);
125 : : void factorize_svd (void);
126 : : void substitute_svd (void);
127 : : void diagonalize_svd (void);
128 : : void solve_iterative (void);
129 : : void solve_sor (void);
130 : : nr_double_t convergence_criteria (void);
131 : : void ensure_diagonal (void);
132 : : void ensure_diagonal_MNA (void);
133 : : int countPairs (int, int&, int&);
134 : : void preconditioner (void);
135 : : };
136 : :
137 : : } // namespace qucs
138 : :
139 : : #include "eqnsys.cpp"
140 : :
141 : : #endif /* __EQNSYS_H__ */
|