115 lines
3.5 KiB
C++
115 lines
3.5 KiB
C++
/**********************************************************
|
|
|
|
This software is part of J.-S. Caux's ABACUS library.
|
|
|
|
Copyright (c) J.-S. Caux.
|
|
|
|
-----------------------------------------------------------
|
|
|
|
File: XXZ_gpd_StagSz_h0.cc
|
|
|
|
Purpose: Compute the staggered magentization of XXZ_gpd in zero field.
|
|
|
|
***********************************************************/
|
|
|
|
#include "ABACUS.h"
|
|
|
|
using namespace std;
|
|
using namespace ABACUS;
|
|
|
|
|
|
int main( int argc, char* argv[])
|
|
{
|
|
if (!(argc == 3 || argc == 5)) { // provide some info
|
|
cout << endl << "This code computes the (1/N) (-1)^j S^z_j on-site staggered magnetization "
|
|
"for XXZ_gpd in zero field." << endl;
|
|
cout << "First option: provide two arguments: anisotropy Delta (> 1) and system size N (even)." << endl;
|
|
cout << "Second option: provide five arguments: system size N (even), Delta min, Delta max, NDelta." << endl;
|
|
cout << "The output is Delta, N, stag mag, energy gap." << endl;
|
|
ABACUSerror("");
|
|
}
|
|
else if (argc == 3) {
|
|
DP Delta = atof(argv[1]);
|
|
if (Delta <= 1.0) ABACUSerror("Provide Delta > 1.");
|
|
int N = atoi(argv[2]);
|
|
if (N % 2) ABACUSerror("Provide an even Delta.");
|
|
int M = N/2;
|
|
|
|
// Define the chain: J, Delta, h, Nsites
|
|
Heis_Chain chain(1.0, Delta, 0.0, N);
|
|
|
|
Heis_Base gbase(chain, M);
|
|
|
|
XXZ_gpd_Bethe_State gstate(chain, gbase);
|
|
gstate.Compute_All(true);
|
|
|
|
XXZ_gpd_Bethe_State estate(chain, gbase);
|
|
estate.Ix2[0][0] = M+1; // umklapp excitation
|
|
estate.Compute_All(true);
|
|
|
|
stringstream basestrstream;
|
|
basestrstream << M-2 << "x1";
|
|
string basestr = basestrstream.str();
|
|
Heis_Base basegap(chain, basestr);
|
|
XXZ_gpd_Bethe_State estategap(chain, basegap);
|
|
estategap.Compute_All(true);
|
|
|
|
if (!gstate.conv) ABACUSerror("Ground state did not converge.");
|
|
if (!estate.conv) ABACUSerror("Umklapp state did not converge.");
|
|
if (!estategap.conv) ABACUSerror("Gap state did not converge.");
|
|
|
|
cout << Delta << "\t" << N << "\t" << setprecision(12) << exp(real(ln_Sz_ME (gstate, estate)))/sqrt(N)
|
|
<< "\t" << estategap.E - gstate.E << endl;
|
|
|
|
}
|
|
|
|
else if (argc == 5) { // Do a scan in Delta
|
|
|
|
int N = atoi(argv[1]);
|
|
if (N % 2) ABACUSerror("Provide an even Delta.");
|
|
int M = N/2;
|
|
|
|
DP Deltamin = atof(argv[2]);
|
|
if (Deltamin <= 1.0) ABACUSerror("Provide Deltamin > 1.");
|
|
|
|
DP Deltamax = atof(argv[3]);
|
|
if (Deltamin <= 1.0) ABACUSerror("Provide Deltamax > Deltamin.");
|
|
|
|
int NDelta = atoi(argv[4]);
|
|
|
|
for (int iDelta = 0; iDelta <= NDelta; ++iDelta) {
|
|
|
|
DP Delta = (Deltamin * (NDelta -iDelta) + Deltamax * iDelta)/NDelta;
|
|
|
|
// Define the chain: J, Delta, h, Nsites
|
|
Heis_Chain chain(1.0, Delta, 0.0, N);
|
|
|
|
Heis_Base gbase(chain, M);
|
|
|
|
XXZ_gpd_Bethe_State gstate(chain, gbase);
|
|
gstate.Compute_All(true);
|
|
|
|
XXZ_gpd_Bethe_State estate(chain, gbase);
|
|
estate.Ix2[0][0] = M+1; // umklapp excitation
|
|
estate.Compute_All(true);
|
|
|
|
stringstream basestrstream;
|
|
basestrstream << M-2 << "x1";
|
|
string basestr = basestrstream.str();
|
|
Heis_Base basegap(chain, basestr);
|
|
XXZ_gpd_Bethe_State estategap(chain, basegap);
|
|
estategap.Compute_All(true);
|
|
|
|
if (!gstate.conv) ABACUSerror("Ground state did not converge.");
|
|
if (!estate.conv) ABACUSerror("Umklapp state did not converge.");
|
|
if (!estategap.conv) ABACUSerror("Gap state did not converge.");
|
|
|
|
cout << Delta << "\t" << N << "\t" << setprecision(12) << exp(real(ln_Sz_ME (gstate, estate)))/sqrt(N)
|
|
<< "\t" << estategap.E - gstate.E << endl;
|
|
|
|
}
|
|
}
|
|
|
|
return(0);
|
|
}
|