PSCF v1.1
Vec.h
1#ifndef PSCF_VEC_H
2#define PSCF_VEC_H
3
4/*
5* PSCF - Polymer Self-Consistent Field Theory
6*
7* Copyright 2016 - 2022, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include <util/global.h>
12#include <util/accumulators/setToZero.h>
13#include <iostream>
14
15using namespace Util;
16
17namespace Pscf
18{
19
64 template <int D, typename T>
65 class Vec
66 {
67
68 public:
69
71
72
76 Vec<D, T>();
77
83 Vec<D, T>(const Vec<D, T>& v);
84
90 explicit Vec<D, T>(T const * v);
91
97 explicit Vec<D, T>(T s);
98
100
102
103
111
119
126
128
130
138 void operator += (const Vec<D, T>& dv);
139
147 void operator -= (const Vec<D, T>& dv);
148
154 void operator += (T s);
155
161 void operator -= (T s);
162
170 void operator *= (T s);
171
173
175
182 const T& operator [] (int i) const;
183
190 T& operator [] (int i);
191
193
195
205 Vec<D, T>& add(const Vec<D, T>& v1, const Vec<D, T>& v2);
206
216 Vec<D, T>& subtract(const Vec<D, T>& v1, const Vec<D, T>& v2);
217
227 Vec<D, T>& multiply(const Vec<D, T>& v, T s);
228
238
247
249
258 template <class Archive>
259 void serialize(Archive& ar, const unsigned int version);
260
261 private:
262
264 static const int Width = 25;
265
267 static const int Precision = 17;
268
270 T elem_[D];
271
272 };
273
274 // Associated functions
275
283 template <int D, typename T>
284 inline
285 T dot(Vec<D, T> const & v1, Vec<D, T> const & v2)
286 {
287 T value;
288 setToZero(value);
289 for (int i = 0; i < D; ++i) {
290 value += v1[i]*v2[i];
291 }
292 return value;
293 }
294
302 template <int D, typename T>
303 inline
304 Vec<D, T> operator + (Vec<D, T> const & v1, Vec<D, T> const & v2)
305 {
306 Vec<D, T> value;
307 value.add(v1, v2);
308 return value;
309 }
310
311 // Inline method definitions
312
313 /*
314 * Default constructor
315 */
316 template <int D, typename T>
318 {}
319
320 /*
321 * Copy constructor
322 */
323 template <int D, typename T>
324 inline Vec<D, T>::Vec(const Vec<D, T>& v)
325 {
326 for (int i = 0; i < D; ++i) {
327 elem_[i] = v.elem_[i];
328 }
329 }
330
331 /*
332 * Constructor, from C-Array.
333 */
334 template <int D, typename T>
335 inline Vec<D, T>::Vec(T const * v)
336 {
337 for (int i = 0; i < D; ++i) {
338 elem_[i] = v[i];
339 }
340 }
341
342 /*
343 * Constructor, initialize all elements to a scalar value s.
344 */
345 template <int D, typename T>
346 inline Vec<D, T>::Vec(T s)
347 {
348 for (int i = 0; i < D; ++i) {
349 elem_[i] = s;
350 }
351 }
352
353 /*
354 * Assignment.
355 */
356 template <int D, typename T>
358 {
359 for (int i = 0; i < D; ++i) {
360 elem_[i] = v.elem_[i];
361 }
362 return *this;
363 }
364
365 /*
366 * Assign all elements to a common scalar value.
367 */
368 template <int D, typename T>
370 {
371 for (int i = 0; i < D; ++i) {
372 elem_[i] = s;
373 }
374 return *this;
375 }
376
377 /*
378 * Set all elements of a 3D vector to zero.
379 */
380 template <int D, typename T>
382 {
383 for (int i = 0; i < D; ++i) {
384 setToZero(elem_[i]);
385 }
386 return *this;
387 }
388
389 /*
390 * Add vector dv to this vector.
391 */
392 template <int D, typename T>
393 inline void Vec<D, T>::operator += (const Vec<D, T>& dv)
394 {
395 for (int i = 0; i < D; ++i) {
396 elem_[i] += dv.elem_[i];
397 }
398 }
399
400 /*
401 * Subtract vector dv from this vector.
402 */
403 template <int D, typename T>
404 inline void Vec<D, T>::operator -= (const Vec<D, T>& dv)
405 {
406 for (int i = 0; i < D; ++i) {
407 elem_[i] -= dv.elem_[i];
408 }
409 }
410
411 /*
412 * Add a common scalar to all components.
413 */
414 template <int D, typename T>
415 inline void Vec<D, T>::operator += (T s)
416 {
417 for (int i = 0; i < D; ++i) {
418 elem_[i] += s;
419 }
420 }
421
422 /*
423 * Subtract a common scalar from all components.
424 */
425 template <int D, typename T>
426 inline void Vec<D, T>::operator -= (T s)
427 {
428 for (int i = 0; i < D; ++i) {
429 elem_[i] -= s;
430 }
431 }
432
433 /*
434 * Multiply this vector by scalar s.
435 */
436 template <int D, typename T>
437 inline void Vec<D, T>::operator *= (T s)
438 {
439 for (int i = 0; i < D; ++i) {
440 elem_[i] *= s;
441 }
442 }
443
444 /*
445 * Return one Cartesian element by value.
446 */
447 template <int D, typename T>
448 inline const T& Vec<D, T>::operator [] (int i) const
449 {
450 assert(i >=0);
451 assert(i < D);
452 return elem_[i];
453 }
454
455 /*
456 * Return a reference to one element of the vector.
457 */
458 template <int D, typename T>
459 inline T& Vec<D, T>::operator [] (int i)
460 {
461 assert(i >=0);
462 assert(i < D);
463 return elem_[i];
464 }
465
466 /*
467 * Add vectors v1 and v2.
468 *
469 * Upon return, *this = v1 + v2.
470 */
471 template <int D, typename T>
472 inline
474 Vec<D, T> const & v2)
475 {
476 for (int i = 0; i < D; ++i) {
477 elem_[i] = v1.elem_[i] + v2.elem_[i];
478 }
479 return *this;
480 }
481
482 /*
483 * Subtract vector v2 from v1.
484 *
485 * Upon return, *this = v1 - v2.
486 * \return modified invoking vector
487 */
488 template <int D, typename T>
489 inline
491 {
492 for (int i = 0; i < D; ++i) {
493 elem_[i] = v1.elem_[i] - v2.elem_[i];
494 }
495 return *this;
496 }
497
498 /*
499 * Multiply a vector v by a scalar s.
500 *
501 * Upon return, *this = v*s.
502 */
503 template <int D, typename T>
504 inline
506 {
507 for (int i = 0; i < D; ++i) {
508 elem_[i] = v.elem_[i]*s;
509 }
510 return *this;
511 }
512
513 /*
514 * Compute and return negation of a vector.
515 *
516 * Upon return, *this = -v.
517 */
518 template <int D, typename T>
519 inline
521 {
522 for (int i = 0; i < D; ++i) {
523 elem_[i] = -v.elem_[i];
524 }
525 return *this;
526 }
527
528 /*
529 * Negate (reverse sign) of this vector.
530 *
531 * Upon return, *this = -v.
532 */
533 template <int D, typename T>
534 inline
536 {
537 for (int i = 0; i < D; ++i) {
538 elem_[i] = -elem_[i];
539 }
540 return *this;
541 }
542
543 /*
544 * Serialize to/from an archive.
545 */
546 template <int D, typename T>
547 template <class Archive>
548 inline
549 void Vec<D, T>::serialize(Archive& ar, const unsigned int version)
550 {
551 for (int i = 0; i < D; ++i) {
552 ar & elem_[i];
553 }
554 }
555
556}
557#endif
A Vec<D, T><D,T> is a D-component vector with elements of type T.
Definition: Vec.h:66
Vec< D, T > & subtract(const Vec< D, T > &v1, const Vec< D, T > &v2)
Subtract vector v2 from v1.
Definition: Vec.h:490
const T & operator[](int i) const
Return one Cartesian element by value.
Definition: Vec.h:448
Vec()
Default constructor.
Definition: Vec.h:317
Vec< D, T > & negate()
Negate all elements of this vector.
Definition: Vec.h:535
void operator*=(T s)
Multiply this vector by scalar s.
Definition: Vec.h:437
void operator+=(const Vec< D, T > &dv)
Add vector dv to this vector.
Definition: Vec.h:393
Vec< D, T > & multiply(const Vec< D, T > &v, T s)
Multiply a vector v by a scalar s.
Definition: Vec.h:505
Vec< D, T > & add(const Vec< D, T > &v1, const Vec< D, T > &v2)
Add vectors v1 and v2.
Definition: Vec.h:473
Vec< D, T > & operator=(const Vec< D, T > &v)
Copy assignment.
Definition: Vec.h:357
Vec< D, T > & setToZero()
Set all elements to zero.
Definition: Vec.h:381
void serialize(Archive &ar, const unsigned int version)
Serialize to/from an archive.
Definition: Vec.h:549
Vec< D, T > & negate(const Vec< D, T > &v)
Return negative of vector v.
Definition: Vec.h:520
void operator-=(const Vec< D, T > &dv)
Subtract vector dv from this vector.
Definition: Vec.h:404
File containing preprocessor macros for error handling.
C++ namespace for polymer self-consistent field theory (PSCF).
T dot(Vec< D, T > const &v1, Vec< D, T > const &v2)
Return dot product of two vectors.
Definition: Vec.h:285
Utility classes for scientific computation.
Definition: accumulators.mod:1
Rational operator+(Rational const &a, Rational const &b)
Compute sum of two rationals.
Definition: Rational.h:490
void setToZero(int &value)
Set an int variable to zero.
Definition: setToZero.h:25