9 #ifndef Physical_Qty_Ops_H 10 #define Physical_Qty_Ops_H 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) {
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());
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) {
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());
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,
49 Qty<L,E,Q,DL,DE,DQ> q = q1;
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,
62 Qty<L,E,Q,DL,DE,DQ> q = q1;
68 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ,
int DL2,
int DE2,
int DQ2>
70 operator==(Qty<L,E,Q,DL,DE,DQ> q1,
75 return q1.rawValue()==q2.rawValue();
79 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ,
int DL2,
int DE2,
int DQ2>
81 operator!=(Qty<L,E,Q,DL,DE,DQ> q1,
86 return q1.rawValue()!=q2.rawValue();
90 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ,
int DL2,
int DE2,
int DQ2>
92 operator<(Qty<L,E,Q,DL,DE,DQ> q1,
93 Qty<QtyInt<L,DL,DL2>::I,
97 return q1.rawValue()<q2.rawValue();
101 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ,
int DL2,
int DE2,
int DQ2>
103 operator<=(Qty<L,E,Q,DL,DE,DQ> q1,
104 Qty<QtyInt<L,DL,DL2>::I,
108 return q1.rawValue()<=q2.rawValue();
112 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ,
int DL2,
int DE2,
int DQ2>
114 operator>(Qty<L,E,Q,DL,DE,DQ> q1,
119 return q1.rawValue()>q2.rawValue();
123 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ,
int DL2,
int DE2,
int DQ2>
125 operator>=(Qty<L,E,Q,DL,DE,DQ> q1,
130 return q1.rawValue()>=q2.rawValue();
134 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ>
136 operator==(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
137 return q1.rawValue() == 0.0;
139 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ>
141 operator!=(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
142 return q1.rawValue() != 0.0;
144 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ>
146 operator<(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
147 return q1.rawValue() < 0.0;
149 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ>
151 operator>(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
152 return q1.rawValue() > 0.0;
154 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ>
156 operator<=(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
157 return q1.rawValue() <= 0.0;
159 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ>
161 operator>=(Qty<L,E,Q,DL,DE,DQ> q1, ZeroUnit) {
162 return q1.rawValue() >= 0.0;
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) {
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) {
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) {
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());
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());
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) {
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());
217 template<
int L,
int E,
int Q,
int DL,
int DE,
int DQ>
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());
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());
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());
239 template<
typename T,
typename U>
241 T max(
const T & t,
const U & u) {
243 return std::max(t, utmp);
249 U max(
const ZeroUnit & t,
const U & u) {
251 return std::max(ttmp, u);
255 template<
typename T,
typename U>
257 T min(
const T & t,
const U & u) {
259 return std::min(t, utmp);
265 U min(
const ZeroUnit & t,
const U & u) {
267 return std::min(ttmp, u);
This is the main namespace within which all identifiers in ThePEG are declared.
static const int I
The new numerator.
static Qty< L, E, Q, DL, DE, DQ > baseunit()
Basic unit of this quantity.