Line data Source code
1 : #include "crpropa/massDistribution/Nakanishi.h"
2 : #include "crpropa/Common.h"
3 :
4 : #include "kiss/logger.h"
5 :
6 : #include <sstream>
7 :
8 : namespace crpropa {
9 :
10 8 : double Nakanishi::getHIScaleheight(const Vector3d &position) const {
11 8 : double R = sqrt(pow_integer<2>(position.x)+pow_integer<2>(position.y)); // radius in galactic plane
12 8 : double scaleheight = 1.06*pc*(116.3 +19.3*R/kpc+4.1*pow_integer<2>(R/kpc)-0.05*pow_integer<3>(R/kpc));
13 8 : return scaleheight;
14 : }
15 :
16 8 : double Nakanishi::getHIPlanedensity(const Vector3d &position) const {
17 8 : double R = sqrt(pow_integer<2>(position.x)+pow_integer<2>(position.y)); // radius in galactic plane
18 8 : double planedensity = 0.94/ccm*(0.6*exp(-R/(2.4*kpc))+0.24*exp(-pow_integer<2>((R-9.5*kpc)/(4.8*kpc))));
19 8 : return planedensity;
20 : }
21 :
22 :
23 8 : double Nakanishi::getH2Scaleheight(const Vector3d &position) const {
24 8 : double R = sqrt(pow_integer<2>(position.x)+ pow_integer<2>(position.y)); // radius in galactic plane
25 8 : double scaleheight = 1.06*pc*( 10.8*exp(0.28*R/kpc)+42.78);
26 8 : return scaleheight;
27 : }
28 :
29 8 : double Nakanishi::getH2Planedensity(const Vector3d &position) const {
30 8 : double R = sqrt(pow_integer<2>(position.x)+pow_integer<2>(position.y)); // radius in galactic plane
31 8 : double planedensity =0.94/ccm*(11.2*exp(-R*R/(0.874*kpc*kpc)) +0.83*exp(-pow_integer<2>((R-4*kpc)/(3.2*kpc))));
32 8 : return planedensity;
33 : }
34 :
35 6 : double Nakanishi::getHIDensity(const Vector3d &position) const {
36 : double n = 0; // density
37 6 : double planedensity = getHIPlanedensity(position);
38 6 : double scaleheight = getHIScaleheight(position);
39 6 : n = planedensity*pow(0.5,pow_integer<2>(position.z/scaleheight));
40 :
41 6 : return n;
42 : }
43 :
44 6 : double Nakanishi::getH2Density(const Vector3d &position) const {
45 : double n = 0; // density
46 6 : double planedensity = getH2Planedensity(position);
47 6 : double scaleheight = getH2Scaleheight(position);
48 6 : n = planedensity*pow(0.5,pow_integer<2>(position.z/scaleheight));
49 :
50 6 : return n;
51 : }
52 :
53 3 : double Nakanishi::getDensity(const Vector3d &position) const {
54 : double n = 0;
55 3 : if(isforHI)
56 2 : n += getHIDensity(position);
57 3 : if(isforH2)
58 2 : n += getH2Density(position);
59 :
60 : // check if all densities are deactivated and raise warning if so
61 3 : if((isforHI || isforH2) == false){
62 2 : KISS_LOG_WARNING
63 1 : << "\n"<<"Called getDensity on fully deactivated Nakanishi \n"
64 1 : << "gas density model. The total density is set to 0.";
65 : }
66 3 : return n;
67 : }
68 :
69 3 : double Nakanishi::getNucleonDensity(const Vector3d &position) const {
70 : double n = 0;
71 3 : if(isforHI)
72 2 : n += getHIDensity(position);
73 3 : if(isforH2)
74 2 : n += 2*getH2Density(position); // weight 2 for molecular hydrogen
75 :
76 : // check if all densities are deactivated and raise warning if so
77 3 : if((isforHI || isforH2) == false){
78 2 : KISS_LOG_WARNING
79 1 : << "\n"<<"Called getNucleonDensity on fully deactivated Nakanishi \n"
80 1 : << "gas density model. The total density is set to 0.";
81 : }
82 :
83 3 : return n;
84 : }
85 :
86 3 : bool Nakanishi::getIsForHI() {
87 3 : return isforHI;
88 : }
89 :
90 1 : bool Nakanishi::getIsForHII() {
91 1 : return isforHII;
92 : }
93 3 : bool Nakanishi::getIsForH2() {
94 3 : return isforH2;
95 : }
96 :
97 1 : void Nakanishi::setIsForHI(bool HI) {
98 1 : isforHI = HI;
99 1 : }
100 :
101 1 : void Nakanishi::setIsForH2(bool H2) {
102 1 : isforH2 = H2;
103 1 : }
104 :
105 0 : std::string Nakanishi::getDescription() {
106 0 : std::stringstream s;
107 0 : s << "Density model Nakanishi:\n";
108 0 : s<< "HI component is ";
109 0 : if(isforHI==false)
110 0 : s<< "not ";
111 0 : s<< "active.\nH2 component is ";
112 0 : if(isforH2==false)
113 0 : s<<"not ";
114 0 : s<<"active.\nNakanishi has no HII component.";
115 :
116 0 : return s.str();
117 0 : }
118 :
119 : } // namespace crpropa
|