test_Riccati_Bessel_logarithmic_derivative.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "gtest/gtest.h"
  2. #include "../src/nmie-impl.hpp"
  3. // From W. Yang APPLIED OPTICS Vol. 42, No. 9, 20 March 2003
  4. // Dtest refractive index is m={1.05,1}, the size parameter is x = 80
  5. std::vector<int> Dtest_n({0,1,30,50,60,70,75,80,85,90,99,116,130});
  6. std::vector< std::complex<double>>
  7. Dtest_D1({{0.11449e-15 ,-0.10000e+01 },{0.74646e-04 ,-0.10000e+01 },
  8. {0.34764e-01 ,-0.99870},{0.95292e-01 ,-0.99935},
  9. {0.13645,-0.10019e+01 },{0.18439,-0.10070e+01 },
  10. {0.21070,-0.10107e+01 },{0.23845,-0.10154e+01 },
  11. {0.26752,-0.10210e+01 },{0.29777,-0.10278e+01 },
  12. {0.35481,-0.10426e+01 },{0.46923,-0.10806e+01 },
  13. {0.17656,-0.13895e+01 }});
  14. std::vector< std::complex<double>>
  15. Dtest_D2({{0.64966e-69 ,-0.10000e+01 },{0.74646e-04 ,-0.10000e+01 },
  16. {0.34764e-01 ,-0.99870},{0.95292e-01 ,-0.99935},
  17. {0.13645,-0.10019e+01 },{0.17769,-0.10099e+01 },
  18. {0.41264e-01 ,-0.21076e+01 },{-0.20190,0.10435e+01 },
  19. {-0.26343,0.10223e+01 },{-0.29339,0.10291e+01 },
  20. {-0.34969,0.10437e+01 },{-0.46296,0.10809e+01 },
  21. {-0.56047,0.11206e+01 }});
  22. std::vector< std::complex<double>>
  23. Dtest_D3({{0.00000,0.10000e+01 },{-0.73809e-04 ,0.10000e+01 },
  24. {-0.34344e-01 ,0.99912},{-0.94022e-01 ,0.10004e+01 },
  25. {-0.13455,0.10032e+01 },{-0.18172,0.10084e+01 },
  26. {-0.20762,0.10122e+01 },{-0.23494,0.10169e+01 },
  27. {-0.26357,0.10225e+01 },{-0.29339,0.10291e+01 },
  28. {-0.34969,0.10437e+01 },{-0.46296,0.10809e+01 },
  29. {-0.56047,0.11206e+01 }});
  30. //TEST(Dtest, DISABLED_WYang_data){
  31. TEST(Dtest, WYang_data){
  32. double rel_tol = 1e-6;
  33. int Nstop = 131;
  34. std::vector<std::complex<nmie::FloatType>> Df(Nstop), Db(Nstop), r;
  35. std::complex<nmie::FloatType> z(1.05,1);
  36. z = z*80.0;
  37. nmie::evalForwardD1(z, Df);
  38. r.resize(Nstop+1);
  39. nmie::evalForwardR(z, r);
  40. nmie::convertRtoD1(z, r, Df);
  41. int valid_digits = 6;
  42. int nstar = nmie::getNStar(Nstop, z, valid_digits);
  43. r.resize(nstar);
  44. nmie::evalBackwardR(z,r);
  45. nmie::convertRtoD1(z, r, Db);
  46. for (int i = 0; i < Dtest_n.size(); i++) {
  47. int n = Dtest_n[i];
  48. // EXPECT_FLOAT_EQ(std::real(Df[n]), std::real(Dtest_D1[i])) << "f at n=" << n;
  49. // EXPECT_FLOAT_EQ(std::imag(Df[n]), std::imag(Dtest_D1[i])) << "f at n=" << n;
  50. EXPECT_NEAR(std::real(Db[n]), std::real(Dtest_D1[i]),
  51. rel_tol*std::real(Db[n])) << "b at n=" << n;
  52. EXPECT_NEAR(std::imag(Db[n]), std::imag(Dtest_D1[i]),
  53. rel_tol*std::imag(Db[n])) << "b at n=" << n;
  54. // EXPECT_FLOAT_EQ(std::real(Df[n]), std::real(Db[n])) << "f-b at n=" << n;
  55. // EXPECT_FLOAT_EQ(std::imag(Df[n]), std::imag(Db[n])) << "f-b at n=" << n;
  56. }
  57. }
  58. TEST(ratio_funcion_forward_vs_backward_recurrence, compare){
  59. int Nstop = 131;
  60. std::vector<std::complex<nmie::FloatType>> rf(Nstop), rb;
  61. // std::complex<nmie::FloatType> z(1.05,1);
  62. // z = z*80.0;
  63. std::complex<nmie::FloatType> z(1.3,-2.1);
  64. // rb[49] in Wolfram Alpha
  65. // n=49, z=1.3-2.1i, SphericalBesselJ[n-1,z]/SphericalBesselJ[n,z]
  66. nmie::evalForwardR(z, rf);
  67. int valid_digits = 20;
  68. int nstar = nmie::getNStar(Nstop, z, valid_digits);
  69. rb.resize(nstar);
  70. nmie::evalBackwardR(z,rb);
  71. for (int i = 0; i < Dtest_n.size(); i++) {
  72. int n = Dtest_n[i];
  73. EXPECT_FLOAT_EQ(std::real(rf[n]), std::real(rb[i]))
  74. << "at n=" << n
  75. << " expected forward loss="<<nmie::evalKapteynNumberOfLostSignificantDigits(n,z);
  76. EXPECT_FLOAT_EQ(std::imag(rf[n]), std::imag(rb[i]))
  77. << "at n=" << n
  78. << " expected forward loss="<<nmie::evalKapteynNumberOfLostSignificantDigits(n,z);
  79. }
  80. }
  81. TEST(KaptyenTest, HandlesInput) {
  82. // H.Du APPLIED OPTICS, Vol. 43, No. 9, 20 March 2004
  83. double l = nmie::evalKapteynNumberOfLostSignificantDigits(80, std::complex<double>(100,100));
  84. EXPECT_EQ(l, 7)<<"Should be equal";
  85. std::complex<double> z(10000,0);
  86. l = nmie::evalKapteynNumberOfLostSignificantDigits(5070, z);
  87. EXPECT_EQ(l, 0)<<"Should be equal";
  88. int NStar = nmie::getNStar(5070, z,6);
  89. EXPECT_GE(NStar, 10130);
  90. }
  91. int main(int argc, char **argv) {
  92. testing::InitGoogleTest(&argc, argv);
  93. return RUN_ALL_TESTS();
  94. }