TBTK
Need a break? Support the development by playing Polarity Puzzles
MatsubaraSusceptibilityCalculator.h
1 /* Copyright 2018 Kristofer Björnson
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
17 
24 #ifndef COM_DAFER45_TBTK_MATSUBARA_SUSCEPTIBILITY_CALCULATOR
25 #define COM_DAFER45_TBTK_MATSUBARA_SUSCEPTIBILITY_CALCULATOR
26 
27 #include "TBTK/RPA/SusceptibilityCalculator.h"
28 
29 #include <complex>
30 
31 //#include <omp.h>
32 
33 namespace TBTK{
34 
35 class MatsubaraSusceptibilityCalculator : public SusceptibilityCalculator{
36 public:
38  MatsubaraSusceptibilityCalculator(
39  const RPA::MomentumSpaceContext &momentumSpaceContext
40  );
41 
43  ~MatsubaraSusceptibilityCalculator();
44 
48  MatsubaraSusceptibilityCalculator* createSlave();
49 
51  std::complex<double> calculateSusceptibility(
52  const std::vector<double> &k,
53  const std::vector<int> &orbitalIndices,
54  std::complex<double> energy
55  );
56 
58  std::vector<std::complex<double>> calculateSusceptibility(
59  const DualIndex &kDual,
60  const std::vector<int> &orbitalIndices
61  );
62 
64  void setNumSummationEnergies(unsigned int numSummationEnergies);
65 private:
67  std::complex<double> *greensFunction;
68 
70  std::vector<std::complex<double>> summationEnergies;
71 
73  MatsubaraSusceptibilityCalculator(
74  const RPA::MomentumSpaceContext &momentumSpaceContext,
75  int *kPlusQLookupTable
76  );
77 
79  std::complex<double> calculateSusceptibilityMatsubara(
80  const std::vector<double> &k,
81  const std::vector<int> &orbitalIndices,
82  std::complex<double> energy
83  );
84 
86  template<bool useKPlusQLookupTable>
87  std::vector<std::complex<double>> calculateSusceptibilityMatsubara(
88  const DualIndex &kDual,
89  const std::vector<int> &orbitalIndices
90  );
91 
93  void calculateGreensFunction();
94 
96  std::complex<double>& getGreensFunctionValue(
97  unsigned int meshPoint,
98  unsigned int orbital0,
99  unsigned int orbital1,
100  unsigned int energy,
101  unsigned int numEnergies,
102  unsigned int numOrbitals
103  );
104 };
105 
106 inline void MatsubaraSusceptibilityCalculator::setNumSummationEnergies(
107  unsigned int numSummationEnergies
108 ){
109  TBTKAssert(
110  numSummationEnergies%2 == 1,
111  "MatsubaraSusceptibilityCalculator::setNumSummationEnergies()",
112  "The number of summation energies must be an odd number.",
113  ""
114  );
115 
116  double temperature
117  = UnitHandler::convertNaturalToBase<Quantity::Temperature>(
118  getMomentumSpaceContext().getModel().getTemperature()
119  );
120  double kT = UnitHandler::getConstantInBaseUnits("k_B")*temperature;
121  double hbar = UnitHandler::getConstantInBaseUnits("hbar");
122 
123  summationEnergies.clear();
124  for(unsigned int n = 0; n < numSummationEnergies; n++){
125  summationEnergies.push_back(
126  M_PI*(2*(n - numSummationEnergies/2))*kT/hbar
127  );
128  }
129 
130  clearCache();
131  if(greensFunction != nullptr){
132  delete [] greensFunction;
133  greensFunction = nullptr;
134  }
135 }
136 
137 /*inline std::vector<std::complex<double>> SusceptibilityCalculator::calculateSusceptibility(
138  const std::vector<double> &k,
139  const std::vector<int> &orbitalIndices
140 ){
141  return calculateSusceptibility(
142  DualIndex(
143  momentumSpaceContext->getKIndex(k),
144  k
145  ),
146  orbitalIndices
147  );
148 }*/
149 
150 inline std::complex<double>& MatsubaraSusceptibilityCalculator::getGreensFunctionValue(
151  unsigned int meshPoint,
152  unsigned int orbital0,
153  unsigned int orbital1,
154  unsigned int energy,
155  unsigned int numEnergies,
156  unsigned int numOrbitals
157 ){
158  return greensFunction[
159  numEnergies*(
160  numOrbitals*(numOrbitals*meshPoint + orbital0)
161  + orbital1
162  ) + energy
163  ];
164 }
165 
166 }; //End of namespace TBTK
167 
168 #endif
169 
static double getConstantInBaseUnits(const std::string &name)
Definition: Boolean.h:32