123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- #include "nmie.hpp"
- #include "nmie-impl.hpp"
- #include <array>
- #include <algorithm>
- #include <cstdio>
- #include <cstdlib>
- #include <stdexcept>
- #include <iostream>
- #include <iomanip>
- #include <vector>
- #include <boost/multiprecision/cpp_bin_float.hpp>
- namespace nmie {
-
-
- typedef boost::multiprecision::cpp_bin_float_100 FloatType;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int ScattCoeffs(const unsigned int L, const int pl, std::vector<double>& x, std::vector<std::complex<double> >& m, const int nmax, std::vector<std::complex<double> >& an, std::vector<std::complex<double> >& bn) {
- if (x.size() != L || m.size() != L)
- throw std::invalid_argument("Declared number of layers do not fit x and m!");
- try {
- MultiLayerMie<FloatType> ml_mie;
- ml_mie.SetLayersSize(ConvertVector<FloatType>(x));
- ml_mie.SetLayersIndex(ConvertComplexVector<FloatType>(m));
- ml_mie.SetPECLayer(pl);
- ml_mie.SetMaxTerms(nmax);
- ml_mie.calcScattCoeffs();
- an = ConvertComplexVector<double>(ml_mie.GetAn());
- bn = ConvertComplexVector<double>(ml_mie.GetBn());
- return ml_mie.GetMaxTerms();
- } catch(const std::invalid_argument& ia) {
-
- std::cerr << "Invalid argument: " << ia.what() << std::endl;
- throw std::invalid_argument(ia);
- return -1;
- }
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int nMie(const unsigned int L, const int pl, std::vector<double>& x, std::vector<std::complex<double> >& m, const unsigned int nTheta, std::vector<double>& Theta, const int nmax, double *Qext, double *Qsca, double *Qabs, double *Qbk, double *Qpr, double *g, double *Albedo, std::vector<std::complex<double> >& S1, std::vector<std::complex<double> >& S2) {
- if (x.size() != L || m.size() != L)
- throw std::invalid_argument("Declared number of layers do not fit x and m!");
- if (Theta.size() != nTheta)
- throw std::invalid_argument("Declared number of sample for Theta is not correct!");
- try {
- MultiLayerMie<FloatType> ml_mie;
- ml_mie.SetLayersSize(ConvertVector<FloatType>(x));
- ml_mie.SetLayersIndex(ConvertComplexVector<FloatType>(m));
- ml_mie.SetAngles(ConvertVector<FloatType>(Theta));
- ml_mie.SetPECLayer(pl);
- ml_mie.SetMaxTerms(nmax);
- ml_mie.RunMieCalculation();
- std::cout
- << std::setprecision(std::numeric_limits<FloatType>::digits10)
- << "Qext = "
- << ml_mie.GetQext()
- << std::endl;
-
- *Qext = static_cast<double>(ml_mie.GetQext());
- *Qsca = static_cast<double>(ml_mie.GetQsca());
- *Qabs = static_cast<double>(ml_mie.GetQabs());
- *Qbk = static_cast<double>(ml_mie.GetQbk());
- *Qpr = static_cast<double>(ml_mie.GetQpr());
- *g = static_cast<double>(ml_mie.GetAsymmetryFactor());
- *Albedo = static_cast<double>(ml_mie.GetAlbedo());
- S1 = ConvertComplexVector<double>(ml_mie.GetS1());
- S2 = ConvertComplexVector<double>(ml_mie.GetS2());
- return ml_mie.GetMaxTerms();
- } catch(const std::invalid_argument& ia) {
-
- std::cerr << "Invalid argument: " << ia.what() << std::endl;
- throw std::invalid_argument(ia);
- return -1;
- }
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int nMie(const unsigned int L, std::vector<double>& x, std::vector<std::complex<double> >& m, const unsigned int nTheta, std::vector<double>& Theta, double *Qext, double *Qsca, double *Qabs, double *Qbk, double *Qpr, double *g, double *Albedo, std::vector<std::complex<double> >& S1, std::vector<std::complex<double> >& S2) {
- return nmie::nMie(L, -1, x, m, nTheta, Theta, -1, Qext, Qsca, Qabs, Qbk, Qpr, g, Albedo, S1, S2);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int nMie(const unsigned int L, const int pl, std::vector<double>& x, std::vector<std::complex<double> >& m, const unsigned int nTheta, std::vector<double>& Theta, double *Qext, double *Qsca, double *Qabs, double *Qbk, double *Qpr, double *g, double *Albedo, std::vector<std::complex<double> >& S1, std::vector<std::complex<double> >& S2) {
- return nmie::nMie(L, pl, x, m, nTheta, Theta, -1, Qext, Qsca, Qabs, Qbk, Qpr, g, Albedo, S1, S2);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int nMie(const unsigned int L, std::vector<double>& x, std::vector<std::complex<double> >& m, const unsigned int nTheta, std::vector<double>& Theta, const int nmax, double *Qext, double *Qsca, double *Qabs, double *Qbk, double *Qpr, double *g, double *Albedo, std::vector<std::complex<double> >& S1, std::vector<std::complex<double> >& S2) {
- return nmie::nMie(L, -1, x, m, nTheta, Theta, nmax, Qext, Qsca, Qabs, Qbk, Qpr, g, Albedo, S1, S2);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int nField(const unsigned int L, const int pl, const std::vector<double>& x, const std::vector<std::complex<double> >& m, const int nmax, const unsigned int ncoord, const std::vector<double>& Xp_vec, const std::vector<double>& Yp_vec, const std::vector<double>& Zp_vec, std::vector<std::vector<std::complex<double> > >& E, std::vector<std::vector<std::complex<double> > >& H) {
- if (x.size() != L || m.size() != L)
- throw std::invalid_argument("Declared number of layers do not fit x and m!");
- if (Xp_vec.size() != ncoord || Yp_vec.size() != ncoord || Zp_vec.size() != ncoord
- || E.size() != ncoord || H.size() != ncoord)
- throw std::invalid_argument("Declared number of coords do not fit Xp, Yp, Zp, E, or H!");
- for (auto f:E)
- if (f.size() != 3)
- throw std::invalid_argument("Field E is not 3D!");
- for (auto f:H)
- if (f.size() != 3)
- throw std::invalid_argument("Field H is not 3D!");
- try {
- MultiLayerMie<FloatType> ml_mie;
- ml_mie.SetLayersSize(ConvertVector<FloatType>(x));
- ml_mie.SetLayersIndex(ConvertComplexVector<FloatType>(m));
- ml_mie.SetPECLayer(pl);
- ml_mie.SetFieldCoords({ConvertVector<FloatType>(Xp_vec),
- ConvertVector<FloatType>(Yp_vec),
- ConvertVector<FloatType>(Zp_vec) });
- ml_mie.RunFieldCalculation();
- E = ConvertComplexVectorVector<double>(ml_mie.GetFieldE());
- H = ConvertComplexVectorVector<double>(ml_mie.GetFieldH());
- return ml_mie.GetMaxTerms();
- } catch(const std::invalid_argument& ia) {
-
- std::cerr << "Invalid argument: " << ia.what() << std::endl;
- throw std::invalid_argument(ia);
- return - 1;
- }
- return 0;
- }
- }
|