Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Vector_n.h
Go to the documentation of this file.
1 /* *******************************************************************
2  * Rocstar Simulation Suite *
3  * Copyright@2015, Illinois Rocstar LLC. All rights reserved. *
4  * *
5  * Illinois Rocstar LLC *
6  * Champaign, IL *
7  * www.illinoisrocstar.com *
8  * sales@illinoisrocstar.com *
9  * *
10  * License: See LICENSE file in top level of distribution package or *
11  * http://opensource.org/licenses/NCSA *
12  *********************************************************************/
13 /* *******************************************************************
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *
16  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *
17  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR *
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
21  * USE OR OTHER DEALINGS WITH THE SOFTWARE. *
22  *********************************************************************/
23 // $Id: Vector_n.h,v 1.5 2008/12/06 08:43:26 mtcampbe Exp $
24 
25 //===============================================================
26 // This file defines an adapator to cast an array into a vector
27 // that supports arithmetic operators. There are three adapators
28 // defined: Array_n, for a non-const array of size n, Array_n_const,
29 // for a const array of size n, and Vector_n, for dynamically-allocated
30 // vector of size n.
31 //
32 // Author: Xiangmin Jiao
33 // Creation date: Jan. 6, 2001
34 //===============================================================
35 
36 #ifndef RFC_VECTOR_N_H
37 #define RFC_VECTOR_N_H
38 
39 #include "rfc_basic.h"
40 #include <functional>
41 
43 
44 class Array_n;
45 class Vector_n;
46 
47 // Adapator to map an array into a vector that supports arithmetic operators.
49 public:
51  typedef Real Value;
52  typedef Real * Pointer;
53  typedef Real const * Const_pointer;
54  typedef Real & Reference;
55  typedef const Real& Const_reference;
56  typedef unsigned int Size;
57 
58  friend class Array_n;
59  friend class Vector_n;
60  friend bool operator==( const Array_n_const &v1, const Array_n_const& v2);
61  friend Vector_n operator+( const Array_n_const& v1, const Array_n_const& v2);
62  friend Vector_n operator-( const Array_n_const& v1, const Array_n_const& v2);
63  friend Real operator*( const Array_n_const& v1, const Array_n_const& v2);
64  friend Vector_n operator*( Real a, const Array_n_const& v1);
65  friend Vector_n operator*( const Array_n_const& v1, Real a);
66  friend Vector_n operator/( const Array_n_const& v1, Real a);
67  friend Vector_n multiply( const Array_n_const& v1, const Array_n_const& v2);
68  friend Vector_n divide( const Array_n_const& v1, const Array_n_const& v2);
69  friend Vector_n min( const Array_n_const& v1, const Array_n_const& v2);
70  friend Vector_n max( const Array_n_const& v1, const Array_n_const& v2);
71 
72  Array_n_const() : _start(0), _end(0) {}
73  Array_n_const( const Real *v, Size n) : _start(v), _end(v+n) { }
74  Array_n_const( const Real *v1, const Real *v2) : _start(v1), _end(v2) { }
75  Array_n_const( const Self &v) : _start(v._start), _end(v._end) {}
76 
77  Const_reference operator[](Size i) const { return _start[i]; }
78 
79  Size dimension() const { return _end-_start; }
80 
81  Const_pointer begin() const { return _start; }
82  Const_pointer end() const { return _end; }
83 
84  Real squared_norm() const {
85  Real t=0;
86  for ( const Real *p=_start; p!=_end; ++p) t += *p * *p;
87  return t;
88  }
89 
90 protected:
91  const Real *_start, *_end;
92 
93  Self &operator=( const Self&);
94 };
95 
96 class Array_n {
97 public:
98  typedef Array_n Self;
99  typedef Real Value;
100  typedef Real * Pointer;
101  typedef Real const * Const_pointer;
102  typedef Real & Reference;
103  typedef const Real& Const_reference;
104  typedef unsigned int Size;
105 
106  friend class Vector_n;
107 
108  Array_n() : _start(0), _end(0) {}
109  Array_n( Real *v, Size n) : _start(v), _end(v+n) {}
110  Array_n( Real *v1, Real *v2) : _start(v1), _end(v2) {}
111  Array_n( const Self &v) : _start(v._start), _end(v._end) {}
112 
113  operator const Array_n_const&() const
114  { return reinterpret_cast< const Array_n_const&>(*this); }
115 
117  Const_reference operator[](Size i) const { return _start[i]; }
118 
119  Size dimension() const { return _end-_start; }
120 
121  Const_pointer begin() const { return _start; }
122  Const_pointer end() const { return _end; }
123  Pointer begin() { return _start; }
124  Pointer end() { return _end; }
125 
126  Real squared_norm() const { return ((Array_n_const*)this)->squared_norm(); }
127 
129  if ( _start != v._start) { // Check not assigning to itself.
131  std::copy( v._start,v._end,_start);
132  }
133  return *this;
134  }
135  inline Self &operator=( const Self& v);
136  inline Self &operator=( const Vector_n& v);
137 
139  RFC_assertion( _end-_start == v1._end-v1._start);
140  const Real *q=v1._start;
141  for ( Real *p=_start; p!=_end; ++p, ++q) *p += *q;
142  return *this;
143  }
144 
146  RFC_assertion( _end-_start == v1._end-v1._start);
147  const Real *q=v1._start;
148  for ( Real *p=_start; p!=_end; ++p, ++q) *p -= *q;
149  return *this;
150  }
151 
153  for ( Real *p=_start; p!=_end; ++p) *p *= t; return *this;
154  }
155 
157  RFC_assertion( _end-_start == v1._end-v1._start);
158  const Real *q=v1._start;
159  for ( Real *p=_start; p!=_end; ++p, ++q) *p *= *q;
160  return *this;
161  }
162 
164  for ( Real *p=_start; p!=_end; ++p) { *p = (t==0) ? 1. : *p / t; }
165  return *this;
166  }
167 
169  RFC_assertion( _end-_start == v1._end-v1._start);
170  const Real *q=v1._start;
171  for ( Real *p=_start; p!=_end; ++p, ++q) { *p = (*q==0) ? 1. : *p / *q; }
172  return *this;
173  }
174 
176  for ( Real *p=_start; p!=_end; ++p) { *p = (*p==0) ? 0. : 1. / *p; }
177  return *this;
178  }
179 
180 protected:
182 };
183 
184 class Vector_n : public Array_n {
185 public:
186  typedef Vector_n Self;
187  typedef Array_n Base;
188  typedef Real Value;
189  typedef Real * Pointer;
190  typedef Real const * Const_pointer;
191  typedef Real & Reference;
192  typedef const Real& Const_reference;
193  typedef unsigned int Size;
194 
195  friend Vector_n operator+( const Array_n_const& v1, const Array_n_const& v2);
196  friend Vector_n operator-( const Array_n_const& v1, const Array_n_const& v2);
197  friend Vector_n operator*( Real a, const Array_n_const& v1);
198  friend Vector_n operator*( const Array_n_const& v1, Real a);
199  friend Vector_n operator/( const Array_n_const& v1, Real a);
200  friend Vector_n multiply( const Array_n_const& v1, const Array_n_const& v2);
201  friend Vector_n divide( const Array_n_const& v1, const Array_n_const& v2);
202  friend Vector_n min( const Array_n_const& v1, const Array_n_const& v2);
203  friend Vector_n max( const Array_n_const& v1, const Array_n_const& v2);
204 
205  Vector_n() {}
206  explicit Vector_n( Size n) : Base( _values, n) { RFC_assertion( n<=MAX); }
207  explicit Vector_n( Size n, Real x) : Base( _values, n)
208  { RFC_assertion(n<=MAX); std::fill( _start, _end, x); }
211 
212  operator const Array_n_const&() const {
213  return reinterpret_cast<const Base&>(*this);
214  }
215 
217  Base::operator=( v);
218  return *this;
219  }
220 
222  Base::operator+=( v);
223  return *this;
224  }
225 
227  Base::operator-=( v);
228  return *this;
229  }
230 
232  Base::operator*=( t);
233  return *this;
234  }
235 
237  RFC_assertion( _end-_start == v1._end-v1._start);
238  const Real *q=v1._start;
239  for ( Real *p=_start; p!=_end; ++p, ++q) *p *= *q;
240  return *this;
241  }
242 
244  Base::operator/=( t);
245  return *this;
246  }
247 
249  Base::operator/=( v);
250  return *this;
251  }
252 
254  Base::invert();
255  return *this;
256  }
257 
258 protected:
259  enum { MAX=9};
262  RFC_assertion( v.dimension() <= MAX);
264  }
265 };
266 
268  return *this = (const Array_n_const&)v;
269 }
271  return *this = (const Array_n_const&)v;
272 }
273 
274 inline bool operator==( const Array_n_const &v1, const Array_n_const& v2) {
275  if ( v1._end-v1._start != v2._end-v2._start) return false;
276  for ( const Real *p=v1._start, *q=v2._start; p!=v1._end; ++p,++q) {
277  if ( *p != *q) return false;
278  }
279  return true;
280 }
281 
282 inline Vector_n operator+( const Array_n_const& v1, const Array_n_const& v2) {
283  RFC_assertion( v1._end-v1._start == v2._end-v2._start);
284  Vector_n v3( v1._end-v1._start);
285  const Real *p=v1._start, *q=v2._start;
286  for ( Real *r=v3._start; p!=v1._end; ++p, ++q, ++r) *r = *p + *q;
287  return v3;
288 }
289 
290 inline Vector_n operator-( const Array_n_const& v1, const Array_n_const& v2) {
291  RFC_assertion( v1._end-v1._start == v2._end-v2._start);
292  Vector_n v3( v1._end-v1._start);
293 
294  const Real *p=v1._start, *q=v2._start;
295  for ( Real *r=v3._start; p!=v1._end; ++p, ++q, ++r)
296  *r = *p - *q;
297  return v3;
298 }
299 
300 inline Real operator*( const Array_n_const& v1, const Array_n_const& v2) {
301  RFC_assertion( v1._end-v1._start == v2._end-v2._start);
302  Real t(0);
303 
304  for ( const Real *p=v1._start, *q=v2._start; p!=v1._end; ++p, ++q)
305  t += *p * *q;
306  return t;
307 }
308 
309 inline Vector_n operator*( Real a, const Array_n_const& v1) {
310  Vector_n v2( v1._end-v1._start);
311  const Real *p=v1._start;
312  for ( Real *q=v2._start; p!=v1._end; ++p, ++q) *q = a * *p;
313  return v2;
314 }
315 
316 inline Vector_n operator*( const Array_n_const& v1, Real a) {
317  Vector_n v2( v1._end-v1._start);
318  const Real *p=v1._start;
319  for ( Real *q=v2._start; p!=v1._end; ++p, ++q) *q = a * *p;
320  return v2;
321 }
322 
323 inline Vector_n operator/( const Array_n_const& v1, Real a) {
324  Vector_n v2( v1._end-v1._start);
325  const Real *p=v1._start;
326  for ( Real *q=v2._start; p!=v1._end; ++p, ++q) *q = (a==0) ? 1.: *p / a;
327  return v2;
328 }
329 
330 inline Vector_n multiply( const Array_n_const& v1, const Array_n_const& v2) {
331  RFC_assertion( v1._end-v1._start == v2._end-v2._start);
332  Vector_n v3( v1._end-v1._start);
333  const Real *p=v1._start, *q=v2._start;
334  for ( Real *r=v3._start; p!=v1._end; ++p, ++q, ++r) *r = *p * *q;
335  return v3;
336 }
337 
338 inline Vector_n divide( const Array_n_const& v1, const Array_n_const& v2) {
339  RFC_assertion( v1._end-v1._start == v2._end-v2._start);
340  Vector_n v3( v1._end-v1._start);
341  const Real *p=v1._start, *q=v2._start;
342  for ( Real *r=v3._start; p!=v1._end; ++p, ++q, ++r) *r = (*q==0)? 1. : *p / *q;
343  return v3;
344 }
345 
346 inline Vector_n min( const Array_n_const& v1, const Array_n_const& v2) {
347  RFC_assertion( v1._end-v1._start == v2._end-v2._start);
348  Vector_n v3( v1._end-v1._start);
349  const Real *p=v1._start, *q=v2._start;
350  for ( Real *r=v3._start; p!=v1._end; ++p, ++q, ++r) *r = std::min(*p,*q);
351  return v3;
352 }
353 
354 inline Vector_n max( const Array_n_const& v1, const Array_n_const& v2) {
355  RFC_assertion( v1._end-v1._start == v2._end-v2._start);
356  Vector_n v3( v1._end-v1._start);
357  const Real *p=v1._start, *q=v2._start;
358  for ( Real *r=v3._start; p!=v1._end; ++p, ++q, ++r) *r = std::max(*p,*q);
359  return v3;
360 }
361 
362 std::ostream &operator<<( std::ostream &os, const Array_n_const& v);
363 
365 
366 #endif
367 
368 
369 
370 
371 
372 
Self & operator+=(const Array_n_const &v1)
Definition: Vector_n.h:138
unsigned int Size
Definition: Vector_n.h:56
Real * Pointer
Definition: Vector_n.h:52
Self & operator-=(const Array_n_const &v)
Definition: Vector_n.h:226
Vector_n divide(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:338
Vector_n(Size n)
Definition: Vector_n.h:206
CGAL_END_NAMESPACE CGAL_BEGIN_NAMESPACE bool operator==(const Origin &o, const Point_2< R > &p)
Definition: Point_2.h:239
Vector_3< T > operator*(T t, const Vector_3< T > &v)
Definition: mapbasic.h:139
Real squared_norm() const
Definition: Vector_n.h:84
Self & operator=(const Array_n_const &v)
Definition: Vector_n.h:216
Reference operator[](Size i)
Definition: Vector_n.h:116
Real const * Const_pointer
Definition: Vector_n.h:101
Self & operator*=(Real t)
Definition: Vector_n.h:231
Vector_n()
Definition: Vector_n.h:205
Vector_n(const Array_n_const &v)
Definition: Vector_n.h:261
Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:354
Real & Reference
Definition: Vector_n.h:102
Real * _end
Definition: Vector_n.h:181
Size dimension() const
Definition: Vector_n.h:79
friend Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:354
const Real * _start
Definition: Vector_n.h:91
Real const * Const_pointer
Definition: Vector_n.h:190
friend Vector_n multiply(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:330
Real * Pointer
Definition: Vector_n.h:189
double Real
Definition: mapbasic.h:322
Iterator_from_circulator< C, Ref, Ptr > operator+(Dist n, const Iterator_from_circulator< C, Ref, Ptr > &circ)
Definition: circulator.h:689
Self & operator=(const Self &)
Real Value
Definition: Vector_n.h:188
friend Vector_n operator-(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:290
Real Value
Definition: Vector_n.h:99
Size dimension() const
Definition: Vector_n.h:119
Self & operator*=(Real t)
Definition: Vector_n.h:152
Array_n()
Definition: Vector_n.h:108
const Real & Const_reference
Definition: Vector_n.h:103
Array_n Base
Definition: Vector_n.h:187
Vector_n multiply(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:330
friend Vector_n multiply(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:330
Vector_n Self
Definition: Vector_n.h:186
*********************************************************************Illinois Open Source License ****University of Illinois NCSA **Open Source License University of Illinois All rights reserved ****Developed free of to any person **obtaining a copy of this software and associated documentation to deal with the Software without including without limitation the rights to and or **sell copies of the and to permit persons to whom the **Software is furnished to do subject to the following this list of conditions and the following disclaimers ****Redistributions in binary form must reproduce the above **copyright this list of conditions and the following **disclaimers in the documentation and or other materials **provided with the distribution ****Neither the names of the Center for Simulation of Advanced the University of nor the names of its **contributors may be used to endorse or promote products derived **from this Software without specific prior written permission ****THE SOFTWARE IS PROVIDED AS WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **ARISING OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE v
Definition: roccomf90.h:20
Const_reference operator[](Size i) const
Definition: Vector_n.h:77
Real * Pointer
Definition: Vector_n.h:100
#define RFC_END_NAME_SPACE
Definition: rfc_basic.h:29
Const_pointer begin() const
Definition: Vector_n.h:81
*********************************************************************Illinois Open Source License ****University of Illinois NCSA **Open Source License University of Illinois All rights reserved ****Developed free of to any person **obtaining a copy of this software and associated documentation to deal with the Software without including without limitation the rights to ** copy
Definition: roccomf90.h:20
friend bool operator==(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:274
Array_n(Real *v1, Real *v2)
Definition: Vector_n.h:110
Const_pointer end() const
Definition: Vector_n.h:82
Real squared_norm() const
Definition: Vector_n.h:126
Const_reference operator[](Size i) const
Definition: Vector_n.h:117
Self & operator*=(const Array_n_const &v1)
Definition: Vector_n.h:236
friend Vector_n operator/(const Array_n_const &v1, Real a)
Definition: Vector_n.h:323
Self & operator/=(const Array_n_const &v1)
Definition: Vector_n.h:168
Array_n_const(const Real *v, Size n)
Definition: Vector_n.h:73
Array_n_const(const Real *v1, const Real *v2)
Definition: Vector_n.h:74
Pointer end()
Definition: Vector_n.h:124
Array_n(Real *v, Size n)
Definition: Vector_n.h:109
friend Real operator*(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:300
Self & operator/=(const Array_n_const &v)
Definition: Vector_n.h:248
Array_n(const Self &v)
Definition: Vector_n.h:111
Self & operator*=(const Array_n_const &v1)
Definition: Vector_n.h:156
blockLoc i
Definition: read.cpp:79
#define RFC_BEGIN_NAME_SPACE
Definition: rfc_basic.h:28
Const_pointer end() const
Definition: Vector_n.h:122
void int int REAL * x
Definition: read.cpp:74
friend Vector_n operator+(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:282
Self & operator/=(Real t)
Definition: Vector_n.h:163
const NT & n
const Real * _end
Definition: Vector_n.h:91
Self & operator/=(Real t)
Definition: Vector_n.h:243
Self & operator-=(const Array_n_const &v1)
Definition: Vector_n.h:145
Real * _start
Definition: Vector_n.h:181
Pointer begin()
Definition: Vector_n.h:123
friend Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:346
Vector_n(const Vector_n &v)
Definition: Vector_n.h:209
Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:346
NT q
Self & operator+=(const Array_n_const &v)
Definition: Vector_n.h:221
Array_n_const Self
Definition: Vector_n.h:50
friend Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:346
friend Vector_n operator-(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:290
Self & invert()
Definition: Vector_n.h:253
Real & Reference
Definition: Vector_n.h:191
Const_pointer begin() const
Definition: Vector_n.h:121
Real Value
Definition: Vector_n.h:51
Vector_n(Size n, Real x)
Definition: Vector_n.h:207
const Real & Const_reference
Definition: Vector_n.h:55
friend Vector_n operator*(Real a, const Array_n_const &v1)
Definition: Vector_n.h:309
Self & operator=(const Array_n_const &v)
Definition: Vector_n.h:128
std::ostream & operator<<(std::ostream &os, const COM_exception &ex)
Print out a given exception.
Real & Reference
Definition: Vector_n.h:54
friend Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:354
Real _values[MAX]
Definition: Vector_n.h:260
Self & invert()
Definition: Vector_n.h:175
const Real & Const_reference
Definition: Vector_n.h:192
Vector_n operator/(const Array_n_const &v1, Real a)
Definition: Vector_n.h:323
Real const * Const_pointer
Definition: Vector_n.h:53
#define RFC_assertion
Definition: rfc_basic.h:65
friend Vector_n divide(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:338
Array_n_const(const Self &v)
Definition: Vector_n.h:75
Point_2< R > operator-(const Origin &o, const Vector_2< R > &v)
unsigned int Size
Definition: Vector_n.h:104
unsigned int Size
Definition: Vector_n.h:193
friend Vector_n operator+(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:282
friend Vector_n divide(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:338
friend Vector_n operator/(const Array_n_const &v1, Real a)
Definition: Vector_n.h:323
Array_n Self
Definition: Vector_n.h:98