Reorganization of headers (I): rename JSC -> ABACUS
All files need to be changed to refer to new headers. First step of the reorganization.
This commit is contained in:
@@ -0,0 +1,698 @@
|
||||
/**********************************************************
|
||||
|
||||
This software is part of J.-S. Caux's ABACUS library.
|
||||
|
||||
Copyright (c) J.-S. Caux.
|
||||
|
||||
-----------------------------------------------------------
|
||||
|
||||
File: XXZ_VOA.cc
|
||||
|
||||
Purpose: Defines all class procedures used for the infinite XXZ chain in zero field.
|
||||
|
||||
***********************************************************/
|
||||
|
||||
|
||||
#include "ABACUS.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace ABACUS {
|
||||
|
||||
DP Fermi_velocity_XXZ_h0 (DP Delta)
|
||||
{
|
||||
// This uses the J > 0 conventions, with H = J \sum S.S
|
||||
|
||||
if (Delta <= -1.0 || Delta >= 1.0) ABACUSerror("Use Delta in AFM gapless regime for Fermi_velocity_XXZ_h0.");
|
||||
|
||||
return(0.5 * PI * sqrt(1.0 - Delta * Delta)/acos(Delta));
|
||||
}
|
||||
|
||||
inline DP Integrand_xi_11 (Vect_DP args)
|
||||
{
|
||||
// args[0] corresponds to t, args[1] to rho, args[2] to xi
|
||||
|
||||
|
||||
// For increased accuracy: separate in regions 0 < t <= 1 and 1 < t, and 0 < xi t <= 1 and 1 < xi t:
|
||||
|
||||
DP answer;
|
||||
|
||||
if (args[0] * args[2] <= 1.0) {
|
||||
|
||||
if (args[0] <= 1.0) {
|
||||
answer = sinh(args[0] * (1.0 + args[2])) * sinh(args[0]) * cos(4.0 * args[0] * args[1])
|
||||
/(args[0] * sinh(args[0] * args[2]) * pow(cosh(args[0]), 2.0));
|
||||
}
|
||||
else { // factorize exp t
|
||||
DP expm2t = exp(-2.0*args[0]);
|
||||
answer = sinh(args[0] * (1.0 + args[2])) * 2.0 * (1.0 - expm2t) * cos(4.0 * args[0] * args[1])
|
||||
/(args[0] * sinh(args[0] * args[2]) * (1.0 + expm2t) * (1.0 + expm2t));
|
||||
}
|
||||
}
|
||||
|
||||
else { // factorize exp (xi t)
|
||||
if (args[0] <= 1.0) {
|
||||
DP expm2t = exp(-2.0 * args[0]);
|
||||
DP expm2txi = exp(-2.0*args[0]*args[2]);
|
||||
answer = (1.0 - expm2t * expm2txi) * sinh(args[0]) * cos(4.0 * args[0] * args[1])
|
||||
/(args[0] * (1.0 - expm2txi) * 0.5 * (1.0 + expm2t) * cosh(args[0]));
|
||||
}
|
||||
else { // factorize exp t
|
||||
DP expm2t = exp(-2.0 * args[0]);
|
||||
DP expm2txi = exp(-2.0*args[0]*args[2]);
|
||||
answer = 2.0 * (1.0 - expm2t * expm2txi) * (1.0 - expm2t) * cos(4.0 * args[0] * args[1])
|
||||
/(args[0] * (1.0 - expm2txi) * (1.0 + expm2t) * (1.0 + expm2t));
|
||||
}
|
||||
}
|
||||
|
||||
return(answer);
|
||||
|
||||
//return(sinh(args[0]*(1.0 + args[2])) * sinh(args[0]) * cos(4.0 * args[0] * args[1])/(args[0] * sinh(args[0] * args[2]) * pow(cosh(args[0]), 2.0)));
|
||||
}
|
||||
|
||||
DP I_xi_11_integral (DP xi, DP rho, DP req_prec, int max_nr_pts, DP t1bar)
|
||||
{
|
||||
DP rho_used = fabs(rho);
|
||||
|
||||
Vect_DP args(3);
|
||||
args[0] = 0.0;
|
||||
args[1] = rho_used;
|
||||
args[2] = xi;
|
||||
|
||||
return((Integrate_optimal (Integrand_xi_11, args, 0, 0.0, t1bar, req_prec, req_prec, max_nr_pts)).integ_est);
|
||||
}
|
||||
|
||||
inline DP Integrand_xi_12 (Vect_DP args)
|
||||
{
|
||||
// args[0] corresponds to t, args[1] to rho, args[2] to xi
|
||||
DP expm2t = exp(-2.0*args[0]);
|
||||
DP expm2txi = exp(-2.0*args[0]*args[2]);
|
||||
|
||||
return(2.0 * cos(4.0 * args[0] * args[1]) * (-expm2t * (3.0 + expm2t) + expm2txi * (1.0 + expm2t * (1.0 + 2.0*expm2t)))
|
||||
/ (args[0] * (1.0 - expm2txi) * (1.0 + expm2t) * (1.0 + expm2t)));
|
||||
}
|
||||
|
||||
DP I_xi_12_integral (DP xi, DP rho, DP req_prec, int max_nr_pts, DP t1bar)
|
||||
{
|
||||
DP tinf = 24.0; // such that exp(-2tinf) << machine_eps
|
||||
DP rho_used = fabs(rho);
|
||||
|
||||
Vect_DP args(3);
|
||||
args[0] = 0.0;
|
||||
args[1] = rho_used;
|
||||
args[2] = xi;
|
||||
|
||||
return((Integrate_optimal (Integrand_xi_12, args, 0, t1bar, tinf, req_prec, req_prec, max_nr_pts)).integ_est);
|
||||
}
|
||||
|
||||
/*
|
||||
inline DP Integrand_xi_2 (Vect_DP args)
|
||||
{
|
||||
// This version is used for rho <= 1
|
||||
|
||||
// args[0] corresponds to t, args[1] to rho, args[2] to xi
|
||||
|
||||
DP answer;
|
||||
|
||||
if (args[0] * args[2] <= 1.0) {
|
||||
|
||||
if (args[0] <= 1.0) {
|
||||
answer = sinh(args[0] * (args[2] + 1.0)) * pow(sin(2.0 * args[0] * args[1]), 2.0)
|
||||
/(args[0] * sinh(args[2] * args[0]) * sinh(args[0]) * pow(cosh(args[0]), 2.0));
|
||||
}
|
||||
|
||||
else if (args[0] >= 1.0) {
|
||||
DP expm2t = exp(-2.0 * args[0]);
|
||||
DP expm2txi = exp(-2.0*args[0]*args[2]);
|
||||
//answer = 8.0 * expm2t * pow(sin(2.0 * args[0] * args[1]), 2.0)/(args[0] * (1.0 - expm2t) * (1.0 + expm2t) * (1.0 + expm2t));
|
||||
answer = 8.0 * (1.0 - expm2t*expm2txi) * expm2t *
|
||||
pow(sin(2.0 * args[0] * args[1]), 2.0)/(args[0] * (1.0 - expm2txi) * (1.0 - expm2t) * (1.0 + expm2t) * (1.0 + expm2t));
|
||||
}
|
||||
|
||||
DP expm2t = exp(-2.0 * args[0]);
|
||||
DP expm2txi = exp(-2.0*args[0]*args[2]);
|
||||
//answer = 8.0 * expm2t * pow(sin(2.0 * args[0] * args[1]), 2.0)/(args[0] * (1.0 - expm2t) * (1.0 + expm2t) * (1.0 + expm2t));
|
||||
answer = 8.0 * (1.0 - expm2t*expm2txi) * expm2t *
|
||||
pow(sin(2.0 * args[0] * args[1]), 2.0)/(args[0] * (1.0 - expm2txi) * (1.0 - expm2t) * (1.0 + expm2t) * (1.0 + expm2t));
|
||||
|
||||
return(answer);
|
||||
|
||||
... NOT USED
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
inline DP Integrand_xi_22 (Vect_DP args)
|
||||
{
|
||||
// This version is used when rho > 1.
|
||||
|
||||
// args[0] corresponds to t, args[1] to rho, args[2] to xi
|
||||
DP answer = 0.0;
|
||||
if (args[0] < 1.0)
|
||||
answer = pow(sin(2.0 * args[0] * args[1]), 2.0)/(args[0] * tanh(args[0] * args[2]) * pow(cosh(args[0]), 2.0));
|
||||
else if (args[0] >= 1.0) {
|
||||
DP expm2t = exp(-2.0 * args[0]);
|
||||
DP expm2txi = exp(-2.0*args[0]*args[2]);
|
||||
answer = 4.0 * expm2t * (1.0 + expm2txi) * pow(sin(2.0 * args[0] * args[1]), 2.0)/(args[0] * (1.0 - expm2txi) * (1.0 + expm2t) * (1.0 + expm2t));
|
||||
}
|
||||
return(answer);
|
||||
}
|
||||
|
||||
DP I_xi_2_integral (DP xi, DP rho, DP req_prec, int max_nr_pts)
|
||||
{
|
||||
DP tinf = 24.0; // such that exp(-2tinf) << machine_eps
|
||||
DP rho_used = fabs(rho);
|
||||
|
||||
Vect_DP args(3);
|
||||
args[0] = 0.0;
|
||||
args[1] = rho_used;
|
||||
args[2] = xi;
|
||||
|
||||
DP answer = 0.0;
|
||||
|
||||
//if (rho_used <= 1.0) answer = (Integrate_optimal (Integrand_xi_2, args, 0, 0.0, tinf, req_prec, req_prec, max_nr_pts)).integ_est;
|
||||
|
||||
//else
|
||||
answer = PI * rho + log(0.5 * (1.0 + exp(-2.0 * PI * rho_used))) // This is I^{(21)}
|
||||
+ (Integrate_optimal (Integrand_xi_22, args, 0, 0.0, tinf, req_prec, req_prec, max_nr_pts)).integ_est;
|
||||
|
||||
return(answer);
|
||||
}
|
||||
|
||||
|
||||
DP I_xi_integral (DP xi, DP rho, DP req_prec, int max_nr_pts)
|
||||
{
|
||||
|
||||
DP t1bar = 1.0; // delimiter between the I_xi_11 and I__xi_12 integrals
|
||||
|
||||
DP answer = I_xi_11_integral (xi, rho, req_prec, max_nr_pts, t1bar)
|
||||
+ I_xi_12_integral (xi, rho, req_prec, max_nr_pts, t1bar)
|
||||
- 2.0 * Cosine_Integral (4.0 * rho * t1bar)
|
||||
- I_xi_2_integral (xi, rho, req_prec, max_nr_pts);
|
||||
|
||||
return(answer);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************* TWO SPINONS ********************/
|
||||
|
||||
DP Szz_XXZ_h0_2spinons (DP Delta, DP k, DP omega, Integral_table Itable)
|
||||
{
|
||||
// Careful ! This is S(k, omega) = S (k, w) |dw/domega| = 2 S(k, w)
|
||||
|
||||
DP w = 2.0 * omega; // Rescale energies by factor 2 because of definitions of H_XXX (omega: S.S; w: 0.5 * sigma.sigma = 2 S.S)
|
||||
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
//DP wu = twoPI * sin(0.5 * k);
|
||||
DP wu = 4.0 * vF * sin(0.5 * k);
|
||||
//DP wl = PI * fabs(sin(k));
|
||||
DP wl = 2.0 * vF * fabs(sin(k));
|
||||
|
||||
DP rho = acosh(sqrt((wu * wu - wl * wl)/(w * w - wl * wl)))/PI;
|
||||
DP xi = PI/acos(Delta) - 1.0;
|
||||
// Factor of 2: return S(k, omega), not S(k, w)
|
||||
// 0.25 factor: 1/4 * 2 * 1/2, where 1/4 comes from Bougourzi, 2 is the Jacobian |dw/domega| and 1/2 is S^{zz} = 1/2 * S^{+-}
|
||||
//return(w < wu && w > wl ? 2.0 * 0.5 * exp(-Itable.Return_val (acosh(sqrt((wu * wu - wl * wl)/(w * w - wl * wl)))/PI))/sqrt(wu * wu - w * w) : 0.0);
|
||||
DP expmtwoPIrhooverxi = exp(-twoPI * rho/xi);
|
||||
//return(w < wu && w > wl ? 2.0 * exp(-Itable.Return_val (rho))/(sqrt(wu * wu - w * w) * (cosh(twoPI * rho/xi) + cos(PI/xi))) : 0.0);
|
||||
return(w < wu && w > wl ? 2.0 * pow(1.0 + 1.0/xi, 2.0) * exp(-Itable.Return_val (rho))
|
||||
* expmtwoPIrhooverxi/(sqrt(wu * wu - w * w)
|
||||
* (0.5 * (1.0 + expmtwoPIrhooverxi * expmtwoPIrhooverxi) + expmtwoPIrhooverxi * cos(PI/xi)))
|
||||
: 0.0);
|
||||
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons (Vect_DP args, Integral_table Itable)
|
||||
{
|
||||
// To be called by integrating functions
|
||||
|
||||
// Careful ! This is S(k, omega) !
|
||||
|
||||
// This uses args[0] = k, args[1] = omega, args[2] = xi
|
||||
|
||||
DP Delta = cos(PI/(args[2] + 1.0));
|
||||
|
||||
return(Szz_XXZ_h0_2spinons (Delta, args[0], args[1], Itable));
|
||||
|
||||
/*
|
||||
|
||||
// This uses args[0] = k, args[1] = w, args[2] = xi
|
||||
|
||||
DP Delta = cos(PI/(args[2] + 1.0));
|
||||
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
//DP wu = twoPI * sin(0.5 * k);
|
||||
DP wu = 4.0 * vF * sin(0.5 * args[0]);
|
||||
//DP wl = PI * fabs(sin(k));
|
||||
DP wl = 2.0 * vF * fabs(sin(args[0]));
|
||||
|
||||
DP rho = acosh(sqrt((wu * wu - wl * wl)/(args[1] * args[1] - wl * wl)))/PI;
|
||||
DP expmtwoPIrhooverxi = exp(-twoPI * rho/args[2]);
|
||||
|
||||
// 0.5 factor: 1 from Bougourzi, and 1/2 is S^{zz} = 1/2 * S^{+-}
|
||||
return(args[1] < wu && args[1] > wl ?
|
||||
//0.5 * exp(-Itable.Return_val (acosh(sqrt((wu * wu - wl * wl)/(args[1] * args[1] - wl * wl)))/PI))/sqrt(wu * wu - args[1] * args[1]) : 0.0);
|
||||
pow(1.0 + 1.0/args[2], 2.0) * exp(-Itable.Return_val (rho)) * expmtwoPIrhooverxi
|
||||
/(sqrt(wu * wu - args[1] * args[1])
|
||||
* (0.5 * (1.0 + expmtwoPIrhooverxi * expmtwoPIrhooverxi) + expmtwoPIrhooverxi * cos(PI/args[2]))) : 0.0);
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_alt (Vect_DP args, Integral_table Itable)
|
||||
{
|
||||
// This returns S(k, omega) \times Jacobian (d omega)/(d alpha) where omega = omega_{lower threshold} cosh \alpha
|
||||
|
||||
// so returns S(k, omega) \sqrt{omega^2 - omega_l^2}
|
||||
|
||||
// This uses args[0] = k, args[1] = alpha, args[2] = xi
|
||||
|
||||
DP Delta = cos(PI/(args[2] + 1.0));
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
DP omegaup = 2.0 * vF * sin(0.5 * args[0]);
|
||||
DP omegalow = vF * fabs(sin(args[0]));
|
||||
|
||||
DP omega = omegalow * cosh(args[1]);
|
||||
|
||||
if (omega >= omegaup || omega <= omegalow) return(0.0);
|
||||
|
||||
DP Jacobian = sqrt(omega * omega - omegalow * omegalow);
|
||||
|
||||
return(Jacobian * Szz_XXZ_h0_2spinons (Delta, args[0], omega, Itable));
|
||||
|
||||
/*
|
||||
//DP wu = twoPI * sin(0.5 * k);
|
||||
DP wu = 4.0 * vF * sin(0.5 * args[0]);
|
||||
//DP wl = PI * fabs(sin(k));
|
||||
DP wl = 2.0 * vF * fabs(sin(args[0]));
|
||||
|
||||
//DP w = wu * cos(args[1]);
|
||||
//DP factor = 1.0;
|
||||
DP w = wl * cosh(args[1]);
|
||||
|
||||
if (w >= wu || w <= wl) return(0.0);
|
||||
|
||||
DP factor = sqrt((w * w - wl * wl)/(wu * wu - w * w));
|
||||
|
||||
DP rho = acosh(sqrt((wu * wu - wl * wl)/(w * w - wl * wl)))/PI;
|
||||
DP expmtwoPIrhooverxi = exp(-twoPI * rho/args[2]);
|
||||
|
||||
// 0.5 factor: 1 from Bougourzi, and 1/2 is S^{zz} = 1/2 * S^{+-}
|
||||
//return(factor * 0.5 * exp(-Itable.Return_val (acosh(sqrt((wu * wu - wl * wl)/(w * w - wl * wl)))/PI)));
|
||||
return(pow(1.0 + 1.0/args[2], 2.0) * factor
|
||||
* exp(-Itable.Return_val (rho)) * expmtwoPIrhooverxi/(0.5 * (1.0 + expmtwoPIrhooverxi * expmtwoPIrhooverxi) + expmtwoPIrhooverxi * cos(PI/args[2])));
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_omega (Vect_DP args, Integral_table Itable)
|
||||
{
|
||||
// This uses args[0] = k, args[1] = omega, args[2] = xi
|
||||
|
||||
return(args[1] * Szz_XXZ_h0_2spinons (args, Itable));
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_omega_alt (Vect_DP args, Integral_table Itable)
|
||||
{
|
||||
// This uses args[0] = k, args[1] = alpha, args[2] = xi
|
||||
|
||||
DP Delta = cos(PI/(args[2] + 1.0));
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
DP omegalow = vF * fabs(sin(args[0]));
|
||||
|
||||
DP omega = omegalow * cosh(args[1]);
|
||||
|
||||
args[1] = omega;
|
||||
|
||||
return(Szz_XXZ_h0_2spinons_omega (args, Itable));
|
||||
}
|
||||
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_intomega (Vect_DP args, Integral_table Itable)
|
||||
{
|
||||
// This returns \int_0^2PI domega/2PI S(k, omega)
|
||||
|
||||
DP k = args[0];
|
||||
DP req_prec = args[1];
|
||||
DP xi = args[2];
|
||||
int max_nr_pts = int(args[3]);
|
||||
|
||||
DP Delta = cos(PI/(args[2] + 1.0));
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
DP omegaup = 2.0 * vF * sin(0.5 * args[0]);
|
||||
DP omegalow = vF * fabs(sin(args[0]));
|
||||
|
||||
Vect_DP args_to_SF_2p(4);
|
||||
args_to_SF_2p[0] = k;
|
||||
args_to_SF_2p[1] = 0.0; // this will be omega
|
||||
args_to_SF_2p[2] = xi;
|
||||
args_to_SF_2p[3] = ABACUS::max(1.0e-14, 0.01 * req_prec);
|
||||
|
||||
return((Integrate_optimal_using_table (Szz_XXZ_h0_2spinons, args_to_SF_2p, 1, Itable,
|
||||
omegalow, omegaup, req_prec, req_prec, max_nr_pts)).integ_est/twoPI);
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_intomega_alt (Vect_DP args, Integral_table Itable)
|
||||
{
|
||||
// This returns \int_0^2PI domega/2PI S(k, omega)
|
||||
|
||||
DP k = args[0];
|
||||
DP req_prec = args[1];
|
||||
DP xi = args[2];
|
||||
int max_nr_pts = int(args[3]);
|
||||
|
||||
DP Delta = cos(PI/(args[2] + 1.0));
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
DP omegaup = 2.0 * vF * sin(0.5 * args[0]);
|
||||
DP omegalow = vF * fabs(sin(args[0]));
|
||||
|
||||
Vect_DP args_to_SF_2p(4);
|
||||
args_to_SF_2p[0] = k;
|
||||
args_to_SF_2p[1] = 0.0; // this will be omega
|
||||
args_to_SF_2p[2] = xi;
|
||||
args_to_SF_2p[3] = ABACUS::max(1.0e-14, 0.01 * req_prec);
|
||||
|
||||
//return(Integrate_rec_using_table (SF_2p_alt, args_to_SF_2p, 1, Itable, 0.0, acos(wl/wu), req_prec, max_rec)/twoPI);
|
||||
return((Integrate_optimal_using_table (Szz_XXZ_h0_2spinons_alt, args_to_SF_2p, 1, Itable,
|
||||
0.0, acosh(omegaup/omegalow), req_prec, req_prec, max_nr_pts)).integ_est/twoPI);
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_check_sumrule (DP Delta, DP req_prec, int max_nr_pts, Integral_table Itable)
|
||||
{
|
||||
// Near XX: it's better to use this function.
|
||||
// Near XXX: it's better to use the ..._alt function below.
|
||||
|
||||
Vect_DP args_to_Szz_intomega (4);
|
||||
|
||||
args_to_Szz_intomega[0] = 0.0; // this will be k
|
||||
args_to_Szz_intomega[1] = ABACUS::max(1.0e-14, 0.01 * req_prec);
|
||||
args_to_Szz_intomega[2] = PI/acos(Delta) - 1.0;
|
||||
args_to_Szz_intomega[3] = DP(max_nr_pts);
|
||||
|
||||
// Factor 4: we expect \int_0^\infty \frac{d\omega}{2\pi} \int_0^{2\pi} \frac{dk}{2\pi} S^zz (k, omega) = 1/4
|
||||
// Factor 2: int[0, 2PI] = 2 int[0, PI]
|
||||
return(4.0 * 2.0 * (Integrate_optimal_using_table (Szz_XXZ_h0_2spinons_intomega, args_to_Szz_intomega, 0, Itable,
|
||||
0.0, PI, req_prec, req_prec, max_nr_pts)).integ_est/twoPI);
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_check_sumrule_alt (DP Delta, DP req_prec, int max_nr_pts, Integral_table Itable)
|
||||
{
|
||||
// This is the preferred version if near XXX.
|
||||
|
||||
Vect_DP args_to_Szz_intomega (4);
|
||||
|
||||
args_to_Szz_intomega[0] = 0.0; // this will be k
|
||||
args_to_Szz_intomega[1] = ABACUS::max(1.0e-14, 0.01 * req_prec);
|
||||
args_to_Szz_intomega[2] = PI/acos(Delta) - 1.0;
|
||||
args_to_Szz_intomega[3] = DP(max_nr_pts);
|
||||
|
||||
// Factor 2: int[0, 2PI] = 2 int[0, PI]
|
||||
return(4.0 * 2.0 * (Integrate_optimal_using_table (Szz_XXZ_h0_2spinons_intomega_alt, args_to_Szz_intomega, 0, Itable,
|
||||
0.0, PI, req_prec, req_prec, max_nr_pts)).integ_est/twoPI);
|
||||
}
|
||||
|
||||
DP Fixed_k_sumrule_omega_Szz_XXZ_h0_N (DP Delta, DP k)
|
||||
{
|
||||
// This is K_1 (k) = \int domega/2PI omega S(k, omega)
|
||||
//return(4.0 * (log(2.0) - 0.25) * (1.0 - cos(k))/3.0); // XXX_h0
|
||||
|
||||
// Calculate the <S^x S^x> average:
|
||||
int N = 600;
|
||||
int M = 300;
|
||||
DP Xavg = X_avg ('x', Delta, N, M);
|
||||
|
||||
return (-2.0 * (1.0 - cos(k)) * Xavg/N);
|
||||
}
|
||||
|
||||
DP Integrand_GSE_XXZ_h0 (Vect_DP args)
|
||||
{
|
||||
// args[0] corresponds to t, args[1] to xi
|
||||
DP expm2t = exp(-2.0 * args[0]);
|
||||
DP expm2txi = exp(-2.0 * args[0] * args[1]);
|
||||
|
||||
return(2.0 * expm2t * (1.0 - expm2txi)/((1.0 - expm2t * expm2txi) * (1.0 + expm2t)));
|
||||
}
|
||||
|
||||
DP GSE_XXZ_h0 (DP Delta, DP req_prec, int max_nr_pts)
|
||||
{
|
||||
DP xi = PI/acos(Delta) - 1.0;
|
||||
|
||||
DP tinf = 24.0; // such that exp(-2tinf) << machine_eps
|
||||
|
||||
Vect_DP args(2);
|
||||
args[0] = 0.0;
|
||||
args[1] = xi;
|
||||
|
||||
return(-0.25 * sqrt(1.0 - Delta * Delta) * (2.0/acos(Delta)) * 2.0 * (Integrate_optimal (Integrand_GSE_XXZ_h0, args, 0, 0.0, tinf, req_prec, req_prec, max_nr_pts).integ_est));
|
||||
}
|
||||
|
||||
DP Integrand_2_fSR_XXZ_h0 (Vect_DP args)
|
||||
{
|
||||
// args[0] corresponds to t, args[1] to xi
|
||||
DP expm2t = exp(-2.0 * args[0]);
|
||||
DP expm2txi = exp(-2.0 * args[0] * args[1]);
|
||||
|
||||
return(4.0 * args[0] * expm2t * (1.0 + expm2t * expm2txi)
|
||||
/((1.0 - expm2t * expm2txi) * (1.0 + expm2t) * (1.0 + expm2t)));
|
||||
}
|
||||
|
||||
DP Fixed_k_sumrule_omega_Szz_XXZ_h0 (DP Delta, DP k, DP req_prec, int max_nr_pts)
|
||||
{
|
||||
//
|
||||
DP xi = PI/acos(Delta) - 1.0;
|
||||
|
||||
DP tinf = 24.0; // such that exp(-2tinf) << machine_eps
|
||||
|
||||
Vect_DP args(2);
|
||||
args[0] = 0.0;
|
||||
args[1] = xi;
|
||||
|
||||
DP Xavg = -(0.25/(acos(Delta) * sqrt(1.0 - Delta * Delta))) * 2.0 * (Integrate_optimal (Integrand_GSE_XXZ_h0, args, 0, 0.0, tinf, req_prec, req_prec, max_nr_pts).integ_est)
|
||||
+ 0.25 * (Delta/pow(acos(Delta), 2.0)) * 2.0 * (Integrate_optimal (Integrand_2_fSR_XXZ_h0, args, 0, 0.0, tinf, req_prec, req_prec, max_nr_pts).integ_est);
|
||||
|
||||
return (-2.0 * (1.0 - cos(k)) * Xavg);
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_check_fixed_k_Szz_sumrule (DP Delta, DP k, DP req_prec, int max_nr_pts, Integral_table Itable)
|
||||
{
|
||||
// Near XXX, it's better to use the ..._alt function below.
|
||||
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
DP omegaup = 2.0 * vF * sin(0.5 * k);
|
||||
DP omegalow = vF * fabs(sin(k));
|
||||
|
||||
Vect_DP args_to_SF_2p(4);
|
||||
args_to_SF_2p[0] = k;
|
||||
args_to_SF_2p[1] = 0.0; // this will be omega
|
||||
args_to_SF_2p[2] = PI/acos(Delta) - 1.0;
|
||||
args_to_SF_2p[3] = ABACUS::max(1.0e-14, 0.01 * req_prec);
|
||||
|
||||
return(((Integrate_optimal_using_table (Szz_XXZ_h0_2spinons_omega, args_to_SF_2p, 1, Itable, omegalow, omegaup, req_prec, req_prec, max_nr_pts)).integ_est/twoPI)/Fixed_k_sumrule_omega_Szz_XXZ_h0(Delta, k, req_prec, max_nr_pts));
|
||||
}
|
||||
|
||||
DP Szz_XXZ_h0_2spinons_check_fixed_k_Szz_sumrule_alt (DP Delta, DP k, DP req_prec, int max_nr_pts, Integral_table Itable)
|
||||
{
|
||||
// This is the preferred version if near XXX.
|
||||
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
DP omegaup = 2.0 * vF * sin(0.5 * k);
|
||||
DP omegalow = vF * fabs(sin(k));
|
||||
|
||||
Vect_DP args_to_SF_2p(4);
|
||||
args_to_SF_2p[0] = k;
|
||||
args_to_SF_2p[1] = 0.0; // this will be alpha
|
||||
args_to_SF_2p[2] = PI/acos(Delta) - 1.0;
|
||||
args_to_SF_2p[3] = ABACUS::max(1.0e-14, 0.01 * req_prec);
|
||||
|
||||
return(((Integrate_optimal_using_table (Szz_XXZ_h0_2spinons_omega_alt, args_to_SF_2p, 1, Itable, 0.0, acosh(omegaup/omegalow), req_prec, req_prec, max_nr_pts)).integ_est/twoPI)/Fixed_k_sumrule_omega_Szz_XXZ_h0(Delta, k, req_prec, max_nr_pts));
|
||||
}
|
||||
|
||||
|
||||
//******************************** Functions to produce files similar to ABACUS **********************************
|
||||
|
||||
void Produce_Szz_XXZ_h0_2spinons_file (DP Delta, int N, int Nomega, DP omegamax, Integral_table Itable)
|
||||
{
|
||||
// IMPORTANT NOTE: this produces a file with Szz !!
|
||||
|
||||
if (N % 2) ABACUSerror("Please use N even in Produce_Szz_XXZ_h0_2spinons_file.");
|
||||
|
||||
stringstream SF_stringstream;
|
||||
string SF_string;
|
||||
SF_stringstream << "Szz_XXZ_h0_2spinons_Delta_" << Delta << "_N_" << N << "_Nom_" << Nomega << "_ommax_" << omegamax << ".dat";
|
||||
SF_string = SF_stringstream.str();
|
||||
const char* SF_Cstr = SF_string.c_str();
|
||||
|
||||
Write_K_File (N, 0, N);
|
||||
Write_Omega_File (Nomega, 0.0, omegamax);
|
||||
|
||||
int dim_K = N/2 + 1;
|
||||
DP* K = new DP[dim_K];
|
||||
for (int iK = 0; iK < dim_K; ++iK) K[iK] = (twoPI * iK)/N;
|
||||
|
||||
DP* omega = new DP[Nomega];
|
||||
for (int iw = 0; iw < Nomega; ++iw) omega[iw] = omegamax * (iw + 0.5)/Nomega;
|
||||
|
||||
DP* SF_XXZ_2p_dat = new DP[dim_K * Nomega];
|
||||
|
||||
DP srtot = 0.0;
|
||||
Vect_DP sr1(0.0, dim_K);
|
||||
|
||||
for (int iK = 0; iK < dim_K; ++iK)
|
||||
for (int iw = 0; iw < Nomega; ++iw) {
|
||||
SF_XXZ_2p_dat[dim_K * iw + iK] = Szz_XXZ_h0_2spinons (Delta, K[iK], omega[iw], Itable);
|
||||
srtot += (iK == N/2 ? 1.0 : 2.0) * SF_XXZ_2p_dat[dim_K * iw + iK];
|
||||
sr1[iK] += omega[iw] * SF_XXZ_2p_dat[dim_K * iw + iK];
|
||||
}
|
||||
|
||||
ofstream SF_outfile;
|
||||
SF_outfile.open(SF_Cstr);
|
||||
SF_outfile.precision(14);
|
||||
|
||||
for (int iw = 0; iw < Nomega; ++iw) {
|
||||
for (int iK = 0; iK < dim_K; ++iK)
|
||||
SF_outfile << SF_XXZ_2p_dat[dim_K * iw + iK] << "\t";
|
||||
for (int iKt = dim_K - 2; iKt >= 0; --iKt) // put K in [PI, 2PI] back in
|
||||
SF_outfile << SF_XXZ_2p_dat[dim_K * iw + iKt] << "\t";
|
||||
SF_outfile << endl;
|
||||
}
|
||||
|
||||
SF_outfile.close();
|
||||
|
||||
// Do sum rule files:
|
||||
|
||||
stringstream SRC_stringstream;
|
||||
string SRC_string;
|
||||
SRC_stringstream << "Szz_XXZ_h0_2spinons_Delta_" << Delta << "_N_" << N << "_Nom_" << Nomega << "_ommax_" << omegamax << ".src";
|
||||
SRC_string = SRC_stringstream.str();
|
||||
const char* SRC_Cstr = SRC_string.c_str();
|
||||
|
||||
ofstream SRC_outfile;
|
||||
SRC_outfile.open(SRC_Cstr);
|
||||
SRC_outfile.precision(14);
|
||||
|
||||
SRC_outfile << srtot * omegamax/(twoPI * Nomega * N) << "\t" << srtot * 4.0 * omegamax/(twoPI * Nomega * N) << endl;
|
||||
|
||||
SRC_outfile.close();
|
||||
|
||||
stringstream SR1_stringstream;
|
||||
string SR1_string;
|
||||
SR1_stringstream << "Szz_XXZ_h0_2spinons_Delta_" << Delta << "_N_" << N << "_Nom_" << Nomega << "_ommax_" << omegamax << ".sr1";
|
||||
SR1_string = SR1_stringstream.str();
|
||||
const char* SR1_Cstr = SR1_string.c_str();
|
||||
|
||||
ofstream SR1_outfile;
|
||||
SR1_outfile.open(SR1_Cstr);
|
||||
SR1_outfile.precision(14);
|
||||
|
||||
// Figure out the f-sumrule factor:
|
||||
int Nfsr = 600;
|
||||
int Mfsr = 300;
|
||||
DP Xavg = 0.0;
|
||||
if (Delta > 0.0) Xavg = X_avg ('x', Delta, Nfsr, Mfsr);
|
||||
else Xavg = 0.0;
|
||||
|
||||
DP sr1factor = 1.0;
|
||||
if (Delta > 0.0) sr1factor = -2.0 * Xavg/Nfsr;
|
||||
else sr1factor = 1.0;
|
||||
|
||||
for (int iK = 1; iK < dim_K; ++iK)
|
||||
SR1_outfile << iK << "\t" << K[iK] << "\t" << sr1[iK] * omegamax/(twoPI * Nomega)
|
||||
//<< "\t" << -((1.0 - cos(K[iK])) * 2.0 * (0.25 - log(2.0))/3.0) << "\t"
|
||||
<< "\t" << (1.0 - cos(K[iK])) * sr1factor << "\t"
|
||||
//<< -sr1[iK] * omegamax/(twoPI * Nomega)/((1.0 - cos(K[iK])) * 2.0 * (0.25 - log(2.0))/3.0) << endl;
|
||||
<< sr1[iK] * omegamax/(twoPI * Nomega)/((1.0 - cos(K[iK])) * sr1factor) << endl;
|
||||
|
||||
SR1_outfile.close();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void Produce_Szz_XXZ_h0_2spinons_fixed_K_file (DP Delta, DP Kover2PI, int Nomega, Integral_table Itable)
|
||||
{
|
||||
// IMPORTANT NOTE: this produces a file with Szz !!
|
||||
|
||||
stringstream SF_stringstream;
|
||||
string SF_string;
|
||||
SF_stringstream << "Szz_XXZ_h0_2spinons_Delta_" << Delta << "_Kover2PI_" << Kover2PI
|
||||
<< "_Nom_" << Nomega << ".dat";
|
||||
SF_string = SF_stringstream.str();
|
||||
const char* SF_Cstr = SF_string.c_str();
|
||||
|
||||
DP K = twoPI * Kover2PI;
|
||||
|
||||
DP* omega = new DP[Nomega];
|
||||
|
||||
DP vF = Fermi_velocity_XXZ_h0 (Delta); // in units of omega
|
||||
|
||||
DP omegaup = 2.0 * vF * sin(0.5 * K);
|
||||
DP omegalow = vF * fabs(sin(K));
|
||||
|
||||
for (int iw = 0; iw < Nomega; ++iw) omega[iw] = 0.99 * omegalow + (1.01 * omegaup - 0.99 * omegalow) * (iw + 0.5)/Nomega; // factor of 1.01: just to have zeroes on either side of continuum.
|
||||
|
||||
DP* SF_XXZ_2p_dat = new DP[Nomega];
|
||||
|
||||
DP sr1 = 0.0;
|
||||
|
||||
for (int iw = 0; iw < Nomega; ++iw) {
|
||||
SF_XXZ_2p_dat[iw] = Szz_XXZ_h0_2spinons (Delta, K, omega[iw], Itable);
|
||||
sr1 += omega[iw] * SF_XXZ_2p_dat[iw];
|
||||
}
|
||||
|
||||
ofstream SF_outfile;
|
||||
SF_outfile.open(SF_Cstr);
|
||||
SF_outfile.precision(14);
|
||||
|
||||
SF_outfile << omega[0] << "\t" << SF_XXZ_2p_dat[0];
|
||||
for (int iw = 0; iw < Nomega; ++iw) {
|
||||
SF_outfile << endl << omega[iw] << "\t" << SF_XXZ_2p_dat[iw];
|
||||
}
|
||||
|
||||
SF_outfile.close();
|
||||
|
||||
// Do sum rule files:
|
||||
/*
|
||||
NOT ACCURATE SINCE WE'RE PLOTTING SOMEWHAT OUTSIDE OF CONTINUUM AS WELL (to get nice figures)
|
||||
stringstream SR1_stringstream;
|
||||
string SR1_string;
|
||||
SR1_stringstream << "Szz_XXZ_h0_2spinons_Delta_" << Delta << "_Kover2PI_" << Kover2PI
|
||||
<< "_Nom_" << Nomega << ".sr1";
|
||||
SR1_string = SR1_stringstream.str();
|
||||
const char* SR1_Cstr = SR1_string.c_str();
|
||||
|
||||
ofstream SR1_outfile;
|
||||
SR1_outfile.open(SR1_Cstr);
|
||||
SR1_outfile.precision(14);
|
||||
|
||||
// Figure out the f-sumrule factor:
|
||||
int Nfsr = 600;
|
||||
int Mfsr = 300;
|
||||
DP Xavg = 0.0;
|
||||
if (Delta > 0.0) Xavg = X_avg ('x', Delta, Nfsr, Mfsr);
|
||||
else Xavg = 0.0;
|
||||
|
||||
DP sr1factor = 1.0;
|
||||
if (Delta > 0.0) sr1factor = -2.0 * Xavg/Nfsr;
|
||||
else sr1factor = 1.0;
|
||||
|
||||
SR1_outfile << Kover2PI << "\t" << sr1 * (omegaup - omegalow)/(twoPI * Nomega)
|
||||
<< "\t" << (1.0 - cos(K)) * sr1factor << "\t"
|
||||
<< sr1 * (omegaup - omegalow)/(twoPI * Nomega)/((1.0 - cos(K)) * sr1factor) << endl;
|
||||
|
||||
SR1_outfile.close();
|
||||
*/
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // namespace ABACUS
|
||||
Reference in New Issue
Block a user