ThePEG  1.8.0
PhysicalQtyOps.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // PhysicalQtyOps.h is a part of ThePEG - Toolkit for HEP Event Generation
4 // Copyright (C) 2006-2011 David Grellscheid, Leif Lonnblad
5 //
6 // ThePEG is licenced under version 2 of the GPL, see COPYING for details.
7 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
8 //
9 #ifndef Physical_Qty_Ops_H
10 #define Physical_Qty_Ops_H
11 #include <cmath>
12 
17 namespace ThePEG {
19 
20 // qty = qty * qty
21 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
22  int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
23 inline Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,DL1*DL2,DE1*DE2,DQ1*DQ2>
24 operator*(Qty<L1,E1,Q1,DL1,DE1,DQ1> q1, Qty<L2,E2,Q2,DL2,DE2,DQ2> q2) {
25  typedef
26  Qty<L1*DL2+L2*DL1,E1*DE2+E2*DE1,Q1*DQ2+Q2*DQ1,DL1*DL2,DE1*DE2,DQ1*DQ2> RetT;
27  return RetT(q1.rawValue()*q2.rawValue()*RetT::baseunit());
28 }
29 
30 
31 // qty = qty / qty
32 template<int L1, int L2, int E1, int E2, int Q1, int Q2,
33  int DL1, int DL2, int DE1, int DE2, int DQ1, int DQ2>
34 inline Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,DL1*DL2,DE1*DE2,DQ1*DQ2>
35 operator/(Qty<L1,E1,Q1,DL1,DE1,DQ1> q1, Qty<L2,E2,Q2,DL2,DE2,DQ2> q2) {
36  typedef
37  Qty<L1*DL2-L2*DL1,E1*DE2-E2*DE1,Q1*DQ2-Q2*DQ1,DL1*DL2,DE1*DE2,DQ1*DQ2> RetT;
38  return RetT((q1.rawValue()/q2.rawValue())*RetT::baseunit());
39 }
40 
41 // qty = qty + qty
42 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
43 inline Qty<L,E,Q,DL,DE,DQ>
44 operator+(Qty<L,E,Q,DL,DE,DQ> q1,
45  Qty<QtyInt<L,DL,DL2>::I,
46  QtyInt<E,DE,DE2>::I,
47  QtyInt<Q,DQ,DQ2>::I,
48  DL2,DE2,DQ2> q2) {
49  Qty<L,E,Q,DL,DE,DQ> q = q1;
50  q += q2;
51  return q;
52 }
53 
54 // qty = qty - qty
55 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
56 inline Qty<L,E,Q,DL,DE,DQ>
57 operator-(Qty<L,E,Q,DL,DE,DQ> q1,
58  Qty<QtyInt<L,DL,DL2>::I,
59  QtyInt<E,DE,DE2>::I,
60  QtyInt<Q,DQ,DQ2>::I,
61  DL2,DE2,DQ2> q2) {
62  Qty<L,E,Q,DL,DE,DQ> q = q1;
63  q -= q2;
64  return q;
65 }
66 
67 // qty == qty
68 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
69 inline bool
70 operator==(Qty<L,E,Q,DL,DE,DQ> q1,
71  Qty<QtyInt<L,DL,DL2>::I,
72  QtyInt<E,DE,DE2>::I,
73  QtyInt<Q,DQ,DQ2>::I,
74  DL2,DE2,DQ2> q2) {
75  return q1.rawValue()==q2.rawValue();
76 }
77 
78 // qty != qty
79 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
80 inline bool
81 operator!=(Qty<L,E,Q,DL,DE,DQ> q1,
82  Qty<QtyInt<L,DL,DL2>::I,
83  QtyInt<E,DE,DE2>::I,
84  QtyInt<Q,DQ,DQ2>::I,
85  DL2,DE2,DQ2> q2) {
86  return q1.rawValue()!=q2.rawValue();
87 }
88 
89 // qty < qty
90 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
91 inline bool
92 operator<(Qty<L,E,Q,DL,DE,DQ> q1,
93  Qty<QtyInt<L,DL,DL2>::I,
94  QtyInt<E,DE,DE2>::I,
95  QtyInt<Q,DQ,DQ2>::I,
96  DL2,DE2,DQ2> q2) {
97  return q1.rawValue()<q2.rawValue();
98 }
99 
100 // qty <= qty
101 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
102 inline bool
103 operator<=(Qty<L,E,Q,DL,DE,DQ> q1,
104  Qty<QtyInt<L,DL,DL2>::I,
105  QtyInt<E,DE,DE2>::I,
106  QtyInt<Q,DQ,DQ2>::I,
107  DL2,DE2,DQ2> q2) {
108  return q1.rawValue()<=q2.rawValue();
109 }
110 
111 // qty > qty
112 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
113 inline bool
114 operator>(Qty<L,E,Q,DL,DE,DQ> q1,
115  Qty<QtyInt<L,DL,DL2>::I,
116  QtyInt<E,DE,DE2>::I,
117  QtyInt<Q,DQ,DQ2>::I,
118  DL2,DE2,DQ2> q2) {
119  return q1.rawValue()>q2.rawValue();
120 }
121 
122 // qty >= qty
123 template<int L, int E, int Q, int DL, int DE, int DQ, int DL2, int DE2, int DQ2>
124 inline bool
125 operator>=(Qty<L,E,Q,DL,DE,DQ> q1,
126  Qty<QtyInt<L,DL,DL2>::I,
127  QtyInt<E,DE,DE2>::I,
128  QtyInt<Q,DQ,DQ2>::I,
129  DL2,DE2,DQ2> q2) {
130  return q1.rawValue()>=q2.rawValue();
131 }
132 
133 // comparisons with ZERO
134 template<int L, int E, int Q, int DL, int DE, int DQ>
135 inline bool
136 operator==(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
137  return q1.rawValue() == 0.0;
138 }
139 template<int L, int E, int Q, int DL, int DE, int DQ>
140 inline bool
141 operator!=(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
142  return q1.rawValue() != 0.0;
143 }
144 template<int L, int E, int Q, int DL, int DE, int DQ>
145 inline bool
146 operator<(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
147  return q1.rawValue() < 0.0;
148 }
149 template<int L, int E, int Q, int DL, int DE, int DQ>
150 inline bool
151 operator>(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
152  return q1.rawValue() > 0.0;
153 }
154 template<int L, int E, int Q, int DL, int DE, int DQ>
155 inline bool
156 operator<=(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
157  return q1.rawValue() <= 0.0;
158 }
159 template<int L, int E, int Q, int DL, int DE, int DQ>
160 inline bool
161 operator>=(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
162  return q1.rawValue() >= 0.0;
163 }
164 
165 // qty = qty * double
166 template<int L, int E, int Q, int DL, int DE, int DQ>
167 inline Qty<L,E,Q,DL,DE,DQ>
168 operator*(Qty<L,E,Q,DL,DE,DQ> q,double x) {
169  return q*=x;
170 }
171 
172 // qty = double * qty
173 template<int L, int E, int Q, int DL, int DE, int DQ>
174 inline Qty<L,E,Q,DL,DE,DQ>
175 operator*(double x,Qty<L,E,Q,DL,DE,DQ> q) {
176  return q*=x;
177 }
178 
179 // qty = qty / double
180 template<int L, int E, int Q, int DL, int DE, int DQ>
181 inline Qty<L,E,Q,DL,DE,DQ>
182 operator/(Qty<L,E,Q,DL,DE,DQ> q,double x) {
183  return q/=x;
184 }
185 
186 // qty = double / qty
187 template<int L, int E, int Q, int DL, int DE, int DQ>
188 inline Qty<-L,-E,-Q,DL,DE,DQ>
189 operator/(double x, Qty<L,E,Q,DL,DE,DQ> q) {
190  typedef Qty<-L,-E,-Q,DL,DE,DQ> RetT;
191  return RetT((x/q.rawValue())*RetT::baseunit());
192 }
193 
194 // qty = -qty
195 template<int L, int E, int Q, int DL, int DE, int DQ>
196 inline Qty<L,E,Q,DL,DE,DQ>
197 operator-(Qty<L,E,Q,DL,DE,DQ> q) {
198  return Qty<L,E,Q,DL,DE,DQ>(-q.rawValue()*Qty<L,E,Q,DL,DE,DQ>::baseunit());
199 }
200 
201 // qty = sqr(qty)
202 template<int L, int E, int Q, int DL, int DE, int DQ>
203 inline Qty<2*L,2*E,2*Q,DL,DE,DQ>
204 sqr(Qty<L,E,Q,DL,DE,DQ> q) {
205  return q*q;
206 }
207 
208 // qty = sqrt(qty)
209 template<int L, int E, int Q, int DL, int DE, int DQ>
210 inline Qty<L,E,Q,DL*2,DE*2,DQ*2>
211 sqrt(Qty<L,E,Q,DL,DE,DQ> q) {
212  typedef Qty<L,E,Q,DL*2,DE*2,DQ*2> RetT;
213  return RetT(std::sqrt(q.rawValue())*RetT::baseunit());
214 }
215 
216 // double = atan2(y,x)
217 template<int L, int E, int Q, int DL, int DE, int DQ>
218 inline double
219 atan2(Qty<L,E,Q,DL,DE,DQ> y, Qty<L,E,Q,DL,DE,DQ> x) {
220  return std::atan2(y.rawValue(), x.rawValue());
221 }
222 
223 // qty = abs(qty)
224 template<int L, int E, int Q, int DL, int DE, int DQ>
225 inline Qty<L,E,Q,DL,DE,DQ>
226 abs(Qty<L,E,Q,DL,DE,DQ> q) {
227  typedef Qty<L,E,Q,DL,DE,DQ> RetT;
228  return RetT(std::abs(q.rawValue())*RetT::baseunit());
229 }
230 
231 // qty = pow<P,R>(qty)
232 template<int P, int R, int L, int E, int Q, int DL, int DE, int DQ>
233 Qty<P*L,P*E,P*Q,R*DL,R*DE,R*DQ> pow(Qty<L,E,Q,DL,DE,DQ> q) {
234  typedef Qty<P*L,P*E,P*Q,R*DL,R*DE,R*DQ> RetT;
235  return RetT(std::pow(q.rawValue(),double(P)/double(R))*RetT::baseunit());
236 }
237 
238 // max for T,U types
239 template<typename T, typename U>
240 inline
241 T max(const T & t, const U & u) {
242  const T & utmp = u;
243  return std::max(t, utmp);
244 }
245 
246 // ZeroUnit in front should take U type
247 template<typename U>
248 inline
249 U max(const ZeroUnit & t, const U & u) {
250  const U & ttmp = t;
251  return std::max(ttmp, u);
252 }
253 
254 // min for T,U types
255 template<typename T, typename U>
256 inline
257 T min(const T & t, const U & u) {
258  const T & utmp = u;
259  return std::min(t, utmp);
260 }
261 
262 // ZeroUnit in front should take U type
263 template<typename U>
264 inline
265 U min(const ZeroUnit & t, const U & u) {
266  const U & ttmp = t;
267  return std::min(ttmp, u);
268 }
269 
270 
272 }
273 
274 #endif
This is the main namespace within which all identifiers in ThePEG are declared.
Definition: FactoryBase.h:28
static Qty< L, E, Q, DL, DE, DQ > baseunit()
Basic unit of this quantity.
Definition: PhysicalQty.h:108