You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LiebLin_Twisted_ln_Overlap.cc 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /**********************************************************
  2. This software is part of J.-S. Caux's ABACUS library.
  3. Copyright (c) J.-S. Caux.
  4. -----------------------------------------------------------
  5. File: LiebLin_Twisted_ln_Overlap.cc
  6. Purpose: Calculates Nikita Slavnov's determinant, case RHS is Bethe
  7. and LHS is twisted Bethe
  8. ***********************************************************/
  9. #include "ABACUS.h"
  10. using namespace std;
  11. using namespace ABACUS;
  12. namespace ABACUS {
  13. complex<DP> Kernel_Twisted (complex<DP> expbeta, complex<DP> lambdaoc)
  14. {
  15. return(1.0/(lambdaoc + II) - expbeta/(lambdaoc - II));
  16. }
  17. complex<DP> Kernel_Twisted (complex<DP> expbeta, DP lambdaoc)
  18. {
  19. return(1.0/(lambdaoc + II) - expbeta/(lambdaoc - II));
  20. }
  21. complex<DP> Fn_V (int j, int sign, Vect<complex<DP> >& lstate_lambdaoc, LiebLin_Bethe_State& rstate)
  22. {
  23. complex<DP> result_num = 1.0;
  24. complex<DP> result_den = 1.0;
  25. complex<DP> signcx = complex<DP>(sign);
  26. for (int m = 0; m < rstate.N; ++m) {
  27. result_num *= (lstate_lambdaoc[m] - rstate.lambdaoc[j] + signcx * II);
  28. result_den *= (rstate.lambdaoc[m] - rstate.lambdaoc[j] + signcx * II);
  29. }
  30. return(result_num/result_den);
  31. }
  32. complex<DP> Fn_V_Nikita (int j, int sign, Vect<complex<DP> >& lstate_lambdaoc, LiebLin_Bethe_State& rstate)
  33. {
  34. // To match with Nikita's new conventions
  35. return(1.0/Fn_V (j, -sign, lstate_lambdaoc, rstate));
  36. }
  37. complex<DP> LiebLin_Twisted_ln_Overlap (DP expbeta, Vect<DP> lstate_lambdaoc,
  38. DP lstate_lnnorm, LiebLin_Bethe_State& rstate)
  39. {
  40. Vect<complex<DP> > lstate_lambdaoc_CX(lstate_lambdaoc.size());
  41. for (int i = 0; i < lstate_lambdaoc.size(); ++i) lstate_lambdaoc_CX[i] = complex<DP>(lstate_lambdaoc[i]);
  42. return(LiebLin_Twisted_ln_Overlap (complex<DP>(expbeta), lstate_lambdaoc_CX, lstate_lnnorm, rstate));
  43. }
  44. complex<DP> LiebLin_Twisted_ln_Overlap (complex<DP> expbeta, Vect<complex<DP> > lstate_lambdaoc,
  45. DP lstate_lnnorm, LiebLin_Bethe_State& rstate)
  46. {
  47. // Computes the log of the overlap between the left state and the Bethe rstate
  48. // If momentum difference is zero but states are different, then form factor is zero:
  49. SQMat_CX one_plus_U (0.0, rstate.N);
  50. Vect_CX Vplus_Nikita (0.0, rstate.N); // contains V^+_j
  51. Vect_CX Vminus_Nikita (0.0, rstate.N); // contains V^-_j
  52. Vect_CX Fn_Prod (0.0, rstate.N); // product_{m\neq j} (\mu_m - \lambda_j)/(\lambda_m - \lambda_j)
  53. Vect_CX rKern (0.0, rstate.N); // K(lambda_j - lambda_p)
  54. int p = 0;
  55. complex<DP> Kout = lstate_lambdaoc.sum() - rstate.K;
  56. for (int a = 0; a < rstate.N; ++a) {
  57. Vplus_Nikita[a] = Fn_V_Nikita (a, 1, lstate_lambdaoc, rstate);
  58. Vminus_Nikita[a] = Fn_V_Nikita (a, -1, lstate_lambdaoc, rstate);
  59. Fn_Prod[a] = 1.0;
  60. for (int m = 0; m < rstate.N; ++m)
  61. if (m != a) Fn_Prod[a] *= (lstate_lambdaoc[m] - rstate.lambdaoc[a])/(rstate.lambdaoc[m] - rstate.lambdaoc[a]);
  62. rKern[a] = Kernel_Twisted (expbeta, rstate.lambdaoc[p] - rstate.lambdaoc[a]);
  63. }
  64. for (int a = 0; a < rstate.N; ++a)
  65. for (int b = 0; b < rstate.N; ++b)
  66. one_plus_U[a][b] = (a == b ? 1.0 : 0.0)
  67. + ((lstate_lambdaoc[a] - rstate.lambdaoc[a])/(1.0/Vplus_Nikita[a] - 1.0/Vminus_Nikita[a]))
  68. * Fn_Prod[a] * (Kernel_Twisted(expbeta, rstate.lambdaoc[a] - rstate.lambdaoc[b]) - rKern[b]);
  69. complex<DP> ln_ddalpha_sigma = lndet_LU_CX_dstry(one_plus_U);
  70. complex<DP> ln_prod_V = 0.0;
  71. for (int a = 0; a < rstate.N; ++a) ln_prod_V += log(expbeta * Vplus_Nikita[a]/Vminus_Nikita[a] - 1.0);
  72. ln_prod_V -= 0.5 * rstate.N * log(expbeta);
  73. complex<DP> ln_prod_2 = 0.0;
  74. for (int a = 0; a < rstate.N; ++a)
  75. for (int b = 0; b < rstate.N; ++b)
  76. ln_prod_2 += log((lstate_lambdaoc[a] - rstate.lambdaoc[b] - II)/(rstate.lambdaoc[a] - lstate_lambdaoc[b]));
  77. ln_ddalpha_sigma += ln_prod_V + ln_prod_2 - log(Vplus_Nikita[p] - expbeta * Vminus_Nikita[p]);
  78. return (log(1.0 - exp(-II * Kout)) + ln_ddalpha_sigma - 0.5 * (lstate_lnnorm + rstate.lnnorm));
  79. }
  80. }