12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #include <complex>
- #include <cstdio>
- #include <string>
- #include <iostream>
- #include "../src/nmie.hpp"
- #include "../src/nmie-impl.hpp"
- #include "../src/nmie-applied.hpp"
- #include "../src/nmie-applied-impl.hpp"
- #include "../src/shell-generator.hpp"
- int main(int argc, char *argv[]) {
- try {
- const double pi = 3.1415926535897932384626433832795;
- nmie::MultiLayerMieApplied<double> multi_layer_mie;
-
-
-
- const std::complex<double> index_Si(1.1,0.0);
-
- double WL=545;
-
-
- double outer_width = 4*2*2;
- auto shift = 0.0;
- shell_generator::ShellGenerator shell;
- shell.Init();
- shell.Refine();
- shell.Refine();
- for (int refines=0; refines<1; ++refines) {
- shell.Refine();
- for (int i=0; i<170; ++i) {
-
- auto integration_radius = outer_width + 5*i ;
-
- multi_layer_mie.ClearAllDesign();
- multi_layer_mie.AddTargetLayer(outer_width, index_Si);
- multi_layer_mie.SetWavelength(WL);
- multi_layer_mie.RunMieCalculation();
- double Qsca = multi_layer_mie.GetQsca();
-
- double scale = 2.0*pi*(integration_radius)/WL*1.00001;
- shell.Rescale(scale);
-
- auto points = shell.GetFaceCentersT();
- multi_layer_mie.SetFieldPointsSP(points);
- multi_layer_mie.RunFieldCalculation();
- auto E = nmie::ConvertComplexVectorVector<double>(multi_layer_mie.GetFieldE());
- auto H = nmie::ConvertComplexVectorVector<double>(multi_layer_mie.GetFieldH());
-
-
- shell.SetField(E,H);
-
-
-
- auto F = shell.IntegrateByComp();
- std::cout << "integrate_R:\t" << scale*WL/(2.0*pi);
- std::cout<<"\tforce:\t" <<F[0]<<"\t"<< F[1] <<"\t"<<F[2] << std::endl;
-
-
- }
- }
- } catch( const std::invalid_argument& ia ) {
-
- std::cerr << "Invalid argument: " << ia.what() << std::endl;
- return -1;
- }
- return 0;
- }
|