BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
MaterialBySLDImpl Class Reference
Inheritance diagram for MaterialBySLDImpl:
Collaboration diagram for MaterialBySLDImpl:

Public Member Functions

virtual ~MaterialBySLDImpl ()=default
 
MaterialBySLDImplclone () const override
 
complex_t refractiveIndex (double wavelength) const override
 
complex_t refractiveIndex2 (double wavelength) const override
 
complex_t materialData () const override
 
MATERIAL_TYPES typeID () const override
 
complex_t scalarSubtrSLD (const WavevectorInfo &wavevectors) const override
 
void print (std::ostream &ostr) const override
 
MagneticMaterialImplinverted () const override final
 
bool isScalarMaterial () const override final
 
bool isMagneticMaterial () const override final
 
kvector_t magnetization () const override final
 
Eigen::Matrix2cd polarizedSubtrSLD (const WavevectorInfo &wavevectors) const override final
 
MagneticMaterialImplrotatedMaterial (const Transform3D &transform) const override final
 
const std::string & getName () const
 

Private Member Functions

 MaterialBySLDImpl (const std::string &name, double sld_real, double sld_imag, kvector_t magnetization)
 
complex_t sld () const
 
void setMagnetization (kvector_t magnetization)
 

Private Attributes

double m_sld_real
 
double m_sld_imag
 
kvector_t m_magnetization
 
const std::string m_name
 

Friends

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

Detailed Description

Material implementation based on wavelength-independent data (valid for a range of wavelengths)

Definition at line 24 of file MaterialBySLDImpl.h.

Constructor & Destructor Documentation

◆ ~MaterialBySLDImpl()

virtual MaterialBySLDImpl::~MaterialBySLDImpl ( )
virtualdefault

◆ MaterialBySLDImpl()

MaterialBySLDImpl::MaterialBySLDImpl ( const std::string &  name,
double  sld_real,
double  sld_imag,
kvector_t  magnetization 
)
private

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

SLD units are $ nm^{-2} $.

Definition at line 29 of file MaterialBySLDImpl.cpp.

31  : MagneticMaterialImpl(name, magnetization), m_sld_real(sld_real),
32  m_sld_imag(sld_imag < 0. ? throw std::runtime_error(
33  "The imaginary part of the SLD must be greater or equal zero")
34  : sld_imag)
35 {
36 }
MagneticMaterialImpl(const std::string &name, kvector_t magnetization)
Constructs basic material with name and magnetization.
kvector_t magnetization() const override final
Returns the magnetization (in A/m)
double m_sld_imag
imaginary part of scattering length density (negative by default)
double m_sld_real
complex-valued scattering length density

Referenced by clone().

Member Function Documentation

◆ clone()

MaterialBySLDImpl * MaterialBySLDImpl::clone ( ) const
overridevirtual

Returns pointer to a copy of material.

Implements MagneticMaterialImpl.

Definition at line 38 of file MaterialBySLDImpl.cpp.

39 {
40  return new MaterialBySLDImpl(*this);
41 }
MaterialBySLDImpl(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 (S...

References MaterialBySLDImpl().

Here is the call graph for this function:

◆ refractiveIndex()

complex_t MaterialBySLDImpl::refractiveIndex ( double  wavelength) const
overridevirtual

Returns refractive index.

Implements BaseMaterialImpl.

Definition at line 43 of file MaterialBySLDImpl.cpp.

44 {
45  return std::sqrt(refractiveIndex2(wavelength));
46 }
complex_t refractiveIndex2(double wavelength) const override
Returns squared refractive index.

References refractiveIndex2(), and anonymous_namespace{SlicedCylindersBuilder.cpp}::wavelength().

Here is the call graph for this function:

◆ refractiveIndex2()

complex_t MaterialBySLDImpl::refractiveIndex2 ( double  wavelength) const
overridevirtual

Returns squared refractive index.

Implements BaseMaterialImpl.

Definition at line 48 of file MaterialBySLDImpl.cpp.

49 {
50  return 1.0 - getWlPrefactor(wavelength) * sld();
51 }
complex_t sld() const
Returns the scattering length density.

References anonymous_namespace{MaterialBySLDImpl.cpp}::getWlPrefactor(), sld(), and anonymous_namespace{SlicedCylindersBuilder.cpp}::wavelength().

Referenced by refractiveIndex().

Here is the call graph for this function:

◆ materialData()

complex_t MaterialBySLDImpl::materialData ( ) const
overridevirtual

Returns underlying material data.

Implements BaseMaterialImpl.

Definition at line 53 of file MaterialBySLDImpl.cpp.

54 {
56 }
std::complex< double > complex_t
Definition: Complex.h:20

References m_sld_imag, m_sld_real, and anonymous_namespace{MaterialBySLDImpl.cpp}::square_angstroms.

◆ typeID()

MATERIAL_TYPES MaterialBySLDImpl::typeID ( ) const
inlineoverridevirtual

Returns type of material implementation.

Implements BaseMaterialImpl.

Definition at line 45 of file MaterialBySLDImpl.h.

References MaterialBySLD.

◆ scalarSubtrSLD()

complex_t MaterialBySLDImpl::scalarSubtrSLD ( const WavevectorInfo wavevectors) const
overridevirtual

Returns ( $ \pi/\lambda^2 $ - sld), sld (in $nm^{-2}$) being the scattering length density.

Implements BaseMaterialImpl.

Definition at line 58 of file MaterialBySLDImpl.cpp.

59 {
60  double wavelength = wavevectors.getWavelength();
61  return 1.0 / getWlPrefactor(wavelength) - sld();
62 }
double getWavelength() const

References WavevectorInfo::getWavelength(), anonymous_namespace{MaterialBySLDImpl.cpp}::getWlPrefactor(), sld(), and anonymous_namespace{SlicedCylindersBuilder.cpp}::wavelength().

Here is the call graph for this function:

◆ print()

void MaterialBySLDImpl::print ( std::ostream &  ostr) const
overridevirtual

Prints object data.

Implements BaseMaterialImpl.

Definition at line 64 of file MaterialBySLDImpl.cpp.

65 {
66  ostr << "MaterialBySLD:" << getName() << "<" << this << ">{ "
67  << "sld_real=" << m_sld_real << ", sld_imag = " << m_sld_imag << ", B=" << magnetization()
68  << "}";
69 }
const std::string & getName() const
Returns name of the material.

References BaseMaterialImpl::getName(), m_sld_imag, m_sld_real, and MagneticMaterialImpl::magnetization().

Here is the call graph for this function:

◆ sld()

complex_t MaterialBySLDImpl::sld ( ) const
private

Returns the scattering length density.

Definition at line 71 of file MaterialBySLDImpl.cpp.

72 {
74 }

References m_sld_imag, and m_sld_real.

Referenced by refractiveIndex2(), and scalarSubtrSLD().

◆ inverted()

MagneticMaterialImpl * MagneticMaterialImpl::inverted ( ) const
finaloverridevirtualinherited

Constructs a material with inverted magnetization.

Implements BaseMaterialImpl.

Definition at line 44 of file MagneticMaterialImpl.cpp.

45 {
46  std::string name = isScalarMaterial() ? getName() : getName() + "_inv";
47  MagneticMaterialImpl* result = this->clone();
48  result->setMagnetization(-magnetization());
49  return result;
50 }
Basic implementation for magnetized material.
void setMagnetization(kvector_t magnetization)
MagneticMaterialImpl * clone() const override=0
Returns pointer to a copy of material.
bool isScalarMaterial() const override final
Indicates whether the interaction with the material is scalar.

References MagneticMaterialImpl::clone(), BaseMaterialImpl::getName(), MagneticMaterialImpl::isScalarMaterial(), MagneticMaterialImpl::magnetization(), and MagneticMaterialImpl::setMagnetization().

Here is the call graph for this function:

◆ isScalarMaterial()

bool MagneticMaterialImpl::isScalarMaterial ( ) const
finaloverridevirtualinherited

Indicates whether the interaction with the material is scalar.

This means that different polarization states will be diffracted equally

Implements BaseMaterialImpl.

Definition at line 52 of file MagneticMaterialImpl.cpp.

53 {
54  return m_magnetization == kvector_t{};
55 }
kvector_t m_magnetization
magnetization

References MagneticMaterialImpl::m_magnetization.

Referenced by MagneticMaterialImpl::inverted(), and MagneticMaterialImpl::isMagneticMaterial().

◆ isMagneticMaterial()

bool MagneticMaterialImpl::isMagneticMaterial ( ) const
finaloverridevirtualinherited

Implements BaseMaterialImpl.

Definition at line 57 of file MagneticMaterialImpl.cpp.

58 {
59  return !isScalarMaterial();
60 }

References MagneticMaterialImpl::isScalarMaterial().

Here is the call graph for this function:

◆ magnetization()

kvector_t MagneticMaterialImpl::magnetization ( ) const
finaloverridevirtualinherited

Returns the magnetization (in A/m)

Implements BaseMaterialImpl.

Definition at line 62 of file MagneticMaterialImpl.cpp.

63 {
64  return m_magnetization;
65 }

References MagneticMaterialImpl::m_magnetization.

Referenced by MagneticMaterialImpl::inverted(), print(), RefractiveMaterialImpl::print(), and MagneticMaterialImpl::setMagnetization().

◆ polarizedSubtrSLD()

Eigen::Matrix2cd MagneticMaterialImpl::polarizedSubtrSLD ( const WavevectorInfo wavevectors) const
finaloverridevirtualinherited

Returns ( $ \pi/\lambda^2 $ - sld) matrix with magnetization corrections.

Implements BaseMaterialImpl.

Definition at line 67 of file MagneticMaterialImpl.cpp.

68 {
69  cvector_t mag_ortho = OrthogonalToBaseVector(wavevectors.getQ(), m_magnetization);
70  complex_t unit_factor = scalarSubtrSLD(wavevectors);
72 }
constexpr double magnetization_prefactor
virtual complex_t scalarSubtrSLD(const WavevectorInfo &wavevectors) const =0
Returns ( - sld), sld being the scattering length density.
cvector_t getQ() const
Eigen::Matrix2cd MagnetizationCorrection(complex_t unit_factor, double magnetic_factor, BasicVector3D< T > polarization)
cvector_t OrthogonalToBaseVector(cvector_t base, const kvector_t vector)

References WavevectorInfo::getQ(), MagneticMaterialImpl::m_magnetization, magnetization_prefactor, MaterialUtils::MagnetizationCorrection(), anonymous_namespace{MagneticMaterialImpl.cpp}::OrthogonalToBaseVector(), and BaseMaterialImpl::scalarSubtrSLD().

Here is the call graph for this function:

◆ rotatedMaterial()

MagneticMaterialImpl * MagneticMaterialImpl::rotatedMaterial ( const Transform3D transform) const
finaloverridevirtualinherited

Implements BaseMaterialImpl.

Definition at line 74 of file MagneticMaterialImpl.cpp.

75 {
76  kvector_t transformed_field = transform.transformed(m_magnetization);
77  MagneticMaterialImpl* result = this->clone();
78  result->setMagnetization(transformed_field);
79  return result;
80 }
ivector_t transformed(const ivector_t &v) const
Return transformed vector v.

References MagneticMaterialImpl::clone(), MagneticMaterialImpl::m_magnetization, MagneticMaterialImpl::setMagnetization(), and Transform3D::transformed().

Here is the call graph for this function:

◆ setMagnetization()

void MagneticMaterialImpl::setMagnetization ( kvector_t  magnetization)
inlineprivateinherited

Definition at line 57 of file MagneticMaterialImpl.h.

References MagneticMaterialImpl::m_magnetization, and MagneticMaterialImpl::magnetization().

Referenced by MagneticMaterialImpl::inverted(), and MagneticMaterialImpl::rotatedMaterial().

Here is the call graph for this function:

◆ getName()

const std::string& BaseMaterialImpl::getName ( ) const
inlineinherited

Returns name of the material.

Definition at line 78 of file BaseMaterialImpl.h.

78 { return m_name; }
const std::string m_name

References BaseMaterialImpl::m_name.

Referenced by MagneticMaterialImpl::inverted(), print(), and RefractiveMaterialImpl::print().

Friends And Related Function Documentation

◆ MaterialBySLD

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

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 47 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 }
A wrapper for underlying material implementation.
Definition: Material.h:29
static constexpr double angstrom
Definition: Units.h:25

Member Data Documentation

◆ m_sld_real

double MaterialBySLDImpl::m_sld_real
private

complex-valued scattering length density

Definition at line 62 of file MaterialBySLDImpl.h.

Referenced by materialData(), print(), and sld().

◆ m_sld_imag

double MaterialBySLDImpl::m_sld_imag
private

imaginary part of scattering length density (negative by default)

Definition at line 63 of file MaterialBySLDImpl.h.

Referenced by materialData(), print(), and sld().

◆ m_magnetization

◆ m_name

const std::string BaseMaterialImpl::m_name
privateinherited

Definition at line 81 of file BaseMaterialImpl.h.

Referenced by BaseMaterialImpl::getName().


The documentation for this class was generated from the following files: