LCOV - code coverage report
Current view: top level - test - testAdvectionField.cpp (source / functions) Coverage Total Hit
Test: coverage.info.cleaned Lines: 100.0 % 114 114
Test Date: 2026-06-18 09:49:19 Functions: 100.0 % 7 7

            Line data    Source code
       1              : #include "crpropa/advectionField/AdvectionField.h"
       2              : #include "crpropa/advectionField/TimeDependentAdvectionField.h"
       3              : #include "crpropa/Units.h"
       4              : #include "crpropa/Common.h"
       5              : 
       6              : #include "gtest/gtest.h"
       7              : #include <stdexcept>
       8              : #include <cmath>
       9              : 
      10              : namespace crpropa {
      11              : 
      12            2 : TEST(testUniformAdvectionField, SimpleTest) {
      13            1 :         UniformAdvectionField A(Vector3d(-1, 5, 3));
      14            1 :         Vector3d a = A.getField(Vector3d(1, 0, 0));
      15            1 :         double D = A.getDivergence(Vector3d(1, 0, 0));
      16            1 :         EXPECT_DOUBLE_EQ(a.x, -1);
      17            1 :         EXPECT_DOUBLE_EQ(a.y, 5);
      18            1 :         EXPECT_DOUBLE_EQ(a.z, 3);
      19            1 :         EXPECT_DOUBLE_EQ(D, 0.);
      20            1 : }
      21              : 
      22            2 : TEST(testAdvectionFieldList, SimpleTest) {
      23              :         // Test a list of three advection fields
      24              :         AdvectionFieldList A;
      25            1 :         A.addField(new UniformAdvectionField(Vector3d(1, 0, 0)));
      26            1 :         A.addField(new UniformAdvectionField(Vector3d(0, 2, 0)));
      27            1 :         A.addField(new UniformAdvectionField(Vector3d(0, 0, 3)));
      28            1 :         Vector3d a = A.getField(Vector3d(0.));
      29            1 :         double D = A.getDivergence(Vector3d(1, 2, 3));
      30            1 :         EXPECT_DOUBLE_EQ(a.x, 1);
      31            1 :         EXPECT_DOUBLE_EQ(a.y, 2);
      32            1 :         EXPECT_DOUBLE_EQ(a.z, 3);
      33            1 :         EXPECT_DOUBLE_EQ(D, 0.);
      34            1 : }
      35              : 
      36            2 : TEST(testConstantSphericalAdvectionField, SimpleTest) {
      37              :         
      38              :         Vector3d origin(1, 0, 0);
      39              :         double V_wind(10);
      40              :         
      41            1 :         ConstantSphericalAdvectionField A(origin, V_wind);
      42              :         
      43              :         // Check the properties of the advection field
      44            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().x, origin.x);
      45            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().y, origin.y);
      46            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().z, origin.z);
      47              : 
      48            1 :         EXPECT_DOUBLE_EQ(A.getVWind(), V_wind);
      49              : 
      50              :         // Field should be radial with center (1,0,0)
      51              :         Vector3d Pos(2, 1, 1);
      52            1 :         Vector3d V = A.getField(Pos);
      53              : 
      54            1 :         EXPECT_DOUBLE_EQ(V.x, 10.*pow(3, -0.5));
      55            1 :         EXPECT_DOUBLE_EQ(V.y, 10.*pow(3, -0.5));
      56            1 :         EXPECT_DOUBLE_EQ(V.z, 10.*pow(3, -0.5));
      57              :         
      58              :         // Divergence should be 2*V/r
      59              :         Vector3d Pos2(2, 0, 0);
      60            1 :         double D = A.getDivergence(Pos2);
      61            1 :         EXPECT_DOUBLE_EQ(D, 2*10);
      62            1 : }
      63              : 
      64            2 : TEST(testSphericalAdvectionField, SimpleTest) {
      65              : 
      66              :         Vector3d origin(1, 0, 0);
      67              :         double R_max(10);
      68              :         double V_max(1000);
      69              :         double tau(3.);
      70              :         double alpha(2.);
      71              : 
      72            1 :         SphericalAdvectionField A(origin, R_max, V_max, tau, alpha);
      73              : 
      74              :         // Check the properties of the advection field
      75            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().x, origin.x);
      76            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().y, origin.y);
      77            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().z, origin.z);
      78              :         
      79            1 :         EXPECT_DOUBLE_EQ(A.getRadius(), R_max);
      80            1 :         EXPECT_DOUBLE_EQ(A.getVMax(), V_max);
      81            1 :         EXPECT_DOUBLE_EQ(A.getTau(), tau);
      82            1 :         EXPECT_DOUBLE_EQ(A.getAlpha(), alpha);
      83              : 
      84              :         // Field/divergence should be zero for R>10
      85            1 :         EXPECT_DOUBLE_EQ(A.getField(Vector3d(12,0,0)).getR(), 0.);
      86            1 :         EXPECT_DOUBLE_EQ(A.getDivergence(Vector3d(12,0,0)), 0.);
      87              : 
      88              :         // Check field and divergence
      89              :         Vector3d Pos(2, 0, 0);
      90            1 :         Vector3d a = A.getField(Pos);
      91            1 :         Vector3d a0 = a.getUnitVector();
      92            1 :         double d = A.getDivergence(Pos);
      93              : 
      94            1 :         EXPECT_DOUBLE_EQ(a0.x, 1.);
      95            1 :         EXPECT_DOUBLE_EQ(a0.y, 0.);
      96            1 :         EXPECT_DOUBLE_EQ(a0.z, 0.);
      97            1 :         EXPECT_DOUBLE_EQ(a.getR(), V_max*(1.-exp(-1./tau)) );
      98              : 
      99            1 :         EXPECT_NEAR(d, 1044.624919, 1e-5);
     100              : 
     101              :         // Check asymptotic of the Field
     102            1 :         EXPECT_NEAR(A.getField(Vector3d(11, 0, 0)).getR(), 1000., 1e-4);
     103              :         
     104              :         // Divergence should be 2*V_max/r for r>>1
     105            1 :         EXPECT_NEAR(A.getDivergence(Vector3d(11, 0, 0)), 2*1000./10., 1e-4);
     106            1 : }
     107              : 
     108              : 
     109            2 : TEST(testSphericalAdvectionShock, SimpleTest) {
     110              : 
     111              :         Vector3d origin(0, 0, 0);
     112              :         double R_0(10);
     113              :         double V_0(1000);
     114              :         double lambda(0.1);
     115              :         double R_rot(1.);
     116              :         double V_rot(100);
     117              :         
     118              : 
     119            1 :         SphericalAdvectionShock A(origin, R_0, V_0, lambda);
     120              : 
     121              :         // Check the properties of the advection field
     122            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().x, origin.x);
     123            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().y, origin.y);
     124            1 :         EXPECT_DOUBLE_EQ(A.getOrigin().z, origin.z);
     125              :         
     126            1 :         EXPECT_DOUBLE_EQ(A.getR0(), R_0);
     127            1 :         EXPECT_DOUBLE_EQ(A.getV0(), V_0);
     128            1 :         EXPECT_DOUBLE_EQ(A.getLambda(), lambda);
     129              : 
     130              :         // Default values for R_Rot is R_0
     131              :         // Default value for Azimuthal speed is 0
     132            1 :         EXPECT_DOUBLE_EQ(A.getRRot(), R_0);
     133            1 :         EXPECT_DOUBLE_EQ(A.getAzimuthalSpeed(), 0.);    
     134              : 
     135              :         // Field should drop to 0.625*V_0 at the shock 
     136              :         // That's a difference to the analytic shock model where it should
     137              :         // drop to v_r(R_0)=0.25*V_0.
     138            1 :         EXPECT_DOUBLE_EQ(A.getField(Vector3d(R_0,0,0)).getR(), 0.625*V_0);
     139              : 
     140              :         // Field divergence should be zero for R>>R_0
     141            1 :         EXPECT_NEAR(A.getDivergence(Vector3d(15,0,0)), 0., 1e-10);
     142              : 
     143              :         // Check field and divergence
     144              :         Vector3d Pos(2, 0, 0);
     145            1 :         Vector3d a = A.getField(Pos);
     146            1 :         Vector3d a0 = a.getUnitVector();
     147            1 :         double d = A.getDivergence(Pos);
     148              : 
     149            1 :         EXPECT_DOUBLE_EQ(a0.x, 1.);
     150            1 :         EXPECT_DOUBLE_EQ(a0.y, 0.);
     151            1 :         EXPECT_DOUBLE_EQ(a0.z, 0.);
     152            1 :         EXPECT_DOUBLE_EQ(a.getR(), V_0);
     153              :         
     154              :         //Set explicitely the azimuthal rotation speed 
     155            1 :         A.setRRot(R_rot);
     156            1 :         A.setAzimuthalSpeed(V_rot);
     157              :         
     158            1 :         EXPECT_DOUBLE_EQ(A.getRRot(), R_rot);
     159            1 :         EXPECT_DOUBLE_EQ(A.getAzimuthalSpeed(), V_rot); 
     160              :         
     161              :         Vector3d pos(1., 0., 0.);
     162            1 :         Vector3d f = A.getField(pos);
     163            1 :         EXPECT_DOUBLE_EQ(f.x, 1000.);
     164            1 :         EXPECT_DOUBLE_EQ(f.y, 100.);
     165            1 :         EXPECT_DOUBLE_EQ(f.z, 0.);      
     166              : 
     167              :         
     168            1 : }
     169              : 
     170            1 : TEST(testOneDimensionalTimeDependentShock, SimpleTest) {
     171              : 
     172              :     double V_sh(1);
     173              :     double V_1(3./4.);
     174              :     double V_0(0.);
     175              :     double L_sh(.01);
     176              :     double X_sh0(0);
     177              :     double T_sh0(0);
     178              : 
     179            1 :     OneDimensionalTimeDependentShock A(V_sh, V_1, V_0, L_sh);
     180              : 
     181              :     // Check the properties of the advection field
     182            1 :     EXPECT_DOUBLE_EQ(A.getVshock(), V_sh);
     183            1 :     EXPECT_DOUBLE_EQ(A.getV1(), V_1);
     184            1 :     EXPECT_DOUBLE_EQ(A.getV0(), V_0);
     185            1 :     EXPECT_DOUBLE_EQ(A.getShockWidth(), L_sh);
     186            1 :     EXPECT_DOUBLE_EQ(A.getShockPosition(0.), X_sh0);
     187            1 :     EXPECT_DOUBLE_EQ(A.getShockTime(), T_sh0);
     188              : 
     189              :     // Field should be zero for t=0
     190            1 :     EXPECT_DOUBLE_EQ(A.getField(Vector3d(1,0,0)).getR(), 0.);
     191            1 :     EXPECT_DOUBLE_EQ(A.getDivergence(Vector3d(1,0,0)), 0.);
     192              : 
     193              :     // Shock position at t=1
     194            1 :     double xsh = A.getShockPosition(10.);
     195            1 :     EXPECT_DOUBLE_EQ(xsh, V_sh * 10.);
     196              : 
     197              :     // Preshock and postshock speeds:
     198            1 :     EXPECT_DOUBLE_EQ(A.getField(Vector3d(xsh+5.,0,0), 10.).getR(), V_0);
     199            1 :     EXPECT_DOUBLE_EQ(A.getField(Vector3d(xsh-5.,0,0), 10.).getR(), V_1);
     200              : 
     201            1 : }
     202              : 
     203            1 : TEST(testSedovTaylorBlastWave, SimpleTest) {
     204              : 
     205              :     double E0(1);
     206              :     double rho0(1);
     207              :     double L_sh(0.01);
     208              : 
     209            1 :     SedovTaylorBlastWave A(E0, rho0, L_sh);
     210              : 
     211              :     // Check the properties of the advection field
     212            1 :     EXPECT_DOUBLE_EQ(A.getEnergy(), E0);
     213            1 :     EXPECT_DOUBLE_EQ(A.getDensity(), rho0);
     214            1 :     EXPECT_DOUBLE_EQ(A.getShockWidth(), L_sh);
     215              : 
     216              :     // Field should be zero for t=0
     217            1 :     EXPECT_DOUBLE_EQ(A.getField(Vector3d(1,0,0)).getR(), 0.);
     218            1 :     EXPECT_DOUBLE_EQ(A.getDivergence(Vector3d(1,0,0)), 0.);
     219              : 
     220              :     // Shock position at t=1
     221            1 :     double R = A.getShockRadius(1.);
     222            1 :     EXPECT_DOUBLE_EQ(R, pow(E0 / rho0, 1./5.));
     223              : 
     224              :     // Shock speed at t=1
     225            1 :     double V = A.getShockSpeed(1.);
     226            1 :     EXPECT_DOUBLE_EQ(V, 2. / 5. * pow(E0 / rho0, 1. / 5.));
     227              : 
     228              :     // Check field 
     229              :     Vector3d Pos(2, 0, 0);
     230            1 :     Vector3d a = A.getField(Pos);
     231              : 
     232            1 :     EXPECT_DOUBLE_EQ(a.getR(), 0.5 * 2. * pow(2., 8) * 2. / 5. * pow(E0 / rho0, 1. / 5.) * (1 - tanh( (2 - 1) * pow(E0 / rho0, 1. / 5.) / L_sh) ));
     233              : 
     234              :     // Check asymptotic of the Field
     235            1 :     EXPECT_NEAR(A.getField(Vector3d(11, 0, 0)).getR(), 0, 1e-4);
     236            1 :     EXPECT_NEAR(A.getDivergence(Vector3d(11, 0, 0)), 0, 1e-4);
     237              : 
     238            1 : }
     239              : 
     240              : } //namespace crpropa
        

Generated by: LCOV version 2.0-1