27 std::function<T(
const Material&)> average)
29 const T layer_data = average(layer_mat);
30 T averaged_data = layer_data;
31 for (
auto& region : regions)
32 averaged_data += region.m_volume * (average(region.m_material) - layer_data);
39 const std::vector<HomogeneousRegion>& regions)
42 std::vector<const Material*> materials(regions.size() + 1);
43 materials[0] = &layer_mat;
44 for (
size_t i = 0, regions_size = regions.size(); i < regions_size; ++i)
45 materials[i + 1] = ®ions[i].m_material;
48 throw std::runtime_error(
"Error in createAveragedMaterial(): non-default materials of "
49 "different types used simultaneously.");
52 const std::string avr_mat_name = layer_mat.
getName() +
"_avg";
55 const kvector_t mag_avr = averageData<kvector_t>(
62 return mdc * mdc - 2.0 * mdc;
65 std::conj(1.0 - std::sqrt(1.0 + averageData<complex_t>(layer_mat, regions, avrData)));
66 return HomogeneousMaterial(avr_mat_name, avr_mat_data.real(), avr_mat_data.imag(), mag_avr);
71 const complex_t avr_mat_data = averageData<complex_t>(layer_mat, regions, avrData);
72 return MaterialBySLD(avr_mat_name, avr_mat_data.real(), avr_mat_data.imag(), mag_avr);
74 throw std::runtime_error(
"Error in CalculateAverageMaterial: unknown material type.");
std::complex< double > complex_t
Defines struct HomogeneousRegion, and declares fct createAveragedMaterial.
Defines class MaterialBySLDImpl.
Declares functions in namespace MaterialUtils.
Defines class RefractiveMaterialImpl.
Defines some unit conversion factors and other constants in namespace Units.
A wrapper for underlying material implementation.
kvector_t magnetization() const
Get the magnetization (in A/m)
std::string getName() const
Returns the name of material.
complex_t materialData() const
Returns underlying material data.
Material HomogeneousMaterial(const std::string &name, complex_t refractive_index, kvector_t magnetization)
Constructs a material with name, refractive_index and magnetization (in A/m).
Material createAveragedMaterial(const Material &layer_mat, const std::vector< HomogeneousRegion > ®ions)
Creates averaged material.
MATERIAL_TYPES checkMaterialTypes(const std::vector< const Material * > &materials)
Checks if all non-default materials in materials are of the same type and returns this type.
T averageData(const Material &layer_mat, const std::vector< HomogeneousRegion > ®ions, std::function< T(const Material &)> average)