diff --git a/Core/StandardSamples/MagneticLayersBuilder.cpp b/Core/StandardSamples/MagneticLayersBuilder.cpp index 98b1da61268722d4395457afe50d0499ac50ea36..7c28d15f834c04358a3cd9c51ed631631c51db4e 100644 --- a/Core/StandardSamples/MagneticLayersBuilder.cpp +++ b/Core/StandardSamples/MagneticLayersBuilder.cpp @@ -15,10 +15,12 @@ #include "Core/StandardSamples/MagneticLayersBuilder.h" #include "Core/Aggregate/ParticleLayout.h" #include "Core/Basics/Units.h" +#include "Core/Multilayer/LayerRoughness.h" #include "Core/HardParticle/FormFactorFullSphere.h" #include "Core/Material/MaterialFactoryFuncs.h" #include "Core/Multilayer/Layer.h" #include "Core/Multilayer/MultiLayer.h" +#include "Core/Multilayer/RoughnessModels.h" #include "Core/Parametrization/RealParameter.h" #include "Core/Particle/Particle.h" @@ -102,6 +104,61 @@ MultiLayer* MagneticLayerBuilder::buildSample() const return multi_layer; } +SimpleMagneticRotationBuilder::SimpleMagneticRotationBuilder() = default; + +MultiLayer* SimpleMagneticRotationBuilder::buildSample() const +{ +} + +MultiLayer* SimpleMagneticRotationBuilder::builder(double sigmaRoughness, + RoughnessModel roughnessModel) +{ + MultiLayer* multi_layer = new MultiLayer(); + + kvector_t substr_field = kvector_t(0.0, 1e6, 0.0); + kvector_t layer_field(1e6, 0.0, 0.0); + Material air_material = HomogeneousMaterial("Air", 0.0, 0.0); + Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8, substr_field); + Material layer_material = HomogeneousMaterial("MagLayer", 6e-4, 2e-8, layer_field); + + auto roughness = LayerRoughness(); + roughness.setSigma(sigmaRoughness * Units::angstrom); + + Layer air_layer(air_material); + Layer substrate_layer(substrate_material); + Layer layer(layer_material); + multi_layer->addLayer(air_layer); + multi_layer->addLayerWithTopRoughness(layer, roughness); + multi_layer->addLayerWithTopRoughness(substrate_layer, roughness); + multi_layer->setRoughnessModel(roughnessModel); + return multi_layer; +} + +size_t SimpleMagneticRotationBuilder::size(){return 3;} + +MultiLayer* SimpleMagneticRotationBuilder::createSample(size_t index){ + + switch(index){ + + case 0: + return builder(0.); + + case 1: + setName("Tanh"); + return builder(2., RoughnessModel::TANH); + + case 2: + setName("NC"); + return builder(2., RoughnessModel::NEVOT_CROCE); + + default: + throw std::runtime_error("SimpleMagneticRotationBuilder::createSample() -> Error. " + "Sample index is out of range."); + } + +} + + MagneticRotationBuilder::MagneticRotationBuilder() : m_sphere_radius(5 * Units::nanometer) {} MultiLayer* MagneticRotationBuilder::buildSample() const diff --git a/Core/StandardSamples/MagneticLayersBuilder.h b/Core/StandardSamples/MagneticLayersBuilder.h index 055c98051ee131651de039d5234da4cb08f7be65..72b229cba2cc8f0a7e756599336f388463cd23f0 100644 --- a/Core/StandardSamples/MagneticLayersBuilder.h +++ b/Core/StandardSamples/MagneticLayersBuilder.h @@ -16,6 +16,7 @@ #define BORNAGAIN_CORE_STANDARDSAMPLES_MAGNETICLAYERSBUILDER_H #include "Core/Multilayer/IMultiLayerBuilder.h" +#include "Core/Multilayer/RoughnessModels.h" class ISample; @@ -55,6 +56,22 @@ private: double m_sphere_radius; }; +//! Builds sample: magnetic layer on a magnetic substrate with the fields rotated by 90° +//! @ingroup standard_samples + +class BA_CORE_API_ SimpleMagneticRotationBuilder : public IMultiLayerBuilder +{ +public: + SimpleMagneticRotationBuilder(); + MultiLayer* buildSample() const; + + MultiLayer* createSample(size_t index = 0); + size_t size(); +protected: + MultiLayer* builder(double sigmaRoughness = 0., + RoughnessModel roughnessModel = RoughnessModel::TANH); +}; + //! Builds sample: rotated magnetic spheres in substrate layer with a unit magnetic field. //! @ingroup standard_samples diff --git a/Core/StandardSamples/SampleBuilderFactory.cpp b/Core/StandardSamples/SampleBuilderFactory.cpp index a80d8fb69c17cec190867f0e891646f0136d6159..eab50185219a3657e438318d90c0103536d65a41 100644 --- a/Core/StandardSamples/SampleBuilderFactory.cpp +++ b/Core/StandardSamples/SampleBuilderFactory.cpp @@ -113,6 +113,8 @@ SampleBuilderFactory::SampleBuilderFactory() registerItem("SimpleMagneticLayerBuilder", create_new<SimpleMagneticLayerBuilder>); + registerItem("SimpleMagneticRotationBuilder", create_new<SimpleMagneticRotationBuilder>); + registerItem("MagneticLayerBuilder", create_new<MagneticLayerBuilder>); registerItem("FeNiBiLayerBuilder", create_new<FeNiBiLayerBuilder>); diff --git a/Tests/Functional/Std/StandardTests.h b/Tests/Functional/Std/StandardTests.h index bfebae2e60efb390d649d9f9676e41fdaa16fdbc..4606e43c774dcd0dc174cd68c38f0a678698833d 100644 --- a/Tests/Functional/Std/StandardTests.h +++ b/Tests/Functional/Std/StandardTests.h @@ -515,6 +515,18 @@ TEST_F(Std, PolarizedQAngleReflectivityMM) "SimpleMagneticLayerBuilder", 1e-10)); } +TEST_F(Std, MagneticRotationReflectivity) +{ + EXPECT_TRUE(run("MagneticRotationReflectivityPP", "BasicSpecularPP", + "SimpleMagneticRotationBuilder", 1e-10)); + EXPECT_TRUE(run("MagneticRotationReflectivityMM", "BasicSpecularMM", + "SimpleMagneticRotationBuilder", 1e-10)); + EXPECT_TRUE(run("MagneticRotationReflectivityPM", "BasicSpecularPM", + "SimpleMagneticRotationBuilder", 1e-10)); + EXPECT_TRUE(run("MagneticRotationReflectivityMP", "BasicSpecularMP", + "SimpleMagneticRotationBuilder", 1e-10)); +} + TEST_F(Std, PolarizedFeNiBiLayerPP) { EXPECT_TRUE(run("PolarizedFeNiBiLayerPP", "BasicSpecularPP", diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityMM.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityMM.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..51f52a54411117af2f784e43ade25dcd5119b3a0 Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityMM.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityMM_NC.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityMM_NC.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..8e067098762eed1dd794bc6f6b22ccb9ecdb1d14 Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityMM_NC.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityMM_Tanh.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityMM_Tanh.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..6753ee8417d41985322f5bab9215ce1d186937a4 Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityMM_Tanh.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityMP.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityMP.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..4748fc89e42d5a401557450ae5deded45e24b40b Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityMP.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityMP_NC.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityMP_NC.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a7992935a2145fa98b16441e90a9c7f41b2b0ec Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityMP_NC.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityMP_Tanh.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityMP_Tanh.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..25a54a19a284cd84b2720dd69a91f07c371214ce Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityMP_Tanh.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityPM.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityPM.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..da0d83084d43f82505037bfbae148dd29ccad046 Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityPM.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityPM_NC.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityPM_NC.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..571ac574ccf92435b1d73d715dfcf893a1280afb Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityPM_NC.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityPM_Tanh.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityPM_Tanh.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..253f16a0e48d0f380bc4fd853f3dfb37c2e4d5ad Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityPM_Tanh.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityPP.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityPP.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..1dcea2e2bd1ec16de1977ee9d218f4cdd780eeab Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityPP.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityPP_NC.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityPP_NC.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..3c31a709443cc963663e424d48e99f184eea7c1c Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityPP_NC.int.gz differ diff --git a/Tests/ReferenceData/Std/MagneticRotationReflectivityPP_Tanh.int.gz b/Tests/ReferenceData/Std/MagneticRotationReflectivityPP_Tanh.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..741ecfeba74999c08e438cc9d92d5a259348714e Binary files /dev/null and b/Tests/ReferenceData/Std/MagneticRotationReflectivityPP_Tanh.int.gz differ