ABACUS/src/EXECS/XXZ_gpd_StagSz_h0.cc

112 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);
}