|  | @@ -0,0 +1,137 @@
 | 
	
		
			
				|  |  | +//**********************************************************************************//
 | 
	
		
			
				|  |  | +//    Copyright (C) 2009-2019  Ovidio Pena <ovidio@bytesfall.com>                   //
 | 
	
		
			
				|  |  | +//    Copyright (C) 2013-2019  Konstantin Ladutenko <kostyfisik@gmail.com>          //
 | 
	
		
			
				|  |  | +//                                                                                  //
 | 
	
		
			
				|  |  | +//    This file is part of scattnlay                                                //
 | 
	
		
			
				|  |  | +//                                                                                  //
 | 
	
		
			
				|  |  | +//    This program is free software: you can redistribute it and/or modify          //
 | 
	
		
			
				|  |  | +//    it under the terms of the GNU General Public License as published by          //
 | 
	
		
			
				|  |  | +//    the Free Software Foundation, either version 3 of the License, or             //
 | 
	
		
			
				|  |  | +//    (at your option) any later version.                                           //
 | 
	
		
			
				|  |  | +//                                                                                  //
 | 
	
		
			
				|  |  | +//    This program is distributed in the hope that it will be useful,               //
 | 
	
		
			
				|  |  | +//    but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
	
		
			
				|  |  | +//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                 //
 | 
	
		
			
				|  |  | +//    GNU General Public License for more details.                                  //
 | 
	
		
			
				|  |  | +//                                                                                  //
 | 
	
		
			
				|  |  | +//    The only additional remark is that we expect that all publications            //
 | 
	
		
			
				|  |  | +//    describing work using this software, or all commercial products               //
 | 
	
		
			
				|  |  | +//    using it, cite at least one of the following references:                      //
 | 
	
		
			
				|  |  | +//    [1] O. Pena and U. Pal, "Scattering of electromagnetic radiation by           //
 | 
	
		
			
				|  |  | +//        a multilayered sphere," Computer Physics Communications,                  //
 | 
	
		
			
				|  |  | +//        vol. 180, Nov. 2009, pp. 2348-2354.                                       //
 | 
	
		
			
				|  |  | +//    [2] K. Ladutenko, U. Pal, A. Rivera, and O. Pena-Rodriguez, "Mie              //
 | 
	
		
			
				|  |  | +//        calculation of electromagnetic near-field for a multilayered              //
 | 
	
		
			
				|  |  | +//        sphere," Computer Physics Communications, vol. 214, May 2017,             //
 | 
	
		
			
				|  |  | +//        pp. 225-230.                                                              //
 | 
	
		
			
				|  |  | +//                                                                                  //
 | 
	
		
			
				|  |  | +//    You should have received a copy of the GNU General Public License             //
 | 
	
		
			
				|  |  | +//    along with this program.  If not, see <http://www.gnu.org/licenses/>.         //
 | 
	
		
			
				|  |  | +//                                                                                  //
 | 
	
		
			
				|  |  | +//    @brief  Wrapper to JS
 | 
	
		
			
				|  |  | +//                                                                                  //
 | 
	
		
			
				|  |  | +//**********************************************************************************//
 | 
	
		
			
				|  |  | +#include "nmie-applied.hpp"
 | 
	
		
			
				|  |  | +#include "nmie-applied-impl.hpp"
 | 
	
		
			
				|  |  | +#include "nmie-precision.hpp"
 | 
	
		
			
				|  |  | +#include <emscripten/bind.h>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +using namespace emscripten;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +nmie::MultiLayerMieApplied<double> ml_mie;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +EMSCRIPTEN_BINDINGS (c) {
 | 
	
		
			
				|  |  | +        class_<nmie::MultiLayerMie<double>>("nmie_base")
 | 
	
		
			
				|  |  | +                .constructor<>()
 | 
	
		
			
				|  |  | +                .function("GetQsca",&nmie::MultiLayerMie<double>::GetQsca)
 | 
	
		
			
				|  |  | +                .function("GetQext",&nmie::MultiLayerMie<double>::GetQext)
 | 
	
		
			
				|  |  | +                .function("GetQabs",&nmie::MultiLayerMie<double>::GetQabs)
 | 
	
		
			
				|  |  | +        ;
 | 
	
		
			
				|  |  | +        class_<nmie::MultiLayerMieApplied<double>>("nmie")
 | 
	
		
			
				|  |  | +                .constructor<>()
 | 
	
		
			
				|  |  | +                .function("SetWavelength", &nmie::MultiLayerMieApplied<double>::SetWavelength)
 | 
	
		
			
				|  |  | +                .function("AddTargetLayerReIm",&nmie::MultiLayerMieApplied<double>::AddTargetLayerReIm)
 | 
	
		
			
				|  |  | +                .function("RunMieCalculation",&nmie::MultiLayerMieApplied<double>::RunMieCalculation)
 | 
	
		
			
				|  |  | +//                .function("bf",&nmie::MultiLayerMieApplied<double>::bf)
 | 
	
		
			
				|  |  | +        ;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//namespace nmie {
 | 
	
		
			
				|  |  | +  //**********************************************************************************//
 | 
	
		
			
				|  |  | +  // This function emulates a C call to calculate the actual scattering parameters    //
 | 
	
		
			
				|  |  | +  // and amplitudes.                                                                  //
 | 
	
		
			
				|  |  | +  //                                                                                  //
 | 
	
		
			
				|  |  | +  // Input parameters:                                                                //
 | 
	
		
			
				|  |  | +  //   L: Number of layers                                                            //
 | 
	
		
			
				|  |  | +  //   pl: Index of PEC layer. If there is none just send -1                          //
 | 
	
		
			
				|  |  | +  //   x: Array containing the size parameters of the layers [0..L-1]                 //
 | 
	
		
			
				|  |  | +  //   m: Array containing the relative refractive indexes of the layers [0..L-1]     //
 | 
	
		
			
				|  |  | +  //   nTheta: Number of scattering angles                                            //
 | 
	
		
			
				|  |  | +  //   Theta: Array containing all the scattering angles where the scattering         //
 | 
	
		
			
				|  |  | +  //          amplitudes will be calculated                                           //
 | 
	
		
			
				|  |  | +  //   nmax: Maximum number of multipolar expansion terms to be used for the          //
 | 
	
		
			
				|  |  | +  //         calculations. Only use it if you know what you are doing, otherwise      //
 | 
	
		
			
				|  |  | +  //         set this parameter to -1 and the function will calculate it              //
 | 
	
		
			
				|  |  | +  //                                                                                  //
 | 
	
		
			
				|  |  | +  // Output parameters:                                                               //
 | 
	
		
			
				|  |  | +  //   Qext: Efficiency factor for extinction                                         //
 | 
	
		
			
				|  |  | +  //   Qsca: Efficiency factor for scattering                                         //
 | 
	
		
			
				|  |  | +  //   Qabs: Efficiency factor for absorption (Qabs = Qext - Qsca)                    //
 | 
	
		
			
				|  |  | +  //   Qbk: Efficiency factor for backscattering                                      //
 | 
	
		
			
				|  |  | +  //   Qpr: Efficiency factor for the radiation pressure                              //
 | 
	
		
			
				|  |  | +  //   g: Asymmetry factor (g = (Qext-Qpr)/Qsca)                                      //
 | 
	
		
			
				|  |  | +  //   Albedo: Single scattering albedo (Albedo = Qsca/Qext)                          //
 | 
	
		
			
				|  |  | +  //   S1, S2: Complex scattering amplitudes                                          //
 | 
	
		
			
				|  |  | +  //                                                                                  //
 | 
	
		
			
				|  |  | +  // Return value:                                                                    //
 | 
	
		
			
				|  |  | +  //   Number of multipolar expansion terms used for the calculations                 //
 | 
	
		
			
				|  |  | +  //**********************************************************************************//
 | 
	
		
			
				|  |  | +//  int nMieApplied(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 {
 | 
	
		
			
				|  |  | +//      MultiLayerMieApplied<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();
 | 
	
		
			
				|  |  | +//
 | 
	
		
			
				|  |  | +//      *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) {
 | 
	
		
			
				|  |  | +//      // Will catch if  ml_mie fails or other errors.
 | 
	
		
			
				|  |  | +//      std::cerr << "Invalid argument: " << ia.what() << std::endl;
 | 
	
		
			
				|  |  | +//      throw std::invalid_argument(ia);
 | 
	
		
			
				|  |  | +//      return -1;
 | 
	
		
			
				|  |  | +//    }
 | 
	
		
			
				|  |  | +//    return 0;
 | 
	
		
			
				|  |  | +//  }
 | 
	
		
			
				|  |  | +//  int nMieApplied(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::nMieApplied(L, -1, x, m, nTheta, Theta, -1, Qext, Qsca, Qabs, Qbk, Qpr, g, Albedo, S1, S2);
 | 
	
		
			
				|  |  | +//  }
 | 
	
		
			
				|  |  | +//  int nMieApplied(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::nMieApplied(L, pl, x, m, nTheta, Theta, -1, Qext, Qsca, Qabs, Qbk, Qpr, g, Albedo, S1, S2);
 | 
	
		
			
				|  |  | +//  }
 | 
	
		
			
				|  |  | +//  int nMieApplied(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::nMieApplied(L, -1, x, m, nTheta, Theta, nmax, Qext, Qsca, Qabs, Qbk, Qpr, g, Albedo, S1, S2);
 | 
	
		
			
				|  |  | +//  }
 | 
	
		
			
				|  |  | +  // ********************************************************************** //
 | 
	
		
			
				|  |  | +  // ********************************************************************** //
 | 
	
		
			
				|  |  | +  // ********************************************************************** //
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//}  // end of namespace nmie
 |