pb11_wrapper.cc 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <string>
  2. #include "nmie.hpp"
  3. #include "nmie-basic.hpp"
  4. #include "nmie-nearfield.hpp"
  5. template<typename T>
  6. void declare_nmie(py::module &m, const std::string &typestr) {
  7. using mie_typed = nmie::MultiLayerMie<nmie::FloatType>;
  8. std::string pyclass_name = std::string("mie") + typestr;
  9. py::class_<mie_typed>(m, pyclass_name.c_str(), py::buffer_protocol(), py::dynamic_attr())
  10. .def(py::init<>())
  11. .def("GetPECLayer", &mie_typed::GetPECLayer)
  12. .def("SetPECLayer", &mie_typed::SetPECLayer)
  13. .def("SetMaxTerms", &mie_typed::SetMaxTerms)
  14. .def("GetMaxTerms", &mie_typed::GetMaxTerms)
  15. .def("SetModeNmaxAndType", &mie_typed::SetModeNmaxAndType)
  16. .def("RunMieCalculation", &mie_typed::RunMieCalculation)
  17. .def("calcScattCoeffs", &mie_typed::calcScattCoeffs)
  18. .def("calcExpanCoeffs", &mie_typed::calcExpanCoeffs)
  19. .def("RunFieldCalculation", &mie_typed::RunFieldCalculation)
  20. .def("RunFieldCalculationPolar", &mie_typed::RunFieldCalculationPolar)
  21. .def("GetPECLayer", &mie_typed::GetPECLayer)
  22. .def("SetLayersSize", static_cast<
  23. void (mie_typed::*)
  24. (const py::array_t<double, py::array::c_style | py::array::forcecast>&)>
  25. (&mie_typed::SetLayersSize)
  26. )
  27. .def("SetLayersIndex", static_cast<
  28. void (mie_typed::*)
  29. (const py::array_t<std::complex<double>, py::array::c_style | py::array::forcecast> &)>
  30. (&mie_typed::SetLayersIndex)
  31. )
  32. .def("SetAngles", static_cast<
  33. void (mie_typed::*)
  34. (const py::array_t<double, py::array::c_style | py::array::forcecast>&)>
  35. (&mie_typed::SetAngles)
  36. )
  37. .def("SetFieldCoords", static_cast<
  38. void (mie_typed::*)
  39. (
  40. const py::array_t<double, py::array::c_style | py::array::forcecast> &py_Xp,
  41. const py::array_t<double, py::array::c_style | py::array::forcecast> &py_Yp,
  42. const py::array_t<double, py::array::c_style | py::array::forcecast> &py_Zp
  43. )>
  44. (&mie_typed::SetFieldCoords)
  45. )
  46. .def("GetQext", &mie_typed::GetQext<double>)
  47. .def("GetQsca", &mie_typed::GetQsca<double>)
  48. .def("GetQabs", &mie_typed::GetQabs<double>)
  49. .def("GetQpr", &mie_typed::GetQpr<double>)
  50. .def("GetQbk", &mie_typed::GetQbk<double>)
  51. .def("GetAsymmetryFactor", &mie_typed::GetAsymmetryFactor<double>)
  52. .def("GetAlbedo", &mie_typed::GetAlbedo<double>)
  53. .def("GetS1", &mie_typed::GetS1<double>)
  54. .def("GetS2", &mie_typed::GetS2<double>)
  55. .def("GetAn", &mie_typed::GetAn<double>)
  56. .def("GetBn", &mie_typed::GetBn<double>)
  57. .def("GetFieldE", &mie_typed::GetFieldE<double>)
  58. .def("GetFieldH", &mie_typed::GetFieldH<double>)
  59. .def("GetLayerAn", &mie_typed::GetLayerAn<double>)
  60. .def("GetLayerBn", &mie_typed::GetLayerBn<double>)
  61. .def("GetLayerCn", &mie_typed::GetLayerCn<double>)
  62. .def("GetLayerDn", &mie_typed::GetLayerDn<double>)
  63. ;
  64. }
  65. // wrap as Python module
  66. #ifdef MULTI_PRECISION
  67. std::string precision_name = "_mp";
  68. PYBIND11_MODULE(scattnlay_mp, m)
  69. #else
  70. std::string precision_name = "_dp";
  71. PYBIND11_MODULE(scattnlay_dp, m)
  72. #endif // MULTI_PRECISION
  73. {
  74. m.doc() = "The Python version of scattnlay";
  75. declare_nmie<nmie::FloatType>(m, precision_name);
  76. }