Example ProgramsThe following provides examples of how the SCATMECH library can be used in a variety of types of calculations. Since each example has its own main(), each is expected to be linked separately.
Notice that all four examples contain a try/catch block, so that any errors are handled and messages written to the standard error stream (cerr). BRDFProgThe following example (found in BRDFProg.cpp) asks the user for an incident angle, a range of incident polar and azimuthal angles, and a BRDF model. The program writes to the standard output the principal angle of the polarization, the various degrees of polarizations, and the intensity. #include "brdf.h" using namespace std; // Use unqualified names for Standard C++ library using namespace SCATMECH; // Use unqualified names for SCATMECH library int main(int argv,char** argc) { try { // Query user for scattering angles and ranges... double thetai = AskUser("Incident Angle ",45.)*deg; double thetas_1 = AskUser("Initial Scattering Angle ",45.)*deg; double thetas_2 = AskUser("Final Scattering Angle ",45.)*deg; double thetas_3 = AskUser("Step Scattering Angle ",1.)*deg; double phis_1 = AskUser("Initial Azimuthal Angle ",0.)*deg; double phis_2 = AskUser("Final Azimuthal Angle ",180.)*deg; double phis_3 = AskUser("Step Azimuthal Angle ",2.)*deg; // Get an instance of BRDF_Model... BRDF_Model_Ptr model = Get_Model_Ptr(); // Query user for model parameters... model->AskUser(); // Loop through scattering geometries... for (double thetas=thetas_1; thetas<=thetas_2; thetas+=thetas_3) { for (double phis=phis_1; phis<=phis_2; phis+=phis_3) { // Get the Mueller matrix for scattering... MuellerMatrix m=model->Mueller(thetai,thetas,phis,0.); // Calculate the Stokes vector for p-polarized incident light... StokesVector s=m*StokesVectorUnitP(); // Print out various light scattering parameters... cout << thetas/deg << tab // Scattering angle (theta) << phis/deg << tab // Scattering angle (phi) << s.eta()/deg << tab // Principal angle of polarization << s.DOLP() << tab // Degree of linear polarization << s.DOCP() << tab // Degree of circular polarization << s.DOP() << tab // Degree of polarization << s.I() << endl; // The intensity (BRDF) } } } catch (exception& e) { cerr << e.what() << endl; } return 0; } RCWProgThe following program (found in RCWProg.cpp) demonstrates how one can use the rigorous coupled-wave (RCW) solution for diffraction from a grating. In this case, it calculates ellipsometric parameters for the normal (specular) reflection or transmission from the grating as a function of wavelength and writes the results to the standard output. #include "rcw.h" using namespace std; using namespace SCATMECH; int main() { try { // Create object... RCW_Model RCW; // Query user for parameters... RCW.AskUser(); // This keeps RCW from being verbose... RCW.set_quiet(1); // Display all of the available parameters... cerr << endl << "Available parameters:" << endl << endl; RCW.print_parameters(cerr); cerr << endl; // Get parameter to vary, its limits, and its range... string parameter=AskUser("Parameter to vary",string("lambda")); double begin=AskUser("Initial value",0.200); double end=AskUser("Final value",0.800); double step=AskUser("Step value",0.005); // Output file header... cout << parameter << tab << "alpha" << tab << "beta" << endl; // Scan parameter... for (double value = begin; value <= end; value += step) { // Set the parameter... RCW.set_parameter(parameter,value); // Get the Mueller matrix intensity of the specular (0 order) reflection... MuellerMatrix M = RCW.GetIntensity(0); // Get the Stokes vector for 45 deg polarized incident light... StokesVector S = M*StokesVectorUnitLinear(45.*deg); // Output the normalized Stokes parameters measured by a rotating analyzer ellipsometer... cout << value << tab << S[1]/S[0] << tab << S[2]/S[0] << endl; } } catch (exception& e) { cerr << e.what() << endl; } return 0; } ReflectProgThe following program (found in ReflectProg.cpp) demonstrates how one can use the thin film classes to characterize the reflection from a stack of dielectric films. #include "filmtran.h" using namespace std; // Use unqualified names for Standard C++ library using namespace SCATMECH; int main() { try { // Query user for wavelength... double lambda = AskUser("Wavelength",0.633); // Query user for substrate... dielectric_function substrate = dielectric_function::AskUser("Substrate",optical_constant(1.5,0)); // Query user for films... dielectric_stack stack = dielectric_stack::AskUser("Stack",""); // Loop through angles... for (double theta=0; theta<90; theta+=1) { // Print out s- and p-polarized reflectances... cout << theta << tab << norm(stack.rp12(theta*deg,lambda,vacuum,substrate)) << tab << norm(stack.rs12(theta*deg,lambda,vacuum,substrate)) << endl; } } catch (exception& e) { cerr << e.what() << endl; } return 0; } MieProgThe following program (found in MieProg.cpp) is a simple Mie scattering program, demonstrating the use of the MieScatterer class. #include "miescat.h" using namespace std; // Use unqualified names for Standard C++ library using namespace SCATMECH; // Use unqualified names for the SCATMECH library int main(int argv,char** argc) { try { // Query user for angle and wavelength... double dtheta = AskUser("Step angle",1.)*deg; // Create a Mie scatterer... MieScatterer mie; // Query user for parameters... mie.AskUser(); // Output scattering efficiencies... cout << "Qsca = " << mie.Qsca() << " Qext = " << mie.Qext() << " Qback = " << mie.Qback() << endl; // Output column header... cout << endl << "Angle" << tab << "S11" << tab << "Pol" << tab << "S33" << tab << "S34" << endl; // Get normalization factor at zero angle... double m00= MuellerMatrix(mie.s(0.0))[0][0]; // Loop through angles... for (double theta=0.; theta<180.*deg; theta+=dtheta) { // Evaluate scattering matrix... MuellerMatrix m = mie.s(theta); // Output unique elements of normalized Mueller matrix... cout << theta/deg << tab << m[0][0]/m00 << tab << m[0][1]/m[0][0] << tab << m[2][2]/m[0][0] << tab << m[2][3]/m[0][0] << endl; } } catch (exception& e) { cerr << e.what() << endl; } return 0; } For More Information
SCATMECH Technical Information and Questions
Current SCATMECH version: 7.22 (April 2021) |