criptic v1
Cosmic Ray Interstellar Propagation Tool using Itô Calculus
Loading...
Searching...
No Matches
FieldQty.H
Go to the documentation of this file.
1
13#ifndef _FIELDQTY_H_
14#define _FIELDQTY_H_
15
16#include <array>
17#include <string>
18#include <vector>
19#include "CRPacket.H"
20#include "../Definitions.H"
21#include "../Utils/Constants.H"
22#include "../Utils/RealTensor2.H"
23#include "../Utils/Types.H"
24#include "../Utils/Units.H"
25#include "../Utils/Vec3.H"
26
27namespace criptic {
28
38
40 // FieldQty class
42
53 class FieldQty {
54
55 public:
56
57 std::array<Real,nFieldQty> q;
59 // Names and units of field quantities -- used in ASCII output
60 static constexpr int qtyNameLen = 8;
62 static constexpr std::array<char[qtyNameLen],nFieldQty> qtyNames =
63 {{ "nden", "pres", "eden" }};
65 static constexpr std::array<Real,nFieldQty> qtyUnits = {
67 };
73 for (int i = 0; i < nFieldQty; i++) q[i] = 0;
74 }
75
79 void setZero() {
80 for (int i=0; i<nFieldQty; i++) q[i] = 0.0;
81 }
82
92 std::array<Real,nFieldQty> getWgt(const CRPacket& pkt) const {
93 std::array<Real,nFieldQty> w;
94 w[ndenIdx] = pkt.w;
95 w[presIdx] = pkt.w * pkt.v() * pkt.p;
96 w[edenIdx] = pkt.w * pkt.T();
97 return w;
98 }
99
110 void addPacket(const CRPacket& pkt,
111 const RealVec& r,
112 const RealTensor2& h2Inv) {
113 Real k = std::exp( -0.5 * h2Inv.contract(r, r) );
114 q[ndenIdx] += k * pkt.w;
115 q[presIdx] += k * pkt.w * pkt.v() * pkt.p;
116 q[edenIdx] += k * pkt.w * pkt.T();
117 }
118
126 return q[i];
127 }
134 const Real& operator [] (int i) const {
135 return q[i];
136 }
137
138 // Binary operations with two FieldQty objects
139
146 FieldQty operator+(const FieldQty& a) const {
147 FieldQty fq;
148 for (int i=0; i<nFieldQty; i++) fq.q[i] = q[i] + a.q[i];
149 return fq;
150 }
157 FieldQty operator-(const FieldQty& a) const {
158 FieldQty fq;
159 for (int i=0; i<nFieldQty; i++) fq.q[i] = q[i] - a.q[i];
160 return fq;
161 }
168 std::array<Real,nFieldQty> operator/(const FieldQty& a) const {
169 std::array<Real,nFieldQty> arr;
170 for (int i=0; i<nFieldQty; i++) arr[i] = q[i] / a.q[i];
171 return arr;
172 }
173
174 // Binary operations with scalars
181 FieldQty operator*(const Real a) const {
182 FieldQty fq;
183 for (int i=0; i<nFieldQty; i++) fq.q[i] = q[i] * a;
184 return fq;
185 }
192 FieldQty operator/(const Real a) const {
193 FieldQty fq;
194 for (int i=0; i<nFieldQty; i++) fq.q[i] = q[i] / a;
195 return fq;
196 }
197
198 // Unary operations with scalars
206 for (int i=0; i<nFieldQty; i++) q[i] *= a;
207 return *this;
208 }
216 for (int i=0; i<nFieldQty; i++) q[i] /= a;
217 return *this;
218 }
219
220 // Unary operations with field quantities
228 for (int i=0; i<nFieldQty; i++) q[i] += a.q[i];
229 return *this;
230 }
238 for (int i=0; i<nFieldQty; i++) q[i] -= a.q[i];
239 return *this;
240 }
241
242 }; // end class FieldQty
243
251 const criptic::FieldQty& fq) {
252 FieldQty f;
253 for (int i=0; i<nFieldQty; i++) f.q[i] = a * fq.q[i];
254 return f;
255 }
256
264 const criptic::FieldQty& q2) {
265 FieldQty f;
266 for (int i=0; i<nFieldQty; i++)
267 f.q[i] = std::min(q1.q[i], q2.q[i]);
268 return f;
269 }
270
278 const criptic::FieldQty& q2) {
279 FieldQty f;
280 for (int i=0; i<nFieldQty; i++)
281 f.q[i] = std::max(q1.q[i], q2.q[i]);
282 return f;
283 }
284
286 // FieldQtyGrad class
288
294
295 public:
296
297 std::array<RealVec,nFieldQty> qGrad;
304 for (int i = 0; i < nFieldQty; i++) qGrad[i] = 0;
305 }
306
310 void setZero() {
311 for (int i=0; i<nFieldQty; i++) qGrad[i] = 0.0;
312 }
313
324 void addPacket(const CRPacket& pkt,
325 const RealVec& r,
326 const RealTensor2& h2Inv) {
327 RealVec hr = h2Inv * r;
328 RealVec dk = -hr * std::exp( -hr.dot(r) / 2);
329 qGrad[ndenIdx] += dk * pkt.w;
330 qGrad[presIdx] += dk * pkt.w * pkt.v() * pkt.p;
331 qGrad[edenIdx] += dk * pkt.w * pkt.T();
332 }
333
341 return qGrad[i];
342 }
349 const RealVec& operator [] (int i) const {
350 return qGrad[i];
351 }
352
353 // Binary operations involving two FieldQtyGrad objects
361 FieldQtyGrad fqg;
362 for (int i=0; i<nFieldQty; i++)
363 fqg.qGrad[i] = qGrad[i] + a.qGrad[i];
364 return fqg;
365 }
373 FieldQtyGrad fqg;
374 for (int i=0; i<nFieldQty; i++)
375 fqg.qGrad[i] = qGrad[i] - a.qGrad[i];
376 return fqg;
377 }
384 std::array<RealVec,nFieldQty> operator/(const FieldQtyGrad& a) const {
385 std::array<RealVec,nFieldQty> arr;
386 for (int i=0; i<nFieldQty; i++) arr[i] = qGrad[i] / a.qGrad[i];
387 return arr;
388 }
389
390 // Binary operations with scalars
397 FieldQtyGrad operator*(const Real a) const {
398 FieldQtyGrad fqg;
399 for (int i=0; i<nFieldQty; i++)
400 fqg.qGrad[i] = qGrad[i] * a;
401 return fqg;
402 }
409 FieldQtyGrad operator/(const Real a) const {
410 FieldQtyGrad fqg;
411 for (int i=0; i<nFieldQty; i++)
412 fqg.qGrad[i] = qGrad[i] / a;
413 return fqg;
414 }
415
416 // Binary operations with vectors
424 FieldQtyGrad fqg;
425 for (int i=0; i<nFieldQty; i++)
426 fqg.qGrad[i] = qGrad[i] * a;
427 return fqg;
428 }
429
430 // Unary operations with scalars
438 for (int i=0; i<nFieldQty; i++) qGrad[i] *= a;
439 return *this;
440 }
448 for (int i=0; i<nFieldQty; i++) qGrad[i] /= a;
449 return *this;
450 }
451
452 // Unary operations with field quantity gradients
460 for (int i=0; i<nFieldQty; i++) qGrad[i] += a.qGrad[i];
461 return *this;
462 }
470 for (int i=0; i<nFieldQty; i++) qGrad[i] -= a.qGrad[i];
471 return *this;
472 }
473
474 }; // end FieldQtyGrad
475
483 const criptic::FieldQtyGrad& fqg) {
484 FieldQtyGrad f;
485 for (int i=0; i<nFieldQty; i++) f.qGrad[i] = a * fqg.qGrad[i];
486 return f;
487 }
488
496 const criptic::FieldQtyGrad& fqg) {
497 FieldQtyGrad f;
498 for (int i=0; i<nFieldQty; i++) f.qGrad[i] = a * fqg.qGrad[i];
499 return f;
500 }
501
509 const criptic::FieldQtyGrad& q2) {
510 FieldQtyGrad f;
511 for (int i=0; i<nFieldQty; i++)
512 f[i] = min(q1[i], q2[i]);
513 return f;
514 }
515
523 const criptic::FieldQtyGrad& q2) {
524 FieldQtyGrad f;
525 for (int i=0; i<nFieldQty; i++)
526 f[i] = max(q1[i], q2[i]);
527 return f;
528 }
529
530} // end namespace criptic
531
532
533
534// Overload the >> and << operators to make it easy to do IO on field
535// quantities
543std::istream& operator>>(std::istream& is,
545
553std::istream& operator>>(std::istream& is,
555
563std::ostream& operator<<(std::ostream& os,
564 const criptic::FieldQty& fQ);
565
573std::ostream& operator<<(std::ostream& os,
574 const criptic::FieldQtyGrad& fQG);
575
576#endif
577// _FIELDQTY_H_
Class to hold data on a CR packet.
std::ostream & operator<<(std::ostream &os, const criptic::FieldQty &fQ)
ASCII-formatted write of field quantities to stream.
Definition FieldQty.cpp:37
std::istream & operator>>(std::istream &is, criptic::FieldQty &fQ)
ASCII-formatted read of field quantities from stream.
Definition FieldQty.cpp:17
A class that holds data to describe a CR packet.
Definition CRPacket.H:28
Real v() const
Velocity of packet.
Definition CRPacket.H:118
Real T() const
Kinetic energy of packet.
Definition CRPacket.H:94
Real w
Definition CRPacket.H:48
Real p
Definition CRPacket.H:47
Class to hold and compute gradients of field quantities.
Definition FieldQty.H:293
std::array< RealVec, nFieldQty > qGrad
Definition FieldQty.H:297
void setZero()
Set all field quantities to zero.
Definition FieldQty.H:310
void addPacket(const CRPacket &pkt, const RealVec &r, const RealTensor2 &h2Inv)
Add contribution of packet at target point.
Definition FieldQty.H:324
std::array< RealVec, nFieldQty > operator/(const FieldQtyGrad &a) const
Divide two FieldQtyGrad objects.
Definition FieldQty.H:384
RealVec & operator[](int i)
Return an element of the FieldQtyGrad.
Definition FieldQty.H:340
FieldQtyGrad & operator+=(const FieldQtyGrad &a)
Add a FieldQtyGrad object to this one.
Definition FieldQty.H:459
FieldQtyGrad operator*(const RealVec &a) const
Multiply a FieldQtyGrad by a scalar.
Definition FieldQty.H:423
FieldQtyGrad & operator*=(const Real &a)
Multiply a FieldQtyGrad by a scalar.
Definition FieldQty.H:437
FieldQtyGrad operator*(const Real a) const
Multiply a FieldQtyGrad by a scalar.
Definition FieldQty.H:397
FieldQtyGrad operator/(const Real a) const
Divide a FieldQtyGrad by a scalar.
Definition FieldQty.H:409
FieldQtyGrad operator-(const FieldQtyGrad &a) const
Subtract two FieldQtyGrad objects.
Definition FieldQty.H:372
FieldQtyGrad & operator-=(const FieldQtyGrad &a)
Subtract a FieldQtyGrad object from this one.
Definition FieldQty.H:469
FieldQtyGrad()
Construct a field quantity gradient filled with zeros.
Definition FieldQty.H:303
FieldQtyGrad operator+(const FieldQtyGrad &a) const
Add two FieldQtyGrad objects.
Definition FieldQty.H:360
FieldQtyGrad & operator/=(const Real &a)
Divide a FieldQty by a scalar.
Definition FieldQty.H:447
Class to hold and compute field quantities.
Definition FieldQty.H:53
FieldQty & operator+=(const FieldQty &a)
Add a FieldQty object to this one.
Definition FieldQty.H:227
FieldQty operator-(const FieldQty &a) const
Subtract two FieldQty objects.
Definition FieldQty.H:157
std::array< Real, nFieldQty > operator/(const FieldQty &a) const
Divide two FieldQty objects.
Definition FieldQty.H:168
void setZero()
Set all field quantities to zero.
Definition FieldQty.H:79
FieldQty()
Construct a field quantity filled with zeros.
Definition FieldQty.H:72
void addPacket(const CRPacket &pkt, const RealVec &r, const RealTensor2 &h2Inv)
Add contribution of packet to field quantities at target point.
Definition FieldQty.H:110
FieldQty operator+(const FieldQty &a) const
Add two FieldQty objects.
Definition FieldQty.H:146
FieldQty & operator/=(const Real &a)
Divide a FieldQty by a scalar.
Definition FieldQty.H:215
FieldQty operator*(const Real a) const
Multiply a FieldQty by a scalar.
Definition FieldQty.H:181
static constexpr std::array< Real, nFieldQty > qtyUnits
Definition FieldQty.H:65
FieldQty operator/(const Real a) const
Divide a FieldQty by a scalar.
Definition FieldQty.H:192
std::array< Real, nFieldQty > getWgt(const CRPacket &pkt) const
Get weight with which packet contributes to field quantities.
Definition FieldQty.H:92
static constexpr int qtyNameLen
Definition FieldQty.H:60
std::array< Real, nFieldQty > q
Definition FieldQty.H:57
static constexpr std::array< char[qtyNameLen], nFieldQty > qtyNames
Definition FieldQty.H:62
FieldQty & operator-=(const FieldQty &a)
Subtract a FieldQty object from this one.
Definition FieldQty.H:237
Real & operator[](int i)
Return an element of the FieldQty.
Definition FieldQty.H:125
FieldQty & operator*=(const Real &a)
Multiply a FieldQty by a scalar.
Definition FieldQty.H:205
Class that represents a rank 2 tensor.
Definition RealTensor2.H:34
Real contract(const RealVec &a, const RealVec &b) const
Compute the tensor contraction a_i b_j T_ij.
Definition RealTensor2.H:395
auto dot(const Vec3< U > &a) const
Returns the dot product of this vector with another vector.
Definition Vec3.H:575
static constexpr Real mp_c2
Definition Constants.H:118
static constexpr Real kB
Definition Constants.H:41
static constexpr Real eV
Definition Units.H:34
The primary namespace for criptic objects.
Definition AdvancePacket.H:25
criptic::FieldQty max(const criptic::FieldQty &q1, const criptic::FieldQty &q2)
Take elementwise maximum of two FieldQty objects.
Definition FieldQty.H:277
double Real
Definition Types.H:38
FieldQtyType
Enum of field quantities.
Definition FieldQty.H:32
@ ndenIdx
Definition FieldQty.H:33
@ nFieldQty
Definition FieldQty.H:36
@ edenIdx
Definition FieldQty.H:35
@ presIdx
Definition FieldQty.H:34
criptic::FieldQty min(const criptic::FieldQty &q1, const criptic::FieldQty &q2)
Take elementwise minimum of two FieldQty objects.
Definition FieldQty.H:263
criptic::FieldQty operator*(const criptic::Real a, const criptic::FieldQty &fq)
Multiply a scalar by a FieldQty elementwise.
Definition FieldQty.H:250