Skip to content
Snippets Groups Projects
Commit 79acb2cf authored by Van Herck, Walter's avatar Van Herck, Walter
Browse files

Merge branch 'polMesoTransformed' into develop

parents c886b7fe ca3d3a1f
No related branches found
No related tags found
No related merge requests found
......@@ -163,7 +163,7 @@
<buildTargets>
<target name="CMake Release" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>cmake</buildCommand>
<buildArguments>-E chdir ../BornAgain_cmake_release/ cmake -G "Unix Makefiles" ../BornAgain/ -DCMAKE_BUILD_TYPE=Release</buildArguments>
<buildArguments>-E chdir ../BornAgain_cmake_release/ cmake -G "Unix Makefiles" ../BornAgain/ -DCMAKE_BUILD_TYPE=Release -DBORNAGAIN_APP=ON</buildArguments>
<buildTarget/>
<stopOnError>true</stopOnError>
<useDefaultCommand>false</useDefaultCommand>
......@@ -171,7 +171,7 @@
</target>
<target name="CMake Debug" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>cmake</buildCommand>
<buildArguments>-E chdir ../BornAgain_cmake_debug/ cmake -G "Unix Makefiles" ../BornAgain/ -DCMAKE_BUILD_TYPE=Debug</buildArguments>
<buildArguments>-E chdir ../BornAgain_cmake_debug/ cmake -G "Unix Makefiles" ../BornAgain/ -DCMAKE_BUILD_TYPE=Debug -DBORNAGAIN_APP=ON</buildArguments>
<buildTarget/>
<stopOnError>true</stopOnError>
<useDefaultCommand>false</useDefaultCommand>
......
......@@ -48,6 +48,8 @@ public:
virtual double getVolume() const;
void setTransformation(const Geometry::PTransform3D& P_transform);
private:
void calculateLargestReciprocalDistance();
......@@ -58,6 +60,8 @@ private:
IFormFactor *mp_meso_form_factor;
const IMaterial *mp_ambient_material;
double m_max_rec_length;
Geometry::PTransform3D mP_transform;
Geometry::PTransform3D mP_inverse_transform;
};
#endif /* FORMFACTORCRYSTAL_H_ */
......
......@@ -47,6 +47,9 @@ FormFactorCrystal* FormFactorCrystal::clone() const
*mp_meso_form_factor, mp_ambient_material,
m_wavevector_scattering_factor);
result->setName(getName());
if (mP_transform.get()) {
result->setTransformation(mP_transform);
}
return result;
}
......@@ -67,7 +70,16 @@ complex_t FormFactorCrystal::evaluate(const cvector_t& k_i,
const Bin1DCVector& k_f_bin, Bin1D alpha_f_bin) const
{
// construct a real reciprocal vector
Bin1DCVector q_bin(k_i - k_f_bin.m_q_lower, k_i - k_f_bin.m_q_upper);
cvector_t q_bin_lower = k_i - k_f_bin.m_q_lower;
cvector_t q_bin_upper = k_i - k_f_bin.m_q_upper;
Bin1DCVector q_bin;
if (mP_inverse_transform.get()) {
q_bin = Bin1DCVector(mP_inverse_transform->transformed(q_bin_lower),
mP_inverse_transform->transformed(q_bin_upper));
} else {
q_bin = Bin1DCVector(q_bin_lower, q_bin_upper);
}
cvector_t q = q_bin.getMidPoint();
kvector_t q_real(q.x().real(), q.y().real(), q.z().real());
cvector_t k_zero;
......@@ -101,7 +113,16 @@ Eigen::Matrix2cd FormFactorCrystal::evaluatePol(const cvector_t& k_i,
const Bin1DCVector& k_f_bin, Bin1D alpha_f_bin, Bin1D phi_f_bin) const
{
// construct a real reciprocal vector
Bin1DCVector q_bin(k_i - k_f_bin.m_q_lower, k_i - k_f_bin.m_q_upper);
cvector_t q_bin_lower = k_i - k_f_bin.m_q_lower;
cvector_t q_bin_upper = k_i - k_f_bin.m_q_upper;
Bin1DCVector q_bin;
if (mP_inverse_transform.get()) {
q_bin = Bin1DCVector(mP_inverse_transform->transformed(q_bin_lower),
mP_inverse_transform->transformed(q_bin_upper));
} else {
q_bin = Bin1DCVector(q_bin_lower, q_bin_upper);
}
cvector_t q = q_bin.getMidPoint();
kvector_t q_real(q.x().real(), q.y().real(), q.z().real());
cvector_t k_zero;
......@@ -119,6 +140,7 @@ Eigen::Matrix2cd FormFactorCrystal::evaluatePol(const cvector_t& k_i,
cvector_t q_i((*it).x(), (*it).y(), (*it).z());
Bin1DCVector min_q_i_zero_bin(-q_i, -q_i);
Bin1DCVector q_i_min_q(q_i - q_bin.m_q_lower, q_i - q_bin.m_q_upper);
//TODO: transform the matrix amplitude back!
Eigen::Matrix2cd basis_factor = mp_basis_form_factor->evaluatePol(
k_zero, min_q_i_zero_bin, alpha_f_bin, phi_f_bin);
complex_t meso_factor = mp_meso_form_factor->evaluate(
......@@ -136,6 +158,13 @@ double FormFactorCrystal::getVolume() const
return mp_meso_form_factor->getVolume();
}
void FormFactorCrystal::setTransformation(
const Geometry::PTransform3D& P_transform)
{
mP_transform = P_transform;
mP_inverse_transform = mP_transform->inverse();
}
void FormFactorCrystal::calculateLargestReciprocalDistance()
{
kvector_t a1 = m_lattice.getBasisVectorA();
......
......@@ -43,7 +43,8 @@ public:
virtual IFormFactor *createTotalFormFactor(
const IFormFactor& meso_crystal_form_factor,
const IMaterial *p_ambient_material,
complex_t wavevector_scattering_factor) const;
complex_t wavevector_scattering_factor,
const Geometry::PTransform3D& transform) const;
Lattice getLattice() const { return m_lattice; }
LatticeBasis *createBasis() const { return mp_lattice_basis->clone(); }
......
......@@ -59,11 +59,13 @@ public:
virtual IFormFactor *createTotalFormFactor(
const IFormFactor& meso_crystal_form_factor,
const IMaterial *p_ambient_material,
complex_t wavevector_scattering_factor) const
complex_t wavevector_scattering_factor,
const Geometry::PTransform3D& transform) const
{
(void)meso_crystal_form_factor;
(void)p_ambient_material;
(void)wavevector_scattering_factor;
(void)transform;
throw NotImplementedException(
"IClusteredParticles::createTotalFormFactor() "
"-> NotImplementedException");
......
......@@ -52,11 +52,15 @@ Crystal* Crystal::cloneInvertB() const
IFormFactor* Crystal::createTotalFormFactor(
const IFormFactor& meso_crystal_form_factor,
const IMaterial *p_ambient_material,
complex_t wavevector_scattering_factor) const
complex_t wavevector_scattering_factor,
const Geometry::PTransform3D& P_transform) const
{
IFormFactor *p_ff_crystal =
FormFactorCrystal *p_ff_crystal =
new FormFactorCrystal(*this, meso_crystal_form_factor,
p_ambient_material, wavevector_scattering_factor);
if (P_transform.get()) {
p_ff_crystal->setTransformation(P_transform);
}
if (m_dw_factor>0.0) {
return new FormFactorDecoratorDebyeWaller(p_ff_crystal, m_dw_factor);
}
......
......@@ -70,18 +70,9 @@ void MesoCrystal::setAmbientMaterial(const IMaterial* p_material)
IFormFactor* MesoCrystal::createFormFactor(
complex_t wavevector_scattering_factor) const
{
IFormFactor *p_result;
IFormFactor *p_crystal_ff = mp_particle_structure->createTotalFormFactor(
return mp_particle_structure->createTotalFormFactor(
*mp_meso_form_factor, mp_ambient_material,
wavevector_scattering_factor);
if(mP_transform.get()) {
p_result = new FormFactorDecoratorTransformation(
p_crystal_ff, mP_transform);
}
else {
p_result = p_crystal_ff;
}
return p_result;
wavevector_scattering_factor, mP_transform);
}
void MesoCrystal::setSimpleFormFactor(IFormFactor* p_form_factor)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment