LCOV - code coverage report
Current view: top level - src/module - AdiabaticCooling.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 23 27 85.2 %
Date: 2024-04-29 14:43:01 Functions: 5 5 100.0 %

          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             :         
      20             :         double Div = 0.;        
      21             :         try {
      22           2 :                 Div +=  advectionField->getDivergence(pos);
      23             :         } 
      24           0 :         catch (std::exception &e) {
      25           0 :                 KISS_LOG_ERROR  << "AdiabaticCooling: Exception in getDivergence.\n" 
      26           0 :                                 << e.what();
      27           0 :         }
      28             :         
      29           2 :         double dEdt = -E / 3. * Div;    // cooling due to advection -p/3 * div(V_wind)
      30             :                                         // (see e.g. Kopp et al. Computer Physics Communication 183
      31             :                                         // (2012) 530-542)
      32           2 :         double dt = c->getCurrentStep() / c_light;
      33           2 :         double dE = dEdt * dt;
      34             :         
      35           2 :         c->current.setEnergy(E + dE);
      36           2 :         if (dEdt==0) {
      37             :                 return;
      38             :         }       
      39           1 :         c->limitNextStep(limit * E / fabs(dEdt) *c_light);
      40             : }
      41             : 
      42           3 : void AdiabaticCooling::setLimit(double l) {
      43           3 :         limit = l;
      44           3 : }
      45             : 
      46           1 : double AdiabaticCooling::getLimit() const {
      47           1 :         return limit;
      48             : }
      49             :         
      50             :         
      51             : 
      52             : 
      53             : 
      54             : } // end namespace crpropa

Generated by: LCOV version 1.14