Program Listing for File AdiabaticCooling.cpp

Return to documentation for file (src/module/AdiabaticCooling.cpp)

#include "crpropa/module/AdiabaticCooling.h"

namespace crpropa {

AdiabaticCooling::AdiabaticCooling(ref_ptr<AdvectionField> advectionField) :
        advectionField(advectionField) {
        setLimit(0.1);
}

AdiabaticCooling::AdiabaticCooling(ref_ptr<AdvectionField> advectionField, double limit) :
        advectionField(advectionField) {
        setLimit(limit);
}

void AdiabaticCooling::process(Candidate *c) const {

        Vector3d pos = c->current.getPosition();
        double E = c->current.getEnergy(); // Note we use E=p/c (relativistic limit)

        double Div = 0.;
        try {
                Div +=  advectionField->getDivergence(pos);
        }
        catch (std::exception &e) {
                KISS_LOG_ERROR  << "AdiabaticCooling: Exception in getDivergence.\n"
                                << e.what();
        }

        double dEdt = -E / 3. * Div;    // cooling due to advection -p/3 * div(V_wind)
                                        // (see e.g. Kopp et al. Computer Physics Communication 183
                                        // (2012) 530-542)
        double dt = c->getCurrentStep() / c_light;
        double dE = dEdt * dt;

        c->current.setEnergy(E + dE);
        if (dEdt==0) {
                return;
        }
        c->limitNextStep(limit * E / fabs(dEdt) *c_light);
}

void AdiabaticCooling::setLimit(double l) {
        limit = l;
}

double AdiabaticCooling::getLimit() const {
        return limit;
}





} // end namespace crpropa