BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
anonymous_namespace{ProcessedSample.cpp} Namespace Reference

Functions

std::unique_ptr< IFresnelMapCreateFresnelMap (const MultiLayer &sample, const std::vector< Slice > &slices, const SimulationOptions &options)
 
bool ContainsMagneticMaterial (const MultiLayer &sample)
 
bool ContainsMagneticSlice (const std::vector< Slice > &slices)
 
bool CheckRegions (const std::vector< HomogeneousRegion > &regions)
 
std::vector< SliceCreateAverageMaterialSlices (const std::vector< Slice > &slices, const std::map< size_t, std::vector< HomogeneousRegion >> &region_map)
 

Function Documentation

◆ CreateFresnelMap()

std::unique_ptr< IFresnelMap > anonymous_namespace{ProcessedSample.cpp}::CreateFresnelMap ( const MultiLayer sample,
const std::vector< Slice > &  slices,
const SimulationOptions options 
)

Definition at line 280 of file ProcessedSample.cpp.

283 {
284  std::unique_ptr<IFresnelMap> P_result;
285  if (ContainsMagneticSlice(slices))
286  P_result = std::make_unique<MatrixFresnelMap>(SpecularStrategyBuilder::build(sample, true));
287  else
288  P_result =
289  std::make_unique<ScalarFresnelMap>(SpecularStrategyBuilder::build(sample, false));
290  if (options.isIntegrate())
291  P_result->disableCaching();
292  return P_result;
293 }
bool isIntegrate() const
static std::unique_ptr< ISpecularStrategy > build(const MultiLayer &sample, const bool magnetic)
bool ContainsMagneticSlice(const std::vector< Slice > &slices)

References SpecularStrategyBuilder::build(), ContainsMagneticSlice(), and SimulationOptions::isIntegrate().

Referenced by ProcessedSample::ProcessedSample().

Here is the call graph for this function:

◆ ContainsMagneticMaterial()

bool anonymous_namespace{ProcessedSample.cpp}::ContainsMagneticMaterial ( const MultiLayer sample)

Definition at line 295 of file ProcessedSample.cpp.

296 {
297  for (const Material* mat : sample.containedMaterials())
298  if (mat->isMagneticMaterial())
299  return true;
300  return false;
301 }
std::vector< const Material * > containedMaterials() const
Returns set of unique materials contained in this ISample.
Definition: ISample.cpp:23
A wrapper for underlying material implementation.
Definition: Material.h:29

References ISample::containedMaterials().

Referenced by ProcessedSample::initLayouts().

Here is the call graph for this function:

◆ ContainsMagneticSlice()

bool anonymous_namespace{ProcessedSample.cpp}::ContainsMagneticSlice ( const std::vector< Slice > &  slices)

Definition at line 303 of file ProcessedSample.cpp.

304 {
305  for (size_t i = 0; i < slices.size(); ++i) {
306  if (slices[i].material().isMagneticMaterial())
307  return true;
308  }
309  return false;
310 }

Referenced by CreateFresnelMap().

◆ CheckRegions()

bool anonymous_namespace{ProcessedSample.cpp}::CheckRegions ( const std::vector< HomogeneousRegion > &  regions)

Definition at line 312 of file ProcessedSample.cpp.

313 {
314  double total_fraction = 0.0;
315  for (auto& region : regions)
316  total_fraction += region.m_volume;
317  return (total_fraction >= 0 && total_fraction <= 1);
318 }

Referenced by CreateAverageMaterialSlices().

◆ CreateAverageMaterialSlices()

std::vector< Slice > anonymous_namespace{ProcessedSample.cpp}::CreateAverageMaterialSlices ( const std::vector< Slice > &  slices,
const std::map< size_t, std::vector< HomogeneousRegion >> &  region_map 
)

Definition at line 321 of file ProcessedSample.cpp.

323 {
324  std::vector<Slice> result = slices;
325  auto last_slice_index = slices.size() - 1;
326  for (auto& entry : region_map) {
327  auto i_slice = entry.first;
328  if (i_slice == 0 || i_slice == last_slice_index)
329  continue; // skip semi-infinite layers
330  auto slice_mat = slices[i_slice].material();
331  if (!CheckRegions(entry.second))
332  throw std::runtime_error("CreateAverageMaterialSlices: "
333  "total volumetric fraction of particles exceeds 1!");
334  auto new_material = createAveragedMaterial(slice_mat, entry.second);
335  result[i_slice].setMaterial(new_material);
336  }
337  return result;
338 }
Material createAveragedMaterial(const Material &layer_mat, const std::vector< HomogeneousRegion > &regions)
Creates averaged material.
bool CheckRegions(const std::vector< HomogeneousRegion > &regions)

References CheckRegions(), and createAveragedMaterial().

Referenced by ProcessedSample::initFresnelMap().

Here is the call graph for this function: