test_near_field.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "gtest/gtest.h"
  2. #include "../src/nmie-basic.hpp"
  3. #include "../src/nmie-nearfield.hpp"
  4. #include "test_cases.hpp"
  5. //TEST(RunFieldCalculationCartesian, DISABLED_HandlesInput) {
  6. TEST(RunFieldCalculationCartesian, HandlesInput) {
  7. nmie::MultiLayerMie<nmie::FloatType> nmie;
  8. // EXPECT_THROW(nmie.RunFieldCalculationPolar(0), std::invalid_argument);
  9. // EXPECT_THROW(nmie.RunFieldCalculationPolar(1,1,10,5), std::invalid_argument);
  10. nmie::FloatType total_r = 2*nmie.PI_*1000/532;
  11. // double r = 1500;
  12. nmie.SetLayersSize({total_r/2, total_r});
  13. nmie.SetLayersIndex({ {1.330,0}, {1.33,0}});
  14. nmie.RunMieCalculation();
  15. double relative_max_distance = 1e-10;
  16. // nmie.SetModeNmaxAndType(3,-1);
  17. // int nmax = 21;
  18. nmie.RunFieldCalculationCartesian(2, 5, relative_max_distance, nmie::Planes::kEk,
  19. 1.0, 0, 0, false,3);
  20. auto Eabs = nmie.GetFieldEabs();
  21. auto E = nmie.GetFieldE();
  22. std::cout<<std::endl;
  23. {
  24. // Eabs points are located near the sphere outer border
  25. //
  26. // 0 1 2 3 4
  27. // ----- border ----
  28. // 5 6 7 8 9
  29. // distance between points (0) and (4) is relative_max_distance*total_r, initial
  30. // value used for the test was 1e-10*total_r, so we expect good linear dependence
  31. // for points from 0 to 4 and 5 to 9. In the asserts we check, that the slope doesn't
  32. // change too fast inside the curve. While writing this, the test was failing.
  33. // The value of z-coordinates of 2 and 7 points = 0
  34. using nmie::nmm::abs;
  35. EXPECT_TRUE(
  36. ( abs(Eabs[0] - Eabs[1]) + abs(Eabs[3] - Eabs[4]) ) >= abs(Eabs[1] - Eabs[2])
  37. );
  38. EXPECT_TRUE(
  39. ( abs(Eabs[5] - Eabs[6]) + abs(Eabs[8] - Eabs[9]) ) >= abs(Eabs[6] - Eabs[7])
  40. );
  41. }
  42. // nmie.RunFieldCalculationCartesian(2, 2, 2, nmie::Planes::kHk,
  43. // 0, 0, 0, true);
  44. // nmie.RunFieldCalculationCartesian(2, 2, 2, nmie::Planes::kEH,
  45. // 0, 0, 0, true);
  46. // TODO add check of E and H symmetry for X and Y axis inversion
  47. // EXPECT_EQ(1, nmie.GetMaxTerms());
  48. // EXPECT_FALSE(nmie.GetFieldConvergence());
  49. // auto Eabs = nmie.GetFieldEabs();
  50. // EXPECT_TRUE(std::isnan(static_cast<double>(Eabs[0])));
  51. }
  52. //TEST(RunFieldCalculationPolar, DISABLED_HandlesInput) {
  53. TEST(RunFieldCalculationPolar, HandlesInput) {
  54. nmie::MultiLayerMie<nmie::FloatType> nmie;
  55. EXPECT_THROW(nmie.RunFieldCalculationPolar(0), std::invalid_argument);
  56. EXPECT_THROW(nmie.RunFieldCalculationPolar(1,1,10,5), std::invalid_argument);
  57. double r = 60;
  58. // double r = 1500;
  59. nmie.SetLayersSize({r/2, r});
  60. nmie.SetLayersIndex({ {1.33,0}, {1.33,0}});
  61. nmie.RunMieCalculation();
  62. nmie.RunFieldCalculationPolar(1, 1,
  63. 0.5145*r,
  64. r*0.5148,
  65. 0, 3.14, 0, 0, true, 1);
  66. EXPECT_EQ(1, nmie.GetMaxTerms());
  67. EXPECT_FALSE(nmie.GetFieldConvergence());
  68. auto Eabs = nmie.GetFieldEabs();
  69. EXPECT_TRUE(std::isnan(static_cast<double>(Eabs[0])));
  70. }
  71. //#ifndef MULTI_PRECISION
  72. //TEST(BulkSphere, DISABLED_HandlesInput) {
  73. TEST(BulkSphere, HandlesInput) {
  74. nmie::MultiLayerMie<nmie::FloatType> nmie;
  75. for (const auto &data : parameters_bulk_sphere) {
  76. auto x = std::get<0>(data);
  77. auto m = std::get<1>(data);
  78. nmie.SetLayersSize({x});
  79. nmie.SetLayersIndex({m});
  80. nmie.SetMaxTerms(-1);
  81. // nmie.RunMieCalculation();
  82. // std::cout<<" test case: "<<std::get<2>(data)<<" Qsca="<<nmie.GetQsca()<<std::endl;
  83. nmie.RunFieldCalculationPolar(4,3,x,x*3, 0, static_cast<double>(nmie.PI_), 0, static_cast<double>(nmie.PI_),true, -1);
  84. auto Eabs = nmie.GetFieldEabs();
  85. for (auto &E:Eabs) E=nmie::pow2(E);
  86. // print(Eabs)
  87. EXPECT_TRUE(nmie.GetFieldConvergence())<<"Outside test for x="<<x<<" m="<<m<<" test case: "<<std::get<2>(data)<<std::endl;
  88. nmie.RunFieldCalculationPolar(4,10,x*0.01,x, 0, static_cast<double>(nmie.PI_), 0, static_cast<double>(nmie.PI_),true, -1);
  89. EXPECT_TRUE(nmie.GetFieldConvergence())<<"Inside test for x="<<x<<" m="<<m<<" test case: "<<std::get<2>(data)<<std::endl;
  90. }
  91. }
  92. //#endif
  93. int main(int argc, char **argv) {
  94. testing::InitGoogleTest(&argc, argv);
  95. return RUN_ALL_TESTS();
  96. }