ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/math/tnt_array1d.hpp
Revision: 1336
Committed: Tue Apr 7 20:16:26 2009 UTC (16 years ago) by gezelter
File size: 4885 byte(s)
Log Message:
adding jama and tnt libraries for various linear algebra routines

File Contents

# User Rev Content
1 gezelter 1336 /*
2     *
3     * Template Numerical Toolkit (TNT)
4     *
5     * Mathematical and Computational Sciences Division
6     * National Institute of Technology,
7     * Gaithersburg, MD USA
8     *
9     *
10     * This software was developed at the National Institute of Standards and
11     * Technology (NIST) by employees of the Federal Government in the course
12     * of their official duties. Pursuant to title 17 Section 105 of the
13     * United States Code, this software is not subject to copyright protection
14     * and is in the public domain. NIST assumes no responsibility whatsoever for
15     * its use by other parties, and makes no guarantees, expressed or implied,
16     * about its quality, reliability, or any other characteristic.
17     *
18     */
19    
20    
21    
22     #ifndef TNT_ARRAY1D_H
23     #define TNT_ARRAY1D_H
24    
25     //#include <cstdlib>
26     #include <iostream>
27    
28     #ifdef TNT_BOUNDS_CHECK
29     #include <assert.h>
30     #endif
31    
32    
33     #include "tnt_i_refvec.hpp"
34    
35     namespace TNT
36     {
37    
38     template <class T>
39     class Array1D
40     {
41    
42     private:
43    
44     /* ... */
45     i_refvec<T> v_;
46     int n_;
47     T* data_; /* this normally points to v_.begin(), but
48     * could also point to a portion (subvector)
49     * of v_.
50     */
51    
52     void copy_(T* p, const T* q, int len) const;
53     void set_(T* begin, T* end, const T& val);
54    
55    
56     public:
57    
58     typedef T value_type;
59    
60    
61     Array1D();
62     explicit Array1D(int n);
63     Array1D(int n, const T &a);
64     Array1D(int n, T *a);
65     inline Array1D(const Array1D &A);
66     inline operator T*();
67     inline operator const T*();
68     inline Array1D & operator=(const T &a);
69     inline Array1D & operator=(const Array1D &A);
70     inline Array1D & ref(const Array1D &A);
71     Array1D copy() const;
72     Array1D & inject(const Array1D & A);
73     inline T& operator[](int i);
74     inline const T& operator[](int i) const;
75     inline int dim1() const;
76     inline int dim() const;
77     ~Array1D();
78    
79    
80     /* ... extended interface ... */
81    
82     inline int ref_count() const;
83     inline Array1D<T> subarray(int i0, int i1);
84    
85     };
86    
87    
88    
89    
90     template <class T>
91     Array1D<T>::Array1D() : v_(), n_(0), data_(0) {}
92    
93     template <class T>
94     Array1D<T>::Array1D(const Array1D<T> &A) : v_(A.v_), n_(A.n_),
95     data_(A.data_)
96     {
97     #ifdef TNT_DEBUG
98     std::cout << "Created Array1D(const Array1D<T> &A) \n";
99     #endif
100    
101     }
102    
103    
104     template <class T>
105     Array1D<T>::Array1D(int n) : v_(n), n_(n), data_(v_.begin())
106     {
107     #ifdef TNT_DEBUG
108     std::cout << "Created Array1D(int n) \n";
109     #endif
110     }
111    
112     template <class T>
113     Array1D<T>::Array1D(int n, const T &val) : v_(n), n_(n), data_(v_.begin())
114     {
115     #ifdef TNT_DEBUG
116     std::cout << "Created Array1D(int n, const T& val) \n";
117     #endif
118     set_(data_, data_+ n, val);
119    
120     }
121    
122     template <class T>
123     Array1D<T>::Array1D(int n, T *a) : v_(a), n_(n) , data_(v_.begin())
124     {
125     #ifdef TNT_DEBUG
126     std::cout << "Created Array1D(int n, T* a) \n";
127     #endif
128     }
129    
130     template <class T>
131     inline Array1D<T>::operator T*()
132     {
133     return &(v_[0]);
134     }
135    
136    
137     template <class T>
138     inline Array1D<T>::operator const T*()
139     {
140     return &(v_[0]);
141     }
142    
143    
144    
145     template <class T>
146     inline T& Array1D<T>::operator[](int i)
147     {
148     #ifdef TNT_BOUNDS_CHECK
149     assert(i>= 0);
150     assert(i < n_);
151     #endif
152     return data_[i];
153     }
154    
155     template <class T>
156     inline const T& Array1D<T>::operator[](int i) const
157     {
158     #ifdef TNT_BOUNDS_CHECK
159     assert(i>= 0);
160     assert(i < n_);
161     #endif
162     return data_[i];
163     }
164    
165    
166    
167    
168     template <class T>
169     Array1D<T> & Array1D<T>::operator=(const T &a)
170     {
171     set_(data_, data_+n_, a);
172     return *this;
173     }
174    
175     template <class T>
176     Array1D<T> Array1D<T>::copy() const
177     {
178     Array1D A( n_);
179     copy_(A.data_, data_, n_);
180    
181     return A;
182     }
183    
184    
185     template <class T>
186     Array1D<T> & Array1D<T>::inject(const Array1D &A)
187     {
188     if (A.n_ == n_)
189     copy_(data_, A.data_, n_);
190    
191     return *this;
192     }
193    
194    
195    
196    
197    
198     template <class T>
199     Array1D<T> & Array1D<T>::ref(const Array1D<T> &A)
200     {
201     if (this != &A)
202     {
203     v_ = A.v_; /* operator= handles the reference counting. */
204     n_ = A.n_;
205     data_ = A.data_;
206    
207     }
208     return *this;
209     }
210    
211     template <class T>
212     Array1D<T> & Array1D<T>::operator=(const Array1D<T> &A)
213     {
214     return ref(A);
215     }
216    
217     template <class T>
218     inline int Array1D<T>::dim1() const { return n_; }
219    
220     template <class T>
221     inline int Array1D<T>::dim() const { return n_; }
222    
223     template <class T>
224     Array1D<T>::~Array1D() {}
225    
226    
227     /* ............................ exented interface ......................*/
228    
229     template <class T>
230     inline int Array1D<T>::ref_count() const
231     {
232     return v_.ref_count();
233     }
234    
235     template <class T>
236     inline Array1D<T> Array1D<T>::subarray(int i0, int i1)
237     {
238     if ((i0 > 0) && (i1 < n_) || (i0 <= i1))
239     {
240     Array1D<T> X(*this); /* create a new instance of this array. */
241     X.n_ = i1-i0+1;
242     X.data_ += i0;
243    
244     return X;
245     }
246     else
247     {
248     return Array1D<T>();
249     }
250     }
251    
252    
253     /* private internal functions */
254    
255    
256     template <class T>
257     void Array1D<T>::set_(T* begin, T* end, const T& a)
258     {
259     for (T* p=begin; p<end; p++)
260     *p = a;
261    
262     }
263    
264     template <class T>
265     void Array1D<T>::copy_(T* p, const T* q, int len) const
266     {
267     T *end = p + len;
268     while (p<end )
269     *p++ = *q++;
270    
271     }
272    
273    
274     } /* namespace TNT */
275    
276     #endif
277     /* TNT_ARRAY1D_H */
278