Program Listing for File Nakanishi.cpp
↰ Return to documentation for file (src/massDistribution/Nakanishi.cpp
)
#include "crpropa/massDistribution/Nakanishi.h"
#include "crpropa/Common.h"
#include "kiss/logger.h"
#include <sstream>
namespace crpropa {
double Nakanishi::getHIScaleheight(const Vector3d &position) const {
double R = sqrt(pow_integer<2>(position.x)+pow_integer<2>(position.y)); // radius in galactic plane
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));
return scaleheight;
}
double Nakanishi::getHIPlanedensity(const Vector3d &position) const {
double R = sqrt(pow_integer<2>(position.x)+pow_integer<2>(position.y)); // radius in galactic plane
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))));
return planedensity;
}
double Nakanishi::getH2Scaleheight(const Vector3d &position) const {
double R = sqrt(pow_integer<2>(position.x)+ pow_integer<2>(position.y)); // radius in galactic plane
double scaleheight = 1.06*pc*( 10.8*exp(0.28*R/kpc)+42.78);
return scaleheight;
}
double Nakanishi::getH2Planedensity(const Vector3d &position) const {
double R = sqrt(pow_integer<2>(position.x)+pow_integer<2>(position.y)); // radius in galactic plane
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))));
return planedensity;
}
double Nakanishi::getHIDensity(const Vector3d &position) const {
double n = 0; // density
double planedensity = getHIPlanedensity(position);
double scaleheight = getHIScaleheight(position);
n = planedensity*pow(0.5,pow_integer<2>(position.z/scaleheight));
return n;
}
double Nakanishi::getH2Density(const Vector3d &position) const {
double n = 0; // density
double planedensity = getH2Planedensity(position);
double scaleheight = getH2Scaleheight(position);
n = planedensity*pow(0.5,pow_integer<2>(position.z/scaleheight));
return n;
}
double Nakanishi::getDensity(const Vector3d &position) const {
double n = 0;
if(isforHI)
n += getHIDensity(position);
if(isforH2)
n += getH2Density(position);
// check if all densities are deactivated and raise warning if so
if((isforHI || isforH2) == false){
KISS_LOG_WARNING
<< "\n"<<"Called getDensity on fully deactivated Nakanishi \n"
<< "gas density model. The total density is set to 0.";
}
return n;
}
double Nakanishi::getNucleonDensity(const Vector3d &position) const {
double n = 0;
if(isforHI)
n += getHIDensity(position);
if(isforH2)
n += 2*getH2Density(position); // weight 2 for molecular hydrogen
// check if all densities are deactivated and raise warning if so
if((isforHI || isforH2) == false){
KISS_LOG_WARNING
<< "\n"<<"Called getNucleonDensity on fully deactivated Nakanishi \n"
<< "gas density model. The total density is set to 0.";
}
return n;
}
bool Nakanishi::getIsForHI() {
return isforHI;
}
bool Nakanishi::getIsForHII() {
return isforHII;
}
bool Nakanishi::getIsForH2() {
return isforH2;
}
void Nakanishi::setIsForHI(bool HI) {
isforHI = HI;
}
void Nakanishi::setIsForH2(bool H2) {
isforH2 = H2;
}
std::string Nakanishi::getDescription() {
std::stringstream s;
s << "Density model Nakanishi:\n";
s<< "HI component is ";
if(isforHI==false)
s<< "not ";
s<< "active.\nH2 component is ";
if(isforH2==false)
s<<"not ";
s<<"active.\nNakanishi has no HII component.";
return s.str();
}
} // namespace crpropa