123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- /**********************************************************
-
- 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
|