double LiveWLdiagram :: nearest_neighbor_energy (const Iter& it, int na, int nb) const { int site = it->site(); double E = 0.; double nb_ns_a = 0., nb_ns_b = 0.; for(int nbi = 0; nbi < _latt(it->site()).nbs(); nbi++) { int dir = _latt(site).nbdir(nbi); Iter it_ass = it->assoc(nbi); nb_ns_a += BH_Vnn (0, dir) * it_ass->z.nbef(0); nb_ns_b += BH_Vnn (1, dir) * it_ass->z.nbef(1); } E += na * nb_ns_a; E += nb * nb_ns_b; return E; }
/* void LiveWLdiagram :: shifted_diagonal_energy (const Iter& it, double& Ebef, double& Eaft) { // On-site energy int nbef = it->z.nbef(), naft = it->z.naft(), site = it->site(); int dn = naft - nbef; double dE = -EFF_MU[site] * dn; dE += BH_UHALF * (naft*(naft-1) - nbef*(nbef-1)); #ifdef NN_INTERACTION int neighbor_n = 0; for(int nbi = 0; nbi < _latt(site).nbs(); ++nbi) { Iter it_ass = it->assoc(nbi); double BH_Vnn = get_BH_Vnn (it->site(), it_ass->site()); neighbor_n += BH_Vnn * it_ass->z.nbef(); } dE += (dn * neighbor_n); #endif if (dE > 0) { Eaft = dE + EOFFSET; Ebef = EOFFSET; } else if (dE < 0) { Eaft = EOFFSET; Ebef = -dE + EOFFSET; } else { Eaft = EOFFSET; Ebef = EOFFSET; } } */ inline double LiveWLdiagram :: diagonal_energy (const Iter& it, int na, int nb) const { double E = onsite_energy (it->site(), na, nb); #ifdef NN_INTERACTION E += nearest_neighbor_energy (it, na, nb); #endif return E; }
void WLdiagram :: insert (const Iter& it_goal, int comp, double time, bool creat, bool up, Worm& worm, Iter& fix) { Iter it_bef, it_aft; diag_insert (it_goal, time, it_bef, it_aft); set_operator (it_bef, it_aft, comp, creat); if (up) { worm.set (it_aft, up); fix = it_bef; } else { worm.set (it_bef, up); fix = it_aft; } #ifdef DEBUG_MODE int site = it_goal->site(); check (site, __func__); #endif #ifdef DEBUG_TRACK_MODE __DEBUG_TRACK #endif }