ABACUS/include/ABACUS_XXX_VOA.h

142 righe
5.4 KiB
C++

/**********************************************************
This software is part of J.-S. Caux's ABACUS library.
Copyright (c) J.-S. Caux.
-----------------------------------------------------------
File: ABACUS_XXX_VOA.h
Purpose: Declares classes for XXX in zero field: Vertex Operator Approach
***********************************************************/
#ifndef ABACUS_XXX_VOA_H
#define ABACUS_XXX_VOA_H
#include "ABACUS.h"
const DP default_req_prec = 1.0e-14;
const int default_max_rec = 10;
namespace ABACUS {
inline DP Integrand_11 (Vect_DP args)
{
// args[0] corresponds to t, args[1] to rho
return((exp(args[0]) * sinh(args[0]) * cos(4.0 * args[0] * args[1])
/(2.0 * pow(cosh(args[0]), 2.0)) + 2.0 * pow(sin(2.0 * args[0] * args[1]), 2.0))/args[0]);
}
inline DP Integrand_12 (Vect_DP args)
{
DP expm2t = exp(-2.0*args[0]);
return(cos(4.0 * args[0] * args[1]) * expm2t * (3.0 + expm2t)/ (args[0] * (1.0 + expm2t) * (1.0 + expm2t)));
}
inline DP Integrand_2 (Vect_DP args)
{
DP answer = 0.0;
if (args[0] < 1.0) answer = exp(args[0]) * pow(sin(2.0 * args[0] * args[1]), 2.0)
/(args[0] * sinh(args[0]) * pow(cosh(args[0]), 2.0));
else if (args[0] >= 1.0) {
DP expm2t = exp(-2.0 * args[0]);
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));
}
return(answer);
}
inline DP Integrand_A (Vect_DP args)
{
// This kernel is for -ln | A_-(i\pi/2) | function
return(exp(args[0]) * pow(sinh(args[0]/2.0), 2.0)/(args[0] * sinh(2.0*args[0]) * cosh(args[0])));
}
DP I_integral (DP rho, DP req_prec);
/********************* TWO SPINONS ********************/
DP SF_2p (DP k, DP omega, I_table Itable);
DP SF_2p (Vect_DP args, I_table Itable);
DP SF_2p_alt (Vect_DP args, I_table Itable);
DP SF_2p_w (Vect_DP args, I_table Itable);
DP SF_2p_w_alt (Vect_DP args, I_table Itable);
DP SF_2p_intw (Vect_DP args, I_table Itable);
DP SF_2p_intw_alt (Vect_DP args, I_table Itable);
DP SF_2p_check_sumrule (DP req_prec, int max_rec, I_table Itable);
DP SF_2p_check_sumrule_alt (DP req_prec, int max_rec, I_table Itable);
DP Fixed_k_sumrule_w (DP k);
DP Fixed_k_sumrule_omega (DP k);
DP SF_2p_check_fixed_k_sumrule (DP k, DP req_prec, int max_rec, I_table Itable);
DP SF_2p_check_fixed_k_sumrule_alt (DP k, DP req_prec, int max_rec, I_table Itable);
DP SF_2p_check_fixed_k_sumrule_opt (DP k, DP req_prec, int Npts, I_table Itable);
/********************** FOUR SPINONS **********************/
DP Sum_norm_gl (Vect_DP rho, DP req_prec);
DP Compute_C4 (DP req_prec);
DP SF_contrib (Vect_DP p, DP req_prec, I_table Itable);
DP J_fn (Vect_DP p, DP req_prec, I_table Itable);
inline DP Jacobian_p3p4_KW (DP k, DP w, DP K, DP W)
{
return(1.0/sqrt(pow(twoPI * sin(0.5 * (k - K)), 2.0) - (w-W)*(w-W)));
}
bool Set_p_given_kwKW (DP k, DP w, DP K, DP W, Vect_DP& p);
inline DP wmin_4p (DP k)
{
return(PI * fabs(sin(k)));
}
inline DP wmax_4p (DP k)
{
return(2.0 * PI * sqrt(2.0 * (1.0 + fabs(cos(0.5*k)))));
}
inline DP Wmin (DP k, DP w, DP K)
{
return(ABACUS::max(1.0e-15, ABACUS::max(fabs(PI * sin(K)), w - twoPI * sin(0.5 * (fabs(k-K))))));
}
inline DP Wmax (DP k, DP w, DP K)
{
return(ABACUS::min(twoPI * sin(0.5 * K), w - fabs(PI * sin(k - K))));
}
DP G_fn (Vect_DP args_to_G, I_table Itable);
DP G1_fn (Vect_DP args_to_G, I_table Itable);
DP G2_fn (Vect_DP args_to_G, I_table Itable);
DP G1_fn_mid (Vect_DP args_to_G, I_table Itable);
DP G2_fn_mid (Vect_DP args_to_G, I_table Itable);
DP G_fn_alt (Vect_DP args_to_G, I_table Itable);
DP H_fn (Vect_DP args_to_H, I_table Itable);
DP H2_fn (Vect_DP args_to_H, I_table Itable);
DP H_fn_mid (Vect_DP args_to_H, I_table Itable);
DP H_fn_alt (Vect_DP args_to_H, I_table Itable);
DP SF_4p_kwKW (Vect_DP args, I_table Itable);
DP SF_4p_kwKW_alpha (Vect_DP args, I_table Itable);
DP SF_4p_kwKW_alpha_opt (Vect_DP args, I_table Itable);
// Interface to used version:
DP SF_4p_rec (DP k, DP omega, DP req_prec, int max_rec, I_table Itable);
DP SF_4p (DP k, DP omega, I_table Itable);
DP SF_4p_opt (DP k, DP omega, DP req_prec, int Npts_K, int Npts_W, I_table Itable);
void Translate_raw_4p_data (DP k, int max_rec_w, const char* SFraw_Cstr, const char* SF_Cstr, const char* SFsrc_Cstr, I_table Itable);
DP SF_4p_rec (DP k, DP req_prec, int max_rec_w, int max_rec, I_table Itable);
Integral_result SF_4p_opt (DP k, DP req_prec, int Npts, I_table Itable);
Integral_result SF_4p_opt (DP k, DP req_prec, int Npts_w, int Npts_KW, I_table Itable);
Integral_result SF_4p_opt (DP k, DP req_prec, int Npts_w, int Npts_K, int Npts_W, I_table Itable);
//******************************** Functions to produce files similar to ABACUS **********************************
void Produce_SF_2p_file (int N, int Nomega, DP omegamax, I_table Itable);
void Produce_SF_4p_file (int N, int Nomega, DP omegamax, DP req_prec, int max_rec, I_table Itable);
void Produce_SF_4p_file (int N, int Nomega, DP omegamax, DP req_prec, int Npts_K, int Npts_W, I_table Itable);
//******************************** New version, full k and omega integral in one go ******************************
DP Direct_J_integral (int Npts_p, DP req_prec, I_table Itable);
DP Direct_J_integral_bin (int Npts_p, int Npts_o, DP req_prec, I_table Itable);
void Smoothen_raw_SF_4p (int Npts_p, int Npts_o, DP req_prec, DP width);
} // namespace ABACUS
#endif