BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
Materials

Classes

class  BaseMaterialImpl
 
class  MagneticMaterialImpl
 
class  Material
 
class  MaterialBySLDImpl
 
class  RefractiveMaterialImpl
 

Functions

Material HomogeneousMaterial ()
 
Material HomogeneousMaterial (const std::string &name, double delta, double beta, kvector_t magnetization={})
 
Material HomogeneousMaterial (const std::string &name, complex_t refractive_index, kvector_t magnetization={})
 
Material MaterialBySLD ()
 
Material MaterialBySLD (const std::string &name, double sld_real, double sld_imag, kvector_t magnetization={})
 
Material createAveragedMaterial (const Material &layer_mat, const std::vector< HomogeneousRegion > &regions)
 
std::vector< complex_tMaterialProfile (const MultiLayer &multilayer, int n_points, double z_min, double z_max)
 

Detailed Description

Classes and functions to describe magnetic and non-magnetic materials.

Function Documentation

◆ HomogeneousMaterial() [1/3]

Material HomogeneousMaterial ( )

Definition at line 37 of file MaterialFactoryFuncs.cpp.

38 {
39  return HomogeneousMaterial("vacuum", 0.0, 0.0, kvector_t{});
40 }
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).

References HomogeneousMaterial().

Here is the call graph for this function:

◆ HomogeneousMaterial() [2/3]

Material HomogeneousMaterial ( const std::string &  name,
double  delta,
double  beta,
kvector_t  magnetization = {} 
)

Definition at line 27 of file MaterialFactoryFuncs.cpp.

31 {
32  std::unique_ptr<RefractiveMaterialImpl> mat_impl(
33  new RefractiveMaterialImpl(name, delta, beta, magnetization));
34  return Material(std::move(mat_impl));
35 }
A wrapper for underlying material implementation.
Definition: Material.h:29
Material implementation based on refractive coefficiencts (valid for one wavelength value only)

◆ HomogeneousMaterial() [3/3]

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).

Alternatively, $\delta$ and $\beta$ for refractive index $n = 1 - \delta + i \beta$ can be passed directly. With no parameters given, constructs default (vacuum) material with $n = 1$ and zero magnetization.

Definition at line 21 of file MaterialFactoryFuncs.cpp.

23 {
24  const double delta = 1.0 - refractive_index.real();
25  const double beta = refractive_index.imag();
26  return HomogeneousMaterial(name, delta, beta, magnetization);
27 }

Referenced by CoreShellParticleBuilder::buildSample(), HomogeneousMultilayerBuilder::buildSample(), MagneticSubstrateZeroFieldBuilder::buildSample(), MagneticLayerBuilder::buildSample(), MagneticRotationBuilder::buildSample(), MagneticParticleZeroFieldBuilder::buildSample(), MagneticCylindersBuilder::buildSample(), MagneticSpheresBuilder::buildSample(), MultiLayerWithRoughnessBuilder::buildSample(), ResonatorBuilder::buildSample(), SlicedCylindersBuilder::buildSample(), createAveragedMaterial(), HomogeneousMaterial(), and anonymous_namespace{MagneticLayersBuilder.cpp}::parametricBuild().

◆ MaterialBySLD() [1/2]

Material MaterialBySLD ( )

Definition at line 42 of file MaterialFactoryFuncs.cpp.

43 {
44  return MaterialBySLD("vacuum", 0.0, 0.0, kvector_t{});
45 }
Material MaterialBySLD()

Referenced by anonymous_namespace{FeNiBilayerBuilder.cpp}::FeNiBilayer::constructSample(), and createAveragedMaterial().

◆ MaterialBySLD() [2/2]

Material MaterialBySLD ( const std::string &  name,
double  sld_real,
double  sld_imag,
kvector_t  magnetization = {} 
)

Constructs a wavelength-independent material with a given complex-valued scattering length density (SLD).

SLD values for a wide variety of materials can be found on https://sld-calculator.appspot.com/ and https://www.ncnr.nist.gov/resources/activation/ By convention, SLD imaginary part is treated as negative by default, which corresponds to attenuation of the signal. With no parameters given, MaterialBySLD constructs default (vacuum) material with zero sld and zero magnetization.

Parameters
namematerial name
sld_realreal part of the scattering length density, inverse square angstroms
sld_imagimaginary part of the scattering length density, inverse square angstroms
magnetizationmagnetization (in A/m)

Definition at line 27 of file MaterialFactoryFuncs.cpp.

49 {
50  constexpr double inv_sq_angstroms = 1.0 / (Units::angstrom * Units::angstrom);
51  std::unique_ptr<MaterialBySLDImpl> mat_impl(new MaterialBySLDImpl(
52  name, sld_real * inv_sq_angstroms, sld_imag * inv_sq_angstroms, magnetization));
53  return Material(std::move(mat_impl));
54 }
Material implementation based on wavelength-independent data (valid for a range of wavelengths)
static constexpr double angstrom
Definition: Units.h:25

◆ createAveragedMaterial()

Material createAveragedMaterial ( const Material layer_mat,
const std::vector< HomogeneousRegion > &  regions 
)

Creates averaged material.

Square refractive index of returned material is arithmetic mean over regions and layer_mat. Magnetization (if present) is averaged linearly.

Definition at line 38 of file HomogeneousRegion.cpp.

40 {
41  // determine the type of returned material
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] = &regions[i].m_material;
46  const MATERIAL_TYPES avr_material_type = MaterialUtils::checkMaterialTypes(materials);
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.");
50 
51  // create the name of returned material
52  const std::string avr_mat_name = layer_mat.getName() + "_avg";
53 
54  // calculate averaged magnetization
55  const kvector_t mag_avr = averageData<kvector_t>(
56  layer_mat, regions, [](const Material& mat) { return mat.magnetization(); });
57 
58  if (avr_material_type == MATERIAL_TYPES::RefractiveMaterial) {
59  // avrData returns (1 - mdc)^2 - 1, where mdc is material data conjugate
60  auto avrData = [](const Material& mat) -> complex_t {
61  const complex_t mdc = std::conj(mat.materialData());
62  return mdc * mdc - 2.0 * mdc;
63  };
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) {
68  complex_t (*avrData)(const Material&) = [](const Material& mat) {
69  return mat.materialData();
70  };
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);
73  } else
74  throw std::runtime_error("Error in CalculateAverageMaterial: unknown material type.");
75 }
MATERIAL_TYPES
std::complex< double > complex_t
Definition: Complex.h:20
kvector_t magnetization() const
Get the magnetization (in A/m)
Definition: Material.cpp:79
std::string getName() const
Returns the name of material.
Definition: Material.cpp:69
complex_t materialData() const
Returns underlying material data.
Definition: Material.cpp:84
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.

References MaterialUtils::checkMaterialTypes(), Material::getName(), HomogeneousMaterial(), InvalidMaterialType, Material::magnetization(), MaterialBySLD, Material::materialData(), and RefractiveMaterial.

Referenced by anonymous_namespace{ProcessedSample.cpp}::CreateAverageMaterialSlices().

Here is the call graph for this function:

◆ MaterialProfile()

std::vector<complex_t> MaterialProfile ( const MultiLayer multilayer,
int  n_points,
double  z_min,
double  z_max 
)

Calculate average material profile for given multilayer

Definition at line 20 of file MultiLayerFuncs.cpp.

22 {
23  SimulationOptions options;
24  options.setUseAvgMaterials(true);
25  ProcessedSample sample(multilayer, options);
26  ProfileHelper helper(sample);
27  std::vector<double> z_values = GenerateZValues(n_points, z_min, z_max);
28  return helper.calculateProfile(z_values);
29 }
std::vector< double > GenerateZValues(int n_points, double z_min, double z_max)
Generate z values (equidistant) for use in MaterialProfile.
Data structure that contains all the necessary data for scattering calculations.
Object that can generate the material profile of a sample as a function of depth.
Definition: ProfileHelper.h:32
Collect the different options for simulation.
void setUseAvgMaterials(bool use_avg_materials)

References ProfileHelper::calculateProfile(), GenerateZValues(), and SimulationOptions::setUseAvgMaterials().

Here is the call graph for this function: