BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
MaterialBySLDImpl Class Reference

Description

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

Definition at line 29 of file MaterialBySLDImpl.h.

Inheritance diagram for MaterialBySLDImpl:
[legend]
Collaboration diagram for MaterialBySLDImpl:
[legend]

Public Member Functions

 ~MaterialBySLDImpl () override=default
 
MaterialBySLDImplclone () const override
 Returns pointer to a copy of material. More...
 
MagneticMaterialImplinverted () const override
 Constructs a material with inverted magnetization. More...
 
bool isMagneticMaterial () const override
 
bool isScalarMaterial () const override
 Indicates whether the interaction with the material is scalar. This means that different polarization states will be diffracted equally. More...
 
R3 magnetization () const override
 Returns the magnetization (in A/m) More...
 
complex_t materialData () const override
 Returns underlying material data. More...
 
const std::string & matName () const
 Returns name of the material. More...
 
SpinMatrix polarizedSubtrSLD (const WavevectorInfo &wavevectors) const override
 Returns ( $ \pi/\lambda^2 $ - sld) matrix with magnetization corrections. More...
 
std::string print () const override
 Prints object data. More...
 
complex_t refractiveIndex (double wavelength) const override
 Returns refractive index. More...
 
complex_t refractiveIndex2 (double wavelength) const override
 Returns squared refractive index. More...
 
MagneticMaterialImplrotatedMaterial (const RotMatrix &transform) const override
 
complex_t scalarSubtrSLD (double lambda0) const override
 Returns ( $ \pi/\lambda^2 $ - sld), sld (in $nm^{-2}$) being the scattering length density. More...
 
MATERIAL_TYPES typeID () const override
 Returns type of material implementation. More...
 

Private Member Functions

 MaterialBySLDImpl (const std::string &name, double sld_real, double sld_imag, R3 magnetization)
 Constructs a wavelength-independent material with a given complex-valued scattering length density (SLD). SLD units are $ nm^{-2} $. More...
 
void setMagnetization (R3 magnetization)
 
complex_t sld () const
 Returns the scattering length density. More...
 

Private Attributes

R3 m_magnetization
 magnetization More...
 
const std::string m_name
 
const double m_sld_imag
 imaginary part of scattering length density (negative by default) More...
 
const double m_sld_real
 complex-valued scattering length density More...
 

Friends

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

Constructor & Destructor Documentation

◆ ~MaterialBySLDImpl()

MaterialBySLDImpl::~MaterialBySLDImpl ( )
overridedefault

◆ MaterialBySLDImpl()

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

Constructs a wavelength-independent material with a given complex-valued scattering length density (SLD). SLD units are $ nm^{-2} $.

Definition at line 31 of file MaterialBySLDImpl.cpp.

34  , m_sld_real(sld_real)
35  , m_sld_imag(sld_imag < 0. ? throw std::runtime_error(
36  "The imaginary part of the SLD must be greater or equal zero")
37  : sld_imag)
38 {
39 }
MagneticMaterialImpl(const std::string &name, R3 magnetization)
Constructs basic material with name and magnetization.
R3 magnetization() const override
Returns the magnetization (in A/m)
const double m_sld_imag
imaginary part of scattering length density (negative by default)
const 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 41 of file MaterialBySLDImpl.cpp.

42 {
43  return new MaterialBySLDImpl(*this);
44 }
MaterialBySLDImpl(const std::string &name, double sld_real, double sld_imag, R3 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:

◆ inverted()

MagneticMaterialImpl * MagneticMaterialImpl::inverted ( ) const
overridevirtualinherited

Constructs a material with inverted magnetization.

Implements BaseMaterialImpl.

Definition at line 48 of file MagneticMaterialImpl.cpp.

49 {
50  std::string name = isScalarMaterial() ? matName() : matName() + "_inv";
51  MagneticMaterialImpl* result = this->clone();
52  result->setMagnetization(-magnetization());
53  return result;
54 }
const std::string & matName() const
Returns name of the material.
Basic implementation for magnetized material. Inherited by RefractiveMaterialImpl and MaterialBySLDIm...
bool isScalarMaterial() const override
Indicates whether the interaction with the material is scalar. This means that different polarization...
MagneticMaterialImpl * clone() const override=0
Returns pointer to a copy of material.
void setMagnetization(R3 magnetization)

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

Here is the call graph for this function:

◆ isMagneticMaterial()

bool MagneticMaterialImpl::isMagneticMaterial ( ) const
overridevirtualinherited

Implements BaseMaterialImpl.

Definition at line 61 of file MagneticMaterialImpl.cpp.

62 {
63  return !isScalarMaterial();
64 }

References MagneticMaterialImpl::isScalarMaterial().

Here is the call graph for this function:

◆ isScalarMaterial()

bool MagneticMaterialImpl::isScalarMaterial ( ) const
overridevirtualinherited

Indicates whether the interaction with the material is scalar. This means that different polarization states will be diffracted equally.

Implements BaseMaterialImpl.

Definition at line 56 of file MagneticMaterialImpl.cpp.

57 {
58  return m_magnetization == R3{};
59 }
R3 m_magnetization
magnetization

References MagneticMaterialImpl::m_magnetization.

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

◆ magnetization()

R3 MagneticMaterialImpl::magnetization ( ) const
overridevirtualinherited

Returns the magnetization (in A/m)

Implements BaseMaterialImpl.

Definition at line 66 of file MagneticMaterialImpl.cpp.

67 {
68  return m_magnetization;
69 }

References MagneticMaterialImpl::m_magnetization.

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

◆ materialData()

complex_t MaterialBySLDImpl::materialData ( ) const
overridevirtual

Returns underlying material data.

Implements BaseMaterialImpl.

Definition at line 56 of file MaterialBySLDImpl.cpp.

57 {
58  return complex_t(m_sld_real * square_angstroms, m_sld_imag * square_angstroms);
59 }

References m_sld_imag, and m_sld_real.

◆ matName()

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

Returns name of the material.

Definition at line 85 of file BaseMaterialImpl.h.

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

References BaseMaterialImpl::m_name.

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

◆ polarizedSubtrSLD()

SpinMatrix MagneticMaterialImpl::polarizedSubtrSLD ( const WavevectorInfo wavevectors) const
overridevirtualinherited

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

Implements BaseMaterialImpl.

Definition at line 71 of file MagneticMaterialImpl.cpp.

72 {
73  C3 mag_ortho = OrthogonalToBaseVector(wavevectors.getQ(), m_magnetization);
74  complex_t unit_factor = scalarSubtrSLD(wavevectors.vacuumLambda());
75  return MaterialUtils::MagnetizationCorrection(unit_factor, magnetization_prefactor, mag_ortho);
76 }
virtual complex_t scalarSubtrSLD(double lambda0) const =0
Returns ( - sld), sld being the scattering length density.
double vacuumLambda() const
C3 getQ() const
SpinMatrix MagnetizationCorrection(complex_t unit_factor, double magnetic_factor, Vec3< T > polarization)

References WavevectorInfo::getQ(), MagneticMaterialImpl::m_magnetization, MaterialUtils::MagnetizationCorrection(), BaseMaterialImpl::scalarSubtrSLD(), and WavevectorInfo::vacuumLambda().

Here is the call graph for this function:

◆ print()

std::string MaterialBySLDImpl::print ( ) const
overridevirtual

Prints object data.

Implements BaseMaterialImpl.

Definition at line 66 of file MaterialBySLDImpl.cpp.

67 {
68  std::stringstream s;
69  s << "MaterialBySLD:" << matName() << "<" << this << ">{ "
70  << "sld_real=" << m_sld_real << ", sld_imag = " << m_sld_imag << ", B=" << magnetization()
71  << "}";
72  return s.str();
73 }

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

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 46 of file MaterialBySLDImpl.cpp.

47 {
48  return std::sqrt(refractiveIndex2(wavelength));
49 }
complex_t refractiveIndex2(double wavelength) const override
Returns squared refractive index.

References refractiveIndex2().

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 51 of file MaterialBySLDImpl.cpp.

52 {
53  return 1.0 - getWlPrefactor(wavelength) * sld();
54 }
complex_t sld() const
Returns the scattering length density.

References sld().

Referenced by refractiveIndex().

Here is the call graph for this function:

◆ rotatedMaterial()

MagneticMaterialImpl * MagneticMaterialImpl::rotatedMaterial ( const RotMatrix transform) const
overridevirtualinherited

Implements BaseMaterialImpl.

Definition at line 78 of file MagneticMaterialImpl.cpp.

79 {
80  R3 transformed_field = transform.transformed(m_magnetization);
81  MagneticMaterialImpl* result = this->clone();
82  result->setMagnetization(transformed_field);
83  return result;
84 }
T transformed(const T &v) const
Return transformed vector v.
Definition: RotMatrix.cpp:76

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

Here is the call graph for this function:

◆ scalarSubtrSLD()

complex_t MaterialBySLDImpl::scalarSubtrSLD ( double  lambda0) const
overridevirtual

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

Implements BaseMaterialImpl.

Definition at line 61 of file MaterialBySLDImpl.cpp.

62 {
63  return 1.0 / getWlPrefactor(lambda0) - sld();
64 }

References sld().

Here is the call graph for this function:

◆ setMagnetization()

void MagneticMaterialImpl::setMagnetization ( R3  magnetization)
inlineprivateinherited

Definition at line 61 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:

◆ sld()

complex_t MaterialBySLDImpl::sld ( ) const
private

Returns the scattering length density.

Definition at line 75 of file MaterialBySLDImpl.cpp.

76 {
77  return complex_t(m_sld_real, -m_sld_imag);
78 }

References m_sld_imag, and m_sld_real.

Referenced by refractiveIndex2(), and scalarSubtrSLD().

◆ typeID()

MATERIAL_TYPES MaterialBySLDImpl::typeID ( ) const
inlineoverridevirtual

Returns type of material implementation.

Implements BaseMaterialImpl.

Definition at line 49 of file MaterialBySLDImpl.h.

References MaterialBySLD.

Friends And Related Function Documentation

◆ MaterialBySLD

Material MaterialBySLD ( const std::string &  name,
double  sld_real,
double  sld_imag,
R3  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 45 of file MaterialFactoryFuncs.cpp.

46 {
47  constexpr double inv_sq_angstroms = 1.0 / (Units::angstrom * Units::angstrom);
48  std::unique_ptr<MaterialBySLDImpl> mat_impl(new MaterialBySLDImpl(
49  name, sld_real * inv_sq_angstroms, sld_imag * inv_sq_angstroms, magnetization));
50  return Material(std::move(mat_impl));
51 }
A wrapper for underlying material implementation.
Definition: Material.h:35
static constexpr double angstrom
Definition: Units.h:34

Member Data Documentation

◆ m_magnetization

◆ m_name

const std::string BaseMaterialImpl::m_name
privateinherited

Definition at line 88 of file BaseMaterialImpl.h.

Referenced by BaseMaterialImpl::matName().

◆ m_sld_imag

const double MaterialBySLDImpl::m_sld_imag
private

imaginary part of scattering length density (negative by default)

Definition at line 66 of file MaterialBySLDImpl.h.

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

◆ m_sld_real

const double MaterialBySLDImpl::m_sld_real
private

complex-valued scattering length density

Definition at line 65 of file MaterialBySLDImpl.h.

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


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