LCOV - code coverage report
Current view: top level - src/module - AdiabaticCooling.cpp (source / functions) Coverage Total Hit
Test: coverage.info.cleaned Lines: 85.7 % 28 24
Test Date: 2026-06-18 09:49:19 Functions: 100.0 % 5 5

            Line data    Source code
       1              : #include "crpropa/module/AdiabaticCooling.h"
       2              : 
       3              : namespace crpropa {
       4              : 
       5            2 : AdiabaticCooling::AdiabaticCooling(ref_ptr<AdvectionField> advectionField) :
       6            2 :         advectionField(advectionField) {
       7            2 :         setLimit(0.1);
       8            2 : }
       9              : 
      10            1 : AdiabaticCooling::AdiabaticCooling(ref_ptr<AdvectionField> advectionField, double limit) :
      11            1 :         advectionField(advectionField) {
      12            1 :         setLimit(limit);
      13            1 : }
      14              : 
      15            2 : void AdiabaticCooling::process(Candidate *c) const {
      16              : 
      17            2 :         Vector3d pos = c->current.getPosition();
      18            2 :         double E = c->current.getEnergy(); // Note we use E=p/c (relativistic limit)
      19            2 :     double time = c->getTime();
      20              :         
      21              :         double Div = 0.;        
      22              :         try {
      23            2 :                 Div +=  advectionField->getDivergence(pos, time);
      24              :         } 
      25            0 :         catch (std::exception &e) {
      26            0 :                 KISS_LOG_ERROR  << "AdiabaticCooling: Exception in getDivergence.\n" 
      27            0 :                                 << e.what();
      28            0 :         }
      29              :         
      30            2 :         double dEdt = -E / 3. * Div;    // cooling due to advection -p/3 * div(V_wind)
      31              :                                         // (see e.g. Kopp et al. Computer Physics Communication 183
      32              :                                         // (2012) 530-542)
      33            2 :         double dt = c->getCurrentStep() / c_light;
      34            2 :         double dE = dEdt * dt;
      35              :         
      36            2 :         c->current.setEnergy(E + dE);
      37            2 :         if (dEdt==0) {
      38              :                 return;
      39              :         }       
      40            1 :         c->limitNextStep(limit * E / fabs(dEdt) *c_light);
      41              : }
      42              : 
      43            3 : void AdiabaticCooling::setLimit(double l) {
      44            3 :         limit = l;
      45            3 : }
      46              : 
      47            1 : double AdiabaticCooling::getLimit() const {
      48            1 :         return limit;
      49              : }
      50              :         
      51              :         
      52              : 
      53              : 
      54              : 
      55              : } // end namespace crpropa
        

Generated by: LCOV version 2.0-1