Main Page
Related Pages
Classes
Files
File List
File Members
src
matrix.hpp
Go to the documentation of this file.
1
5
/* Copyright (c) 2005-2010 Taneli Kalvas. All rights reserved.
6
*
7
* You can redistribute this software and/or modify it under the terms
8
* of the GNU General Public License as published by the Free Software
9
* Foundation; either version 2 of the License, or (at your option)
10
* any later version.
11
*
12
* This library is distributed in the hope that it will be useful, but
13
* WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* General Public License for more details.
16
*
17
* You should have received a copy of the GNU General Public License
18
* along with this library (file "COPYING" included in the package);
19
* if not, write to the Free Software Foundation, Inc., 51 Franklin
20
* Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*
22
* If you have questions about your rights to use or distribute this
23
* software, please contact Berkeley Lab's Technology Transfer
24
* Department at TTD@lbl.gov. Other questions, comments and bug
25
* reports should be sent directly to the author via email at
26
* taneli.kalvas@jyu.fi.
27
*
28
* NOTICE. This software was developed under partial funding from the
29
* U.S. Department of Energy. As such, the U.S. Government has been
30
* granted for itself and others acting on its behalf a paid-up,
31
* nonexclusive, irrevocable, worldwide license in the Software to
32
* reproduce, prepare derivative works, and perform publicly and
33
* display publicly. Beginning five (5) years after the date
34
* permission to assert copyright is obtained from the U.S. Department
35
* of Energy, and subject to any subsequent five (5) year renewals,
36
* the U.S. Government is granted for itself and others acting on its
37
* behalf a paid-up, nonexclusive, irrevocable, worldwide license in
38
* the Software to reproduce, prepare derivative works, distribute
39
* copies to the public, perform publicly and display publicly, and to
40
* permit others to do so.
41
*/
42
43
#ifndef MATRIX_HPP
44
#define MATRIX_HPP 1
45
46
47
#include <iostream>
48
#include "
mvector.hpp
"
49
50
57
struct
MatrixMulVec
{
58
const
class
Matrix
*
_mat
;
59
const
class
Vector
*
_vec
;
60
64
MatrixMulVec
(
const
Matrix
&mat,
const
class
Vector
&vec ) :
65
_mat
(&mat),
_vec
(&vec) {}
66
67
friend
class
Vector
;
68
};
69
70
76
class
Matrix
{
77
virtual
double
get_check(
int
i,
int
j )
const
= 0;
78
virtual
double
&set_check(
int
i,
int
j ) = 0;
79
virtual
double
get_no_check(
int
i,
int
j )
const
= 0;
80
virtual
double
&set_no_check(
int
i,
int
j ) = 0;
81
82
public
:
83
84
/* ************************************** *
85
* Constructors and destructor *
86
* ************************************** */
87
90
virtual
~Matrix
() {}
91
92
/* ************************************** *
93
* Access and information *
94
* ************************************** */
95
98
virtual
int
columns
(
void
)
const
= 0;
99
102
virtual
int
rows
(
void
)
const
= 0;
103
107
virtual
void
size
(
int
&n,
int
&m )
const
= 0;
108
109
/* ************************************** *
110
* User level control *
111
* ************************************** */
112
115
virtual
void
resize
(
int
n,
int
m ) = 0;
116
117
//virtual void merge( Matrix &mat ) = 0;
118
121
virtual
void
clear
(
void
) = 0;
122
123
/* ************************************** *
124
* User level matrix element access *
125
* ************************************** */
126
129
inline
double
get
(
int
i,
int
j )
const
;
130
134
inline
double
&
set
(
int
i,
int
j );
135
136
/* ************************************** *
137
* Matrix-Vector operations *
138
* ************************************** */
139
142
MatrixMulVec
operator*
(
const
class
Vector
&vec )
const
;
143
144
virtual
void
multiply_by_vector
(
Vector
&res,
const
Vector
&rhs )
const
= 0;
145
virtual
void
lower_unit_solve
(
Vector
&y,
const
Vector
&b )
const
= 0;
146
virtual
void
upper_diag_solve
(
Vector
&x,
const
Vector
&y )
const
= 0;
147
148
friend
class
Vector
;
149
};
150
151
152
inline
double
Matrix::get
(
int
i,
int
j )
const
153
{
154
#ifdef SPM_RANGE_CHECK
155
return
( get_check( i, j ) );
156
#else
157
return
( get_no_check( i, j ) );
158
#endif
159
}
160
161
162
inline
double
&
Matrix::set
(
int
i,
int
j )
163
{
164
#ifdef SPM_RANGE_CHECK
165
return
( set_check( i, j ) );
166
#else
167
return
( set_no_check( i, j ) );
168
#endif
169
}
170
171
172
std::ostream &
operator<<
( std::ostream &os,
const
Matrix
&mat );
173
174
175
176
#endif
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
Reference manual for Ion Beam Simulator 1.0.5b
Generated on by
Doxygen
1.8.1.2 on Tue Oct 2 2012 00:46:27.