TBTK
Need a break? Support the development by playing Polarity Puzzles
RPASusceptibilityCalculator.h
1 /* Copyright 2017 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_RPA_SUSCEPTIBILITY_CALCULATOR
25 #define COM_DAFER45_TBTK_RPA_SUSCEPTIBILITY_CALCULATOR
26 
27 #include "TBTK/InteractionAmplitude.h"
28 #include "TBTK/RPA/MomentumSpaceContext.h"
29 #include "TBTK/SerializableVector.h"
30 #include "TBTK/RPA/SusceptibilityCalculator.h"
31 #include "TBTK/RPA/LindhardSusceptibilityCalculator.h"
32 
33 #include <complex>
34 
35 //#include <omp.h>
36 
37 namespace TBTK{
38 
39 class RPASusceptibilityCalculator{
40 public:
42  RPASusceptibilityCalculator(
43  const RPA::MomentumSpaceContext &momentumSpaceContext,
44  SusceptibilityCalculator::Algorithm algorithm
45  = SusceptibilityCalculator::Algorithm::Lindhard
46  );
47 
49  ~RPASusceptibilityCalculator();
50 
54  RPASusceptibilityCalculator* createSlave();
55 
59  void precompute(unsigned int numWorkers = 129);
60 
61  const RPA::MomentumSpaceContext& getMomentumSpaceContext() const;
62 
64  void setInteractionAmplitudes(
65  const std::vector<InteractionAmplitude> &interactionAmplitudes
66  );
67 
70  enum class EnergyType {Real, Imaginary, Complex};
71 
73 // void setSusceptibilityMode(SusceptibilityCalculator::Mode mode);
74 
76 // SusceptibilityCalculator::Mode getSusceptibilityMode() const;
77 
79  void setEnergyType(EnergyType energyType);
80 
82  EnergyType getEnergyType() const;
83 
86  void setEnergies(
87  const std::vector<std::complex<double>> &energies
88  );
89 
99  void setEnergiesAreInversionSymmetric(
100  bool energiesAreInversionSymmetric
101  );
102 
105  bool getEnergiesAreInversionSymmetric() const;
106 
109  void setSusceptibilityIsSafeFromPoles(
110  bool susceptibilityIsSafeFromPoles
111  );
112 
115  bool getSusceptibilityIsSafeFromPoles() const;
116 
118 // void setNumSummationEnergies(unsigned int numSummationEnergies);
119 
121  void saveSusceptibilities(const std::string &filename) const;
122 
124  void loadSusceptibilities(const std::string &filename);
125 private:
127  IndexedDataTree<SerializableVector<std::complex<double>>> rpaSusceptibilityTree;
128 
130  IndexedDataTree<SerializableVector<std::complex<double>>> rpaChargeSusceptibilityTree;
131 
133  IndexedDataTree<SerializableVector<std::complex<double>>> rpaSpinSusceptibilityTree;
134 
136  EnergyType energyType;
137 
139  std::vector<std::complex<double>> energies;
140 public:
142  std::vector<std::complex<double>> calculateRPASusceptibility(
143  const DualIndex &kDual,
144  const std::vector<int> &orbitalIndices
145  );
146 
148  std::vector<std::complex<double>> calculateRPASusceptibility(
149  const std::vector<double> &k,
150  const std::vector<int> &orbitalIndices
151  );
152 
154  std::vector<std::complex<double>> calculateChargeRPASusceptibility(
155  const DualIndex &kDual,
156  const std::vector<int> &orbitalIndices
157  );
158 
160  std::vector<std::complex<double>> calculateChargeRPASusceptibility(
161  const std::vector<double> &k,
162  const std::vector<int> &orbitalIndices
163  );
164 
166  std::vector<std::complex<double>> calculateSpinRPASusceptibility(
167  const DualIndex &kDual,
168  const std::vector<int> &orbitalIndices
169  );
170 
172  std::vector<std::complex<double>> calculateSpinRPASusceptibility(
173  const std::vector<double> &k,
174  const std::vector<int> &orbitalIndices
175  );
176 
178  void setU(std::complex<double> U);
179 
181  void setUp(std::complex<double> Up);
182 
184  void setJ(std::complex<double> J);
185 
187  void setJp(std::complex<double> Jp);
188 private:
190  SusceptibilityCalculator *susceptibilityCalculator;
191 
193  std::vector<InteractionAmplitude> interactionAmplitudes;
194 
196  std::vector<InteractionAmplitude> interactionAmplitudesCharge;
197 
199  std::vector<InteractionAmplitude> interactionAmplitudesSpin;
200 
203  bool interactionAmplitudesAreGenerated;
204 
206  RPASusceptibilityCalculator(
207  SusceptibilityCalculator &susceptibilityCalculator
208  );
209 
211  Index getSusceptibilityResultIndex(
212  const Index &kIndex,
213  const std::vector<int> &orbitalIndices
214  ) const;
215 
217  void invertMatrix(std::complex<double> *matrix, unsigned int dimensions);
218 
220  void multiplyMatrices(
221  std::complex<double> *matrix1,
222  std::complex<double> *matrix2,
223  std::complex<double> *result,
224  unsigned int dimensions
225  );
226 
228  std::vector<std::vector<std::vector<std::complex<double>>>> rpaSusceptibilityMainAlgorithm(
229  const DualIndex &kDual,
230  const std::vector<int> &orbitalIndices,
231  const std::vector<InteractionAmplitude> &interactionAmpltiudes
232  );
233 
235  std::complex<double> U, Up, J, Jp;
236 
240  void generateInteractionAmplitudes();
241 };
242 
243 inline const RPA::MomentumSpaceContext& RPASusceptibilityCalculator::getMomentumSpaceContext(
244 ) const{
245  return susceptibilityCalculator->getMomentumSpaceContext();
246 }
247 
248 inline void RPASusceptibilityCalculator::setInteractionAmplitudes(
249  const std::vector<InteractionAmplitude> &interactionAmplitudes
250 ){
251  this->interactionAmplitudes = interactionAmplitudes;
252 }
253 
254 inline Index RPASusceptibilityCalculator::getSusceptibilityResultIndex(
255  const Index &kIndex,
256  const std::vector<int> &orbitalIndices
257 ) const{
258  return Index(
259  kIndex,
260  {
261  orbitalIndices.at(0),
262  orbitalIndices.at(1),
263  orbitalIndices.at(2),
264  orbitalIndices.at(3)
265  }
266  );
267 }
268 
269 /*inline void RPASusceptibilityCalculator::setSusceptibilityMode(
270  SusceptibilityCalculator::Mode mode
271 ){
272  susceptibilityCalculator->setMode(mode);
273 }
274 
275 inline SusceptibilityCalculator::Mode RPASusceptibilityCalculator::getSusceptibilityMode(
276 ) const{
277  return susceptibilityCalculator->getMode();
278 }*/
279 
280 inline void RPASusceptibilityCalculator::setEnergyType(
281  EnergyType energyType
282 ){
283  this->energyType = energyType;
284  switch(energyType){
285  case EnergyType::Real:
286  susceptibilityCalculator->setEnergyType(
287  SusceptibilityCalculator::EnergyType::Real
288  );
289  break;
290  case EnergyType::Imaginary:
291  susceptibilityCalculator->setEnergyType(
292  SusceptibilityCalculator::EnergyType::Imaginary
293  );
294  break;
295  case EnergyType::Complex:
296  susceptibilityCalculator->setEnergyType(
297  SusceptibilityCalculator::EnergyType::Complex
298  );
299  break;
300  default:
301  TBTKExit(
302  "RPASusceptibilityCalculator::setEnergyType()",
303  "Unknown energy type.",
304  "This should never happen, contact the developer."
305  );
306  }
307 }
308 
309 inline RPASusceptibilityCalculator::EnergyType RPASusceptibilityCalculator::getEnergyType(
310 ) const{
311  return energyType;
312 }
313 
314 inline void RPASusceptibilityCalculator::setEnergies(
315  const std::vector<std::complex<double>> &energies
316 ){
317  susceptibilityCalculator->setEnergies(
318  energies
319  );
320 
321  this->energies = energies;
322 
323  rpaSusceptibilityTree.clear();
324  rpaChargeSusceptibilityTree.clear();
325  rpaSpinSusceptibilityTree.clear();
326 }
327 
328 inline void RPASusceptibilityCalculator::setEnergiesAreInversionSymmetric(
329  bool energiesAreInversionSymmetric
330 ){
331  susceptibilityCalculator->setEnergiesAreInversionSymmetric(
332  energiesAreInversionSymmetric
333  );
334 }
335 
336 inline bool RPASusceptibilityCalculator::getEnergiesAreInversionSymmetric(
337 ) const{
338  return susceptibilityCalculator->getEnergiesAreInversionSymmetric();
339 }
340 
341 inline void RPASusceptibilityCalculator::setSusceptibilityIsSafeFromPoles(
342  bool susceptibilityIsSafeFromPoles
343 ){
344  TBTKAssert(
345  susceptibilityCalculator->getAlgorithm()
346  == SusceptibilityCalculator::Algorithm::Lindhard,
347  "RPASusceptibilityCalculator::setSusceptibilityIsSafeFromPoles()",
348  "Only valid function call if the underlying algorithm is"
349  << " SusceptibilityCalculator::Algorithm::Lindhard.",
350  ""
351  );
352 
353  ((LindhardSusceptibilityCalculator*)susceptibilityCalculator)->setSusceptibilityIsSafeFromPoles(
354  susceptibilityIsSafeFromPoles
355  );
356 }
357 
358 inline bool RPASusceptibilityCalculator::getSusceptibilityIsSafeFromPoles() const{
359  TBTKAssert(
360  susceptibilityCalculator->getAlgorithm()
361  == SusceptibilityCalculator::Algorithm::Lindhard,
362  "RPASusceptibilityCalculator::getSusceptibilityIsSafeFromPoles()",
363  "Only valid function call if the underlying algorithm is"
364  << " SusceptibilityCalculator::Algorithm::Lindhard.",
365  ""
366  );
367 
368  return ((LindhardSusceptibilityCalculator*)susceptibilityCalculator)->getSusceptibilityIsSafeFromPoles();
369 }
370 
371 /*inline void RPASusceptibilityCalculator::setNumSummationEnergies(
372  unsigned int numSummationEnergies
373 ){
374  susceptibilityCalculator->setNumSummationEnergies(
375  numSummationEnergies
376  );
377 }*/
378 
379 inline void RPASusceptibilityCalculator::saveSusceptibilities(
380  const std::string &filename
381 ) const{
382  susceptibilityCalculator->saveSusceptibilities(filename);
383 }
384 
385 inline void RPASusceptibilityCalculator::loadSusceptibilities(
386  const std::string &filename
387 ){
388  susceptibilityCalculator->loadSusceptibilities(filename);
389 }
390 
391 inline std::vector<std::complex<double>> RPASusceptibilityCalculator::calculateRPASusceptibility(
392  const std::vector<double> &k,
393  const std::vector<int> &orbitalIndices
394 ){
395  return calculateRPASusceptibility(
396  DualIndex(
397  susceptibilityCalculator->getMomentumSpaceContext().getKIndex(k),
398  k
399  ),
400  orbitalIndices
401  );
402 }
403 
404 inline std::vector<std::complex<double>> RPASusceptibilityCalculator::calculateChargeRPASusceptibility(
405  const std::vector<double> &k,
406  const std::vector<int> &orbitalIndices
407 ){
408  return calculateChargeRPASusceptibility(
409  DualIndex(
410  susceptibilityCalculator->getMomentumSpaceContext().getKIndex(k),
411  k
412  ),
413  orbitalIndices
414  );
415 }
416 
417 inline std::vector<std::complex<double>> RPASusceptibilityCalculator::calculateSpinRPASusceptibility(
418  const std::vector<double> &k,
419  const std::vector<int> &orbitalIndices
420 ){
421  return calculateSpinRPASusceptibility(
422  DualIndex(
423  susceptibilityCalculator->getMomentumSpaceContext().getKIndex(k),
424  k
425  ),
426  orbitalIndices
427  );
428 }
429 
430 inline void RPASusceptibilityCalculator::setU(std::complex<double> U){
431  this->U = U;
432  rpaSusceptibilityTree.clear();
433  rpaChargeSusceptibilityTree.clear();
434  rpaSpinSusceptibilityTree.clear();
435  interactionAmplitudesAreGenerated = false;
436 }
437 
438 inline void RPASusceptibilityCalculator::setUp(std::complex<double> Up){
439  this->Up = Up;
440  rpaSusceptibilityTree.clear();
441  rpaChargeSusceptibilityTree.clear();
442  rpaSpinSusceptibilityTree.clear();
443  interactionAmplitudesAreGenerated = false;
444 }
445 
446 inline void RPASusceptibilityCalculator::setJ(std::complex<double> J){
447  this->J = J;
448  rpaSusceptibilityTree.clear();
449  rpaChargeSusceptibilityTree.clear();
450  rpaSpinSusceptibilityTree.clear();
451  interactionAmplitudesAreGenerated = false;
452 }
453 
454 inline void RPASusceptibilityCalculator::setJp(std::complex<double> Jp){
455  this->Jp = Jp;
456  rpaSusceptibilityTree.clear();
457  rpaChargeSusceptibilityTree.clear();
458  rpaSpinSusceptibilityTree.clear();
459  interactionAmplitudesAreGenerated = false;
460 }
461 
462 }; //End of namespace TBTK
463 
464 #endif
465 
Definition: Boolean.h:32