24 #ifndef COM_DAFER45_TBTK_SOLVER_LINDHARD_SUSCEPTIBILITY
25 #define COM_DAFER45_TBTK_SOLVER_LINDHARD_SUSCEPTIBILITY
27 #include "TBTK/RPA/MomentumSpaceContext.h"
28 #include "TBTK/Solver/Susceptibility.h"
35 class LindhardSusceptibility :
public Susceptibility{
38 LindhardSusceptibility(
39 const RPA::MomentumSpaceContext &momentumSpaceContext
43 virtual ~LindhardSusceptibility();
48 virtual LindhardSusceptibility* createSlave();
51 virtual std::vector<std::complex<double>> calculateSusceptibility(
53 const std::vector<std::complex<double>> &energies
57 double *fermiDiracLookupTable;
60 LindhardSusceptibility(
61 const RPA::MomentumSpaceContext &momentumSpaceContext,
62 int *kPlusQLookupTable,
63 double *fermiDiracLookupTable
67 template<
bool useKPlusQLookupTable>
68 std::vector<std::complex<double>> calculateSusceptibilityLindhard(
70 const std::vector<std::complex<double>> &energies
75 std::complex<double> getPoleTimesTwoFermi(
76 std::complex<double> energy,
79 double chemicalPotential,
81 int kPlusQLinearIndex,
82 unsigned int meshPoint,
85 unsigned int numOrbitals
91 void generateKPlusQLookupTable();
94 int* getKPlusQLookupTable();
97 const int* getKPlusQLookupTable()
const;
100 template<
bool useKPlusQLookupTable>
101 int getKPlusQLinearIndex(
102 unsigned int meshIndex,
103 const std::vector<double> &k,
108 int *kPlusQLookupTable;
116 inline int* LindhardSusceptibility::getKPlusQLookupTable(){
117 return kPlusQLookupTable;
120 inline const int* LindhardSusceptibility::getKPlusQLookupTable()
const{
121 return kPlusQLookupTable;
125 inline int LindhardSusceptibility::getKPlusQLinearIndex<false>(
126 unsigned int meshIndex,
127 const std::vector<double> &k,
130 const RPA::MomentumSpaceContext &momentumSpaceContext
131 = getMomentumSpaceContext();
133 const std::vector<std::vector<double>> &mesh
134 = momentumSpaceContext.getMesh();
137 = momentumSpaceContext.getBrillouinZone().getMinorCellIndex(
138 {mesh[meshIndex][0] + k[0], mesh[meshIndex][1] + k[1]},
139 momentumSpaceContext.getNumMeshPoints()
141 return momentumSpaceContext.getModel().getHoppingAmplitudeSet().getFirstIndexInBlock(
147 inline int LindhardSusceptibility::getKPlusQLinearIndex<true>(
148 unsigned int meshIndex,
149 const std::vector<double> &k,
152 const RPA::MomentumSpaceContext &momentumSpaceContext
153 = getMomentumSpaceContext();
155 return kPlusQLookupTable[
156 meshIndex*momentumSpaceContext.getMesh().size()
157 + kLinearIndex/momentumSpaceContext.getNumOrbitals()