ckcomplex: define operators - and *
[charm.git] / src / util / ckcomplex.h
1 #ifndef __CKCOMPLEX_H__
2 #define __CKCOMPLEX_H__
3
4 #include "pup.h"
5
6 #if USE_FFTW_DECLS
7 #include "fftw.h"
8 typedef fftw_real  RealType;
9 #else
10 typedef double     RealType;
11 #endif
12
13 struct ckcomplex {
14     RealType  re;
15     RealType  im;   
16
17  
18     inline ckcomplex(RealType _re=0., RealType _im=0.): re(_re), im(_im){}
19     //    inline ckcomplex(RealType r) {re=r; im=0;}
20     //    inline ckcomplex(RealType r,RealType i) {re=r; im=i;}
21     
22     inline ~ckcomplex() {}
23
24     inline RealType getMagSqr(void) const { 
25       return re*re+im*im; 
26     }
27
28     inline ckcomplex operator+(ckcomplex a) { 
29       return ckcomplex(re+a.re,im+a.im); 
30     }
31
32     // note: not a member
33     inline friend ckcomplex operator-(ckcomplex lhs, ckcomplex rhs) {
34       return ckcomplex(lhs.re - rhs.re, lhs.im - rhs.im);
35     }
36
37     inline ckcomplex conj(void) { 
38         return ckcomplex(re, -im); 
39     }
40
41     inline void operator+=(ckcomplex a) { 
42       re+=a.re; im+=a.im; 
43     }
44     
45     // note: not a member
46     inline friend ckcomplex operator*(RealType lhs, ckcomplex rhs) {
47       return ckcomplex(rhs.re*lhs, rhs.im*lhs);
48     }
49
50     inline ckcomplex operator*(RealType a) { 
51       return ckcomplex(re*a, im*a); 
52     } 
53
54     inline bool notzero() const { return( (0.0 != re) ? true : (0.0 != im)); }
55
56     inline void operator*=(ckcomplex a) {        
57         RealType treal, tim;
58         treal = re * a.re - im * a.im;
59         tim = re * a.im + im * a.re;
60         re = treal;
61         im = tim;
62     }
63
64     inline ckcomplex operator*(ckcomplex a) {
65       return ckcomplex( re * a.re - im * a.im, re * a.im + im * a.re); 
66     }
67
68
69     inline void operator -= (ckcomplex a) {
70       re -= a.re; im -= a.im;
71     }
72
73
74     inline ckcomplex multiplyByi () {
75         return ckcomplex(-im, re);
76     }
77         
78     inline void * operator new[] (size_t size){
79         void *buf = malloc(size);
80         return buf;
81     }
82     
83     inline void operator delete[] (void *buf){
84         free(buf);
85     }
86 };
87
88 typedef ckcomplex complex;
89
90 PUPbytes(ckcomplex)
91
92 #endif