/
CrystalFieldPeaks.cpp
67 lines (50 loc) · 2.32 KB
/
CrystalFieldPeaks.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Mantid Repository : https://github.com/mantidproject/mantid
//
// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
// NScD Oak Ridge National Laboratory, European Spallation Source,
// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
// SPDX - License - Identifier: GPL - 3.0 +
#include "MantidCurveFitting/Functions/CrystalFieldPeaks.h"
#include "MantidAPI/FunctionFactory.h"
#include "MantidCurveFitting/Functions/CrystalElectricField.h"
#include <functional>
#include <map>
namespace Mantid::CurveFitting::Functions {
DECLARE_FUNCTION(CrystalFieldPeaks)
/// Constructor
CrystalFieldPeaks::CrystalFieldPeaks() : CrystalFieldPeaksBase(), API::IFunctionGeneral(), m_defaultDomainSize(0) {
declareAttribute("Temperature", Attribute(1.0));
declareParameter("IntensityScaling", 1.0, "A scaling factor for peak intensities.");
}
std::string CrystalFieldPeaks::name() const { return "CrystalFieldPeaks"; }
size_t CrystalFieldPeaks::getNumberDomainColumns() const { return 0; }
size_t CrystalFieldPeaks::getNumberValuesPerArgument() const { return 2; }
size_t CrystalFieldPeaks::getDefaultDomainSize() const { return m_defaultDomainSize; }
void CrystalFieldPeaks::functionGeneral(const API::FunctionDomainGeneral & /*domain*/,
API::FunctionValues &values) const {
DoubleFortranVector en;
ComplexFortranMatrix wf;
int nre = 0;
calculateEigenSystem(en, wf, nre);
auto temperature = getAttribute("Temperature").asDouble();
IntFortranVector degeneration;
DoubleFortranVector eEnergies;
DoubleFortranMatrix iEnergies;
const double de = getAttribute("ToleranceEnergy").asDouble();
const double di = getAttribute("ToleranceIntensity").asDouble();
calculateIntensities(nre, en, wf, temperature, de, degeneration, eEnergies, iEnergies);
DoubleFortranVector eExcitations;
DoubleFortranVector iExcitations;
calculateExcitations(eEnergies, iEnergies, de, di, eExcitations, iExcitations);
size_t n = eExcitations.size();
if (2 * n > values.size()) {
values.expand(2 * n);
}
m_defaultDomainSize = n;
double scaling = getParameter("IntensityScaling");
for (size_t i = 0; i < n; ++i) {
values.setCalculated(i, eExcitations.get(i));
values.setCalculated(i + n, iExcitations.get(i) * scaling);
}
}
} // namespace Mantid::CurveFitting::Functions