ABACUS/src/LIEBLIN/LiebLin_Twisted_lnnorm.cc

54 lines
1.4 KiB
C++

/**********************************************************
This software is part of J.-S. Caux's ABACUS library.
Copyright (c) J.-S. Caux.
-----------------------------------------------------------
File: LiebLin_Gaudin_lnnorm.cc
Purpose: calculates the Gaudin norm of a vector of arbitrary
complex rapidities
***********************************************************/
#include "ABACUS.h"
using namespace std;
using namespace ABACUS;
namespace ABACUS {
DP LiebLin_Twisted_lnnorm (Vect<complex<DP> >& lambdaoc, double cxL)
{
// Calculates the lnnorm of an eigenstate of the twisted transfer matrix
// so Gaudin can be used.
int N = lambdaoc.size();
SQMat<complex<DP> > Gaudin(N);
complex<DP> sum_Kernel = 0.0;
for (int j = 0; j < N; ++j)
for (int k = 0; k < N; ++k) {
if (j == k) {
sum_Kernel = 0.0;
for (int kp = 0; kp < N; ++kp)
if (j != kp) sum_Kernel += 2.0/((lambdaoc[j] - lambdaoc[kp]) * (lambdaoc[j] - lambdaoc[kp]) + 1.0);
Gaudin[j][k] = cxL + sum_Kernel;
}
else Gaudin[j][k] = - 2.0/((lambdaoc[j] - lambdaoc[k]) * (lambdaoc[j] - lambdaoc[k]) + 1.0);
}
DP lnnorm = real(lndet_LU_CX_dstry(Gaudin));
// Add the pieces outside of Gaudin determinant
for (int j = 0; j < N - 1; ++j) for (int k = j+1; k < N; ++k) lnnorm += log(1.0 + 1.0/norm(lambdaoc[j] - lambdaoc[k]));
return(lnnorm);
}
} // namespace ABACUS