Program Listing for File Massdistribution.cpp

Return to documentation for file (src/massDistribution/Massdistribution.cpp)

#include "crpropa/massDistribution/Massdistribution.h"
#include <sstream>
namespace crpropa {

void DensityList::addDensity(ref_ptr<Density> dens) {
        DensityList.push_back(dens);
}

double DensityList::getDensity(const Vector3d &position) const {
        double n = 0.;
        for (int i = 0; i < DensityList.size(); i++)
                n += DensityList[i]->getDensity(position);
        return n;
}

double DensityList::getHIDensity(const Vector3d &position) const {
        double n = 0.;
        for (int i = 0; i < DensityList.size(); i++)
                n += DensityList[i]->getHIDensity(position);
        return n;
}

double DensityList::getHIIDensity(const Vector3d &position) const {
        double n = 0.;
        for (int i = 0; i < DensityList.size(); i++)
                n += DensityList[i]->getHIIDensity(position);
        return n;
}

double DensityList::getH2Density(const Vector3d &position) const {
        double n = 0.;
        for (int i = 0; i < DensityList.size(); i++)
                n += DensityList[i]->getH2Density(position);
        return n;
}

double DensityList::getNucleonDensity(const Vector3d &position) const {
        double n = 0.;
        for (int i = 0; i < DensityList.size(); i++)
                n += DensityList[i]->getNucleonDensity(position);
        return n;
}

std::string DensityList::getDescription() {
        std::stringstream ss;
        ss << "DensityList with " << DensityList.size() << " modules: \n";
        for (int i = 0; i < DensityList.size(); i++) {
                ss << "density " << i + 1 << ": " << DensityList[i] -> getDescription();
        }

        return ss.str();
}

// ----------- DensityGrid -----------------------------------------------------------------

DensityGrid::DensityGrid(ref_ptr<Grid1f> grid, bool isForHI, bool isForHII, bool isForH2) :
        grid(grid), isForHI(isForHI), isForHII(isForHII), isForH2(isForH2) {
                checkAndWarn();
        }

void DensityGrid::checkAndWarn() {
        bool allDeactivated = (isForHI == false) && (isForHII == false) && (isForH2 == false);
        if (allDeactivated) {
                KISS_LOG_WARNING << "DensityGrid has all types deactivated."
                        << "In this case all output will be n = 0. \n"
                        << "Please activate the intended particle type. \n";
        }
}

double DensityGrid::getHIDensity(const Vector3d &position) const {
        if (isForHI)
                return grid -> interpolate(position);
        else
                return 0.;
}

double DensityGrid::getHIIDensity(const Vector3d &position) const {
        if (isForHII)
                return grid -> interpolate(position);
        else
                return 0.;
}

double DensityGrid::getH2Density(const Vector3d &position) const {
        if (isForH2)
                return grid -> interpolate(position);
        else
                return 0.;
}

double DensityGrid::getDensity(const Vector3d &position) const {
        double n = 0;
        n += getHIDensity(position);
        n += getHIIDensity(position);
        n += getH2Density(position);

        return n;
}

double DensityGrid::getNucleonDensity(const Vector3d &position) const {
        double n = 0;
        n += getHIDensity(position);
        n += getHIIDensity(position);
        n += 2 * getH2Density(position);

        return n;
}

bool DensityGrid::getIsForHI() {
        return isForHI;
}

bool DensityGrid::getIsForHII() {
        return isForHII;
}

bool DensityGrid::getIsForH2() {
        return isForH2;
}

void DensityGrid::setIsForHI(bool b) {
        isForHI = b;
        checkAndWarn();
}

void DensityGrid::setIsForHII(bool b) {
        isForHII = b;
        checkAndWarn();
}

void DensityGrid::setIsForH2(bool b) {
        isForH2 = b;
        checkAndWarn();
}

void DensityGrid::setGrid(ref_ptr<Grid1f> grid) {
        this->grid = grid;
}

std::string DensityGrid::getDescription() {
        std::stringstream ss;
        ss << "Density in a given grid \n";
        return ss.str();
}

} //namespace crpropa