26 T averageData(
const Material& layer_mat, 
const std::vector<HomogeneousRegion>& regions,
 
   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;
 
   47     if (avr_material_type == MATERIAL_TYPES::InvalidMaterialType)
 
   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>(
 
   58     if (avr_material_type == MATERIAL_TYPES::RefractiveMaterial) {
 
   60         auto avrData = [](
const Material& mat) -> complex_t {
 
   62             return mdc * mdc - 2.0 * mdc;
 
   64         const complex_t avr_mat_data =
 
   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);
 
   67     } 
else if (avr_material_type == MATERIAL_TYPES::MaterialBySLD) {
 
   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.");
 
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.