Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/linalg/vector.hpp
3206 views
1
#ifndef FILE_VECTOR
2
#define FILE_VECTOR
3
4
/* *************************************************************************/
5
/* File: vector.hh */
6
/* Author: Joachim Schoeberl */
7
/* Date: 01. Oct. 94 */
8
/* *************************************************************************/
9
10
11
class FlatVector
12
{
13
protected:
14
int s;
15
double *data;
16
public:
17
FlatVector () { ; }
18
FlatVector (int as, double * adata)
19
{ s = as; data = adata; }
20
21
int Size () const
22
{ return s; }
23
24
FlatVector & operator= (const FlatVector & v)
25
{ memcpy (data, v.data, s*sizeof(double)); return *this; }
26
27
FlatVector & operator= (double scal)
28
{
29
for (int i = 0; i < s; i++) data[i] = scal;
30
return *this;
31
}
32
33
double & operator[] (int i) { return data[i]; }
34
const double & operator[] (int i) const { return data[i]; }
35
double & operator() (int i) { return data[i]; }
36
const double & operator() (int i) const { return data[i]; }
37
38
double & Elem (int i) { return data[i-1]; }
39
const double & Get (int i) const { return data[i-1]; }
40
void Set (int i, double val) { data[i-1] = val; }
41
42
FlatVector & operator*= (double scal)
43
{
44
for (int i = 0; i < s; i++) data[i] *= scal;
45
return *this;
46
}
47
48
FlatVector & Add (double scal, const FlatVector & v2)
49
{
50
for (int i = 0; i < s; i++)
51
data[i] += scal * v2[i];
52
return *this;
53
}
54
55
FlatVector & Set (double scal, const FlatVector & v2)
56
{
57
for (int i = 0; i < s; i++)
58
data[i] = scal * v2[i];
59
return *this;
60
}
61
62
FlatVector & Set2 (double scal1, const FlatVector & v1,
63
double scal2, const FlatVector & v2)
64
{
65
for (int i = 0; i < s; i++)
66
data[i] = scal1 * v1[i] + scal2 * v2[i];
67
return *this;
68
}
69
70
double L2Norm() const
71
{
72
double sum = 0;
73
for (int i = 0; i < s; i++)
74
sum += data[i] * data[i];
75
return sqrt (sum);
76
}
77
78
friend double operator* (const FlatVector & v1, const FlatVector & v2);
79
};
80
81
82
83
class Vector : public FlatVector
84
{
85
86
public:
87
Vector ()
88
{ s = 0; data = 0; }
89
Vector (int as)
90
{ s = as; data = new double[s]; }
91
~Vector ()
92
{ delete [] data; }
93
94
Vector & operator= (const FlatVector & v)
95
{ memcpy (data, &v.Get(1), s*sizeof(double)); return *this; }
96
97
Vector & operator= (double scal)
98
{
99
for (int i = 0; i < s; i++) data[i] = scal;
100
return *this;
101
}
102
103
void SetSize (int as)
104
{
105
if (s != as)
106
{
107
s = as;
108
delete [] data;
109
data = new double [s];
110
}
111
}
112
113
};
114
115
116
inline double operator* (const FlatVector & v1, const FlatVector & v2)
117
{
118
double sum = 0;
119
for (int i = 0; i < v1.s; i++)
120
sum += v1.data[i] * v2.data[i];
121
return sum;
122
}
123
124
125
126
127
inline ostream & operator<< (ostream & ost, const FlatVector & v)
128
{
129
for (int i = 0; i < v.Size(); i++)
130
ost << " " << setw(7) << v[i];
131
return ost;
132
}
133
134
135
136
#endif
137
138
139
140