本文整理汇总了C++中SweepParams::set_sweep_parameters方法的典型用法代码示例。如果您正苦于以下问题:C++ SweepParams::set_sweep_parameters方法的具体用法?C++ SweepParams::set_sweep_parameters怎么用?C++ SweepParams::set_sweep_parameters使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SweepParams
的用法示例。
在下文中一共展示了SweepParams::set_sweep_parameters方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: makeStateInfo
//Initialize stateinfo using the rotation matrices
void SpinAdapted::Sweep::InitializeStateInfo(SweepParams &sweepParams, const bool &forward, int currentstate)
{
sweepParams.set_sweep_parameters();
sweepParams.set_block_iter() = 0;
std::vector<int> sites;
int new_site, wave_site;
if (forward)
new_site = 0;
else
new_site = dmrginp.spinAdapted() ? dmrginp.last_site()-1 : dmrginp.last_site()/2-1;
if (dmrginp.spinAdapted())
sites.push_back(new_site);
else {
sites.push_back(2*new_site);
sites.push_back(2*new_site+1);
std::sort(sites.begin(), sites.end());
}
//only need statinfos
StateInfo stateInfo1; makeStateInfo(stateInfo1, new_site);
StateInfo::store(forward, sites, stateInfo1, currentstate);
for (; sweepParams.get_block_iter() < sweepParams.get_n_iters(); ) {
if (forward)
new_site++;
else
new_site--;
if (dmrginp.spinAdapted())
sites.push_back(new_site);
else {
sites.push_back(2*new_site);
sites.push_back(2*new_site+1);
std::sort(sites.begin(), sites.end());
}
StateInfo siteState, newState1;
makeStateInfo(siteState, new_site);
TensorProduct(stateInfo1, siteState, newState1, NO_PARTICLE_SPIN_NUMBER_CONSTRAINT);
newState1.CollectQuanta();
//make the newstate
std::vector<Matrix> rotation1;
LoadRotationMatrix (sites, rotation1, currentstate);
StateInfo renormState1;
SpinAdapted::StateInfo::transform_state(rotation1, newState1, renormState1);
StateInfo::store(forward, sites, renormState1, currentstate);
stateInfo1 = renormState1;
++sweepParams.set_block_iter();
}
}
示例2: system
void SpinAdapted::Sweep::tiny(double sweep_tol)
{
#ifndef SERIAL
if(mpigetrank() == 0) {
#endif
pout.precision(12);
int nroots = dmrginp.nroots(0);
SweepParams sweepParams;
sweepParams.set_sweep_parameters();
StackSpinBlock system(0,dmrginp.last_site()-1, 0, true);
const StateInfo& sinfo = system.get_stateInfo();
SpinQuantum hq(0,SpinSpace(0),IrrepSpace(0));
for (int i=0; i<sinfo.totalStates; i++) {
if (sinfo.quanta[i] == dmrginp.molecule_quantum()) {
StackMatrix& h = system.get_op_array(HAM).get_element(0).at(0)->operator_element(i,i);
DiagonalMatrix energies(h.Nrows()); energies = 0.0;
diagonalise(h, energies);
for (int x=0; x<nroots; x++)
pout << "fullci energy "<< energies(x+1)<<endl;
if (mpigetrank() == 0)
{
#ifndef MOLPRO
FILE* f = fopen("dmrg.e", "wb");
#else
std::string efile;
efile = str(boost::format("%s%s") % dmrginp.load_prefix() % "/dmrg.e" );
FILE* f = fopen(efile.c_str(), "wb");
#endif
for(int j=0;j<nroots;++j) {
double e = energies(j+1);
fwrite( &e, 1, sizeof(double), f);
}
fclose(f);
}
return;
}
}
pout << "The wavefunction symmetry is not possible with the orbitals supplied."<<endl;
abort();
#ifndef SERIAL
}
#endif
}
示例3: do_one
double SweepOnepdm::do_one(SweepParams &sweepParams, const bool &warmUp, const bool &forward, const bool &restart, const int &restartSize)
{
SpinBlock system;
const int nroots = dmrginp.nroots();
std::vector<double> finalEnergy(nroots,0.);
std::vector<double> finalEnergy_spins(nroots,0.);
double finalError = 0.;
Matrix onepdm(2*dmrginp.last_site(), 2*dmrginp.last_site());onepdm=0.0;
for (int i=0; i<nroots; i++)
for (int j=0; j<=i; j++)
save_onepdm_binary(onepdm, i ,j);
sweepParams.set_sweep_parameters();
// a new renormalisation sweep routine
pout << ((forward) ? "\t\t\t Starting renormalisation sweep in forwards direction" : "\t\t\t Starting renormalisation sweep in backwards direction") << endl;
pout << "\t\t\t ============================================================================ " << endl;
InitBlocks::InitStartingBlock (system,forward, sweepParams.get_forward_starting_size(), sweepParams.get_backward_starting_size(), restartSize, restart, warmUp);
sweepParams.set_block_iter() = 0;
pout << "\t\t\t Starting block is :: " << endl << system << endl;
SpinBlock::store (forward, system.get_sites(), system); // if restart, just restoring an existing block --
sweepParams.savestate(forward, system.get_sites().size());
bool dot_with_sys = true;
sweepParams.set_guesstype() = TRANSPOSE;
SpinBlock newSystem;
BlockAndDecimate (sweepParams, system, newSystem, warmUp, dot_with_sys);
pout.precision(12);
pout << "\t\t\t The lowest sweep energy : "<< sweepParams.get_lowest_energy()[0]+dmrginp.get_coreenergy()<<endl;
pout << "\t\t\t ============================================================================ " << endl;
for (int i=0; i<nroots; i++)
for (int j=0; j<=i; j++) {
load_onepdm_binary(onepdm, i ,j);
accumulate_onepdm(onepdm);
save_onepdm_spatial_text(onepdm, i ,j);
save_onepdm_text(onepdm, i ,j);
save_onepdm_spatial_binary(onepdm, i ,j);
}
return sweepParams.get_lowest_energy()[0];
}
示例4: do_one
double SweepTwopdm::do_one(SweepParams &sweepParams, const bool &warmUp, const bool &forward, const bool &restart, const int &restartSize, int state)
{
Timer sweeptimer;
int integralIndex = 0;
if (dmrginp.hamiltonian() == BCS) {
pout << "Two PDM with BCS calculations is not implemented" << endl;
exit(0);
}
pout.precision(12);
SpinBlock system;
const int nroots = dmrginp.nroots();
std::vector<double> finalEnergy(nroots,0.);
std::vector<double> finalEnergy_spins(nroots,0.);
double finalError = 0.;
sweepParams.set_sweep_parameters();
// a new renormalisation sweep routine
pout << ((forward) ? "\t\t\t Starting renormalisation sweep in forwards direction" : "\t\t\t Starting renormalisation sweep in backwards direction") << endl;
pout << "\t\t\t ============================================================================ " << endl;
InitBlocks::InitStartingBlock (system,forward, sweepParams.current_root(), sweepParams.current_root(), sweepParams.get_forward_starting_size(), sweepParams.get_backward_starting_size(), restartSize, restart, warmUp, integralIndex);
if(!restart)
sweepParams.set_block_iter() = 0;
pout << "\t\t\t Starting block is :: " << endl << system << endl;
if (!restart)
SpinBlock::store (forward, system.get_sites(), system, sweepParams.current_root(), sweepParams.current_root()); // if restart, just restoring an existing block --
sweepParams.savestate(forward, system.get_sites().size());
bool dot_with_sys = true;
array_4d<double> twopdm(2*dmrginp.last_site(), 2*dmrginp.last_site(), 2*dmrginp.last_site(), 2*dmrginp.last_site());
twopdm.Clear();
save_twopdm_binary(twopdm, state, state);
for (; sweepParams.get_block_iter() < sweepParams.get_n_iters(); )
{
pout << "\n\t\t\t Block Iteration :: " << sweepParams.get_block_iter() << endl;
pout << "\t\t\t ----------------------------" << endl;
if (forward)
p1out << "\t\t\t Current direction is :: Forwards " << endl;
else
p1out << "\t\t\t Current direction is :: Backwards " << endl;
//if (SHOW_MORE) pout << "system block" << endl << system << endl;
if (dmrginp.no_transform())
sweepParams.set_guesstype() = BASIC;
else if (!warmUp && sweepParams.get_block_iter() != 0)
sweepParams.set_guesstype() = TRANSFORM;
else if (!warmUp && sweepParams.get_block_iter() == 0 &&
((dmrginp.algorithm_method() == TWODOT_TO_ONEDOT && dmrginp.twodot_to_onedot_iter() != sweepParams.get_sweep_iter()) ||
dmrginp.algorithm_method() != TWODOT_TO_ONEDOT))
sweepParams.set_guesstype() = TRANSPOSE;
else
sweepParams.set_guesstype() = BASIC;
p1out << "\t\t\t Blocking and Decimating " << endl;
SpinBlock newSystem;
BlockAndDecimate (sweepParams, system, newSystem, warmUp, dot_with_sys, state);
for(int j=0;j<nroots;++j)
pout << "\t\t\t Total block energy for State [ " << j <<
" ] with " << sweepParams.get_keep_states()<<" :: " << sweepParams.get_lowest_energy()[j] <<endl;
finalEnergy_spins = ((sweepParams.get_lowest_energy()[0] < finalEnergy[0]) ? sweepParams.get_lowest_energy_spins() : finalEnergy_spins);
finalEnergy = ((sweepParams.get_lowest_energy()[0] < finalEnergy[0]) ? sweepParams.get_lowest_energy() : finalEnergy);
finalError = max(sweepParams.get_lowest_error(),finalError);
system = newSystem;
pout << system<<endl;
SpinBlock::store (forward, system.get_sites(), system, sweepParams.current_root(), sweepParams.current_root());
p1out << "\t\t\t saving state " << system.get_sites().size() << endl;
++sweepParams.set_block_iter();
//sweepParams.savestate(forward, system.get_sites().size());
}
//for(int j=0;j<nroots;++j)
{int j = state;
pout << "\t\t\t Finished Sweep with " << sweepParams.get_keep_states() << " states and sweep energy for State [ " << j
<< " ] with Spin [ " << dmrginp.molecule_quantum().get_s() << " ] :: " << finalEnergy[j] << endl;
}
pout << "\t\t\t Largest Error for Sweep with " << sweepParams.get_keep_states() << " states is " << finalError << endl;
pout << "\t\t\t ============================================================================ " << endl;
int i = state, j = state;
//for (int j=0; j<=i; j++) {
load_twopdm_binary(twopdm, i, j);
//calcenergy(twopdm, i);
save_twopdm_text(twopdm, i, j);
save_spatial_twopdm_text(twopdm, i, j);
save_spatial_twopdm_binary(twopdm, i, j);
// update the static number of iterations
//.........这里部分代码省略.........
示例5: InitializeOverlapSpinBlocks
//before you start optimizing each state you want to initalize all the overlap matrices
void Sweep::InitializeOverlapSpinBlocks(SweepParams &sweepParams, const bool &forward, int stateA, int stateB)
{
SpinBlock system;
sweepParams.set_sweep_parameters();
if (forward)
pout << "\t\t\t Starting sweep "<< sweepParams.set_sweep_iter()<<" in forwards direction"<<endl;
else
pout << "\t\t\t Starting sweep "<< sweepParams.set_sweep_iter()<<" in backwards direction" << endl;
pout << "\t\t\t ============================================================================ " << endl;
int restartSize = 0; bool restart = false, warmUp = false;
InitBlocks::InitStartingBlock (system,forward, stateA, stateB, sweepParams.get_forward_starting_size(), sweepParams.get_backward_starting_size(), restartSize, restart, warmUp);
sweepParams.set_block_iter() = 0;
if (dmrginp.outputlevel() > 0)
pout << "\t\t\t Starting block is :: " << endl << system << endl;
SpinBlock::store (forward, system.get_sites(), system, stateA, stateB); // if restart, just restoring an existing block --
sweepParams.savestate(forward, system.get_sites().size());
bool dot_with_sys = true;
vector<int> syssites = system.get_sites();
if (dmrginp.outputlevel() > 0)
mcheck("at the very start of sweep"); // just timer
for (; sweepParams.get_block_iter() < sweepParams.get_n_iters(); ) // get_n_iters() returns the number of blocking iterations needed in one sweep
{
pout << "\t\t\t Block Iteration :: " << sweepParams.get_block_iter() << endl;
pout << "\t\t\t ----------------------------" << endl;
if (dmrginp.outputlevel() > 0) {
if (forward) pout << "\t\t\t Current direction is :: Forwards " << endl;
else pout << "\t\t\t Current direction is :: Backwards " << endl;
}
SpinBlock systemDot, environmentDot;
int systemDotStart, systemDotEnd;
int systemDotSize = sweepParams.get_sys_add() - 1;
if (forward)
{
systemDotStart = dmrginp.spinAdapted() ? *system.get_sites().rbegin () + 1 : (*system.get_sites().rbegin ())/2 + 1 ;
systemDotEnd = systemDotStart + systemDotSize;
}
else
{
systemDotStart = dmrginp.spinAdapted() ? system.get_sites()[0] - 1 : (system.get_sites()[0])/2 - 1 ;
systemDotEnd = systemDotStart - systemDotSize;
}
systemDot = SpinBlock(systemDotStart, systemDotEnd, true);
SpinBlock newSystem; // new system after blocking and decimating
newSystem.initialise_op_array(OVERLAP, false);
newSystem.setstoragetype(DISTRIBUTED_STORAGE);
newSystem.BuildSumBlock (NO_PARTICLE_SPIN_NUMBER_CONSTRAINT, system, systemDot);
std::vector<Matrix> brarotateMatrix, ketrotateMatrix;
LoadRotationMatrix(newSystem.get_sites(), brarotateMatrix, stateA);
LoadRotationMatrix(newSystem.get_sites(), ketrotateMatrix, stateB);
newSystem.transform_operators(brarotateMatrix, ketrotateMatrix);
system = newSystem;
if (dmrginp.outputlevel() > 0){
pout << system<<endl;
}
SpinBlock::store (forward, system.get_sites(), system, stateA, stateB);
++sweepParams.set_block_iter();
sweepParams.savestate(forward, syssites.size());
if (dmrginp.outputlevel() > 0)
mcheck("at the end of sweep iteration");
}
pout << "\t\t\t ============================================================================ " << endl;
// update the static number of iterations
return ;
}
示例6: hq
void SpinAdapted::Sweep::fullci(double sweep_tol)
{
int integralIndex = 0;
SweepParams sweepParams;
sweepParams.set_sweep_parameters();
StackSpinBlock system, sysdot;
InitBlocks::InitStartingBlock(system, true, 0, 0, sweepParams.get_forward_starting_size(), sweepParams.get_backward_starting_size(), 0, false, true, integralIndex);
int numsites = dmrginp.spinAdapted() ? dmrginp.last_site() : dmrginp.last_site()/2;
int forwardsites = numsites/2+numsites%2;
int backwardsites = numsites - forwardsites;
SpinQuantum hq(0,SpinSpace(0),IrrepSpace(0));
StackSpinBlock newSystem;
for (int i=0; i<forwardsites-1; i++) {
sysdot = StackSpinBlock(i+1, i+1, integralIndex, true);
system.addAdditionalOps();
newSystem.set_integralIndex() = integralIndex;
if (i == forwardsites-2)
newSystem.default_op_components(true, true, false, true);
else
newSystem.default_op_components(false, true, false, true);
newSystem.setstoragetype(DISTRIBUTED_STORAGE);
newSystem.BuildSumBlock (NO_PARTICLE_SPIN_NUMBER_CONSTRAINT, system, sysdot);
long memoryToFree = newSystem.getdata() - system.getdata();
long newsysMemory = newSystem.memoryUsed();
if (i != forwardsites-2) {
if (i != 0) {
newSystem.moveToNewMemory(system.getdata());
Stackmem[0].deallocate(newSystem.getdata()+newSystem.memoryUsed(), memoryToFree);
}
system.clear();
system = newSystem;
}
}
StackSpinBlock environment, newEnvironment, envdot;
InitBlocks::InitStartingBlock(environment, false, 0, 0, sweepParams.get_forward_starting_size(), sweepParams.get_backward_starting_size(), 0, false, true, integralIndex);
for (int i=0;i <backwardsites-1; i++) {
envdot = StackSpinBlock(numsites-2-i, numsites-2-i, integralIndex, true);
environment.addAdditionalOps();
newEnvironment.set_integralIndex() = integralIndex;
if (i == backwardsites-2)
newEnvironment.default_op_components(true, false, true, true);
else
newEnvironment.default_op_components(false, false, true, true);
newEnvironment.setstoragetype(DISTRIBUTED_STORAGE);
newEnvironment.BuildSumBlock (NO_PARTICLE_SPIN_NUMBER_CONSTRAINT, environment, envdot);
if (i!=backwardsites-2) {
if (i != 0) {
long memoryToFree = newEnvironment.getdata() - environment.getdata();
long newenvMemory = newEnvironment.memoryUsed();
newEnvironment.moveToNewMemory(environment.getdata());
Stackmem[0].deallocate(newEnvironment.getdata()+newEnvironment.memoryUsed(), memoryToFree);
}
environment.clear();
environment = newEnvironment;
}
}
pout <<"\t\t\t System Block :: "<< newSystem;
pout <<"\t\t\t Environment Block :: "<< newEnvironment;
newSystem.set_loopblock(true); newEnvironment.set_loopblock(false);
StackSpinBlock big;
InitBlocks::InitBigBlock(newSystem, newEnvironment, big);
int nroots = dmrginp.nroots(0);
std::vector<StackWavefunction> solution(nroots);
solution[0].initialise(dmrginp.effective_molecule_quantum_vec(), big.get_leftBlock()->get_stateInfo(), big.get_rightBlock()->get_stateInfo(), false);
solution[0].Clear();
if (mpigetrank() == 0) {
for (int i=1; i<nroots; i++) {
solution[i].initialise(dmrginp.effective_molecule_quantum_vec(), big.get_leftBlock()->get_stateInfo(), big.get_rightBlock()->get_stateInfo(), false);
solution[i].Clear();
}
}
std::vector<double> energies(nroots);
double tol = sweepParams.get_davidson_tol();
pout << "\t\t\t Solving the Wavefunction "<<endl;
int currentState = 0;
std::vector<StackWavefunction> lowerStates;
Solver::solve_wavefunction(solution, energies, big, tol, BASIC, false, true, false, false, sweepParams.get_additional_noise(), currentState, lowerStates);
pout << "tensormultiply "<<*dmrginp.tensormultiply<<endl;
for (int i=0; i<nroots; i++) {
pout << "fullci energy "<< energies[i]<<endl;
}
if (!mpigetrank())
{
//.........这里部分代码省略.........
示例7: pbmps
void SpinAdapted::mps_nevpt::type1::subspace_Va(int baseState)
{
double energy=0;
double overlap=0;
VaPerturber pb;
MPS::siteBlocks.clear();
int virtsize = dmrginp.spinAdapted()? dmrginp.virt_size():dmrginp.virt_size()*2;
int virtshift = dmrginp.spinAdapted()? dmrginp.core_size()+dmrginp.act_size(): (dmrginp.core_size()+dmrginp.act_size())*2;
//int virtsize = dmrginp.virt_size();
//int virtshift = dmrginp.core_size()+dmrginp.act_size();
for(int i=0; i< virtsize; i++){
double perturberEnergy=0;
dmrginp.calc_type() = MPS_NEVPT;
pb.init(i+virtshift);
pout << "Begin Va subspace with a = " << pb.orb(0)<<endl;
SweepParams sweepParams;
sweepParams.set_sweep_parameters();
sweepParams.current_root() = baseState;
//sweepParams.current_root() = -1;
//double last_fe = Startup(sweepParams, true, true, false, 0, pb, baseState);
Timer timer;
Startup(sweepParams, true, pb, baseState);
pout <<"Start up time :" << timer.elapsedwalltime();
//sweepParams.current_root() = baseState;
timer.start();
while(true)
{
do_one(sweepParams, false, false, false, 0, pb, baseState);
if(dmrginp.max_iter() <= sweepParams.get_sweep_iter())
break;
do_one(sweepParams, false, true, false, 0, pb, baseState);
if(dmrginp.max_iter() <= sweepParams.get_sweep_iter())
{
cleanup(baseState, pb);
break;
}
}
pout <<"Sweep time :" << timer.elapsedwalltime();
// while ( true)
// {
// old_fe = last_fe;
// old_be = last_be;
// if(dmrginp.max_iter() <= sweepParams.get_sweep_iter())
// break;
// last_be = do_one(sweepParams, false, false, false, 0, pb, baseState);
// if (dmrginp.outputlevel() > 0)
// pout << "Finished Sweep Iteration "<<sweepParams.get_sweep_iter()<<endl;
//
// if(dmrginp.max_iter() <= sweepParams.get_sweep_iter())
// break;
//
// last_fe = do_one(sweepParams, false, true, false, 0, pb, baseState);
//
// if (dmrginp.outputlevel() > 0)
// pout << "Finished Sweep Iteration "<<sweepParams.get_sweep_iter()<<endl;
//
// }
//
// if (mpigetrank()==0) {
// bool direction = true;
// Sweep::InitializeStateInfo(sweepParams, !direction, pb.wavenumber(),pb.braquanta );
// Sweep::InitializeStateInfo(sweepParams, direction, pb.wavenumber(),pb.braquanta );
// Sweep::CanonicalizeWavefunction(sweepParams, !direction, pb.wavenumber(),pb.braquanta );
// Sweep::CanonicalizeWavefunction(sweepParams, direction, pb.wavenumber(),pb.braquanta );
// Sweep::CanonicalizeWavefunction(sweepParams, !direction, pb.wavenumber(),pb.braquanta );
// Sweep::InitializeStateInfo(sweepParams, !direction, pb.wavenumber(),pb.braquanta );
// Sweep::InitializeStateInfo(sweepParams, direction, pb.wavenumber(),pb.braquanta );
//
// }
MPS pbmps(pb.wavenumber());
double o, h;
dmrginp.calc_type() = DMRG;
timer.start();
calcHamiltonianAndOverlap(pbmps, h, o,pb);
pout <<"Calculate Expectation time :" << timer.elapsedwalltime();
if(!dmrginp.spinAdapted())
{
//In nonspinAdapted, alpha and beta have the results. Only one is neccessary.
o*=2;
h*=2;
i++;
}
if(o> NUMERICAL_ZERO){
double fock =dmrginp.spinAdapted()? v_1[0](2*(i+virtshift),2*(i+virtshift)): v_1[0](i+virtshift,i+virtshift);
//perturberEnergy = h/o+fock+perturber::CoreEnergy[0];
perturberEnergy = h/o+fock;
energy += o/(mps_nevpt::ZeroEnergy[baseState]- perturberEnergy) ;
//overlap +=o;
overlap += sqrt(o)/(mps_nevpt::ZeroEnergy[baseState]- perturberEnergy);
if (dmrginp.outputlevel() > 0){
pout << "Amplitude : " << sqrt(o)/(mps_nevpt::ZeroEnergy[baseState]- perturberEnergy) <<endl;
pout << "Ener(only CAS part) : " << h/o<<endl;
pout << "Energy : " << perturberEnergy<<endl;
//.........这里部分代码省略.........
示例8: finalEnergy
double SpinAdapted::mps_nevpt::type1::do_one(SweepParams &sweepParams, const bool &warmUp, const bool &forward, const bool &restart, const int &restartSize, perturber& pb, int baseState)
{
int integralIndex = 0;
SpinBlock system;
system.nonactive_orb() = pb.orb();
const int nroots = dmrginp.nroots(sweepParams.get_sweep_iter());
std::vector<double> finalEnergy(nroots,-1.0e10);
std::vector<double> finalEnergy_spins(nroots,0.);
double finalError = 0.;
sweepParams.set_sweep_parameters();
// a new renormalisation sweep routine
if (forward)
if (dmrginp.outputlevel() > 0)
pout << "\t\t\t Starting sweep "<< sweepParams.set_sweep_iter()<<" in forwards direction"<<endl;
else
if (dmrginp.outputlevel() > 0)
{
pout << "\t\t\t Starting sweep "<< sweepParams.set_sweep_iter()<<" in backwards direction" << endl;
pout << "\t\t\t ============================================================================ " << endl;
}
InitBlocks::InitStartingBlock (system,forward, baseState, pb.wavenumber(), sweepParams.get_forward_starting_size(), sweepParams.get_backward_starting_size(), restartSize, restart, warmUp, integralIndex, pb.braquanta, pb.ketquanta);
if(!restart)
sweepParams.set_block_iter() = 0;
if (dmrginp.outputlevel() > 0)
pout << "\t\t\t Starting block is :: " << endl << system << endl;
SpinBlock::store (forward, system.get_sites(), system, pb.wavenumber(), baseState); // if restart, just restoring an existing block --
sweepParams.savestate(forward, system.get_sites().size());
bool dot_with_sys = true;
vector<int> syssites = system.get_sites();
if (restart)
{
if (forward && system.get_complementary_sites()[0] >= dmrginp.last_site()/2)
dot_with_sys = false;
if (!forward && system.get_sites()[0]-1 < dmrginp.last_site()/2)
dot_with_sys = false;
}
if (dmrginp.outputlevel() > 0)
mcheck("at the very start of sweep"); // just timer
for (; sweepParams.get_block_iter() < sweepParams.get_n_iters(); ) // get_n_iters() returns the number of blocking iterations needed in one sweep
{
if (dmrginp.outputlevel() > 0)
{
pout << "\t\t\t Block Iteration :: " << sweepParams.get_block_iter() << endl;
pout << "\t\t\t ----------------------------" << endl;
}
if (dmrginp.outputlevel() > 0) {
if (forward)
{
pout << "\t\t\t Current direction is :: Forwards " << endl;
}
else
{
pout << "\t\t\t Current direction is :: Backwards " << endl;
}
}
if (sweepParams.get_block_iter() != 0)
sweepParams.set_guesstype() = TRANSFORM;
else
sweepParams.set_guesstype() = TRANSPOSE;
if (dmrginp.outputlevel() > 0)
pout << "\t\t\t Blocking and Decimating " << endl;
SpinBlock newSystem; // new system after blocking and decimating
newSystem.nonactive_orb() = pb.orb();
//Need to substitute by:
// if (warmUp )
// Startup(sweepParams, system, newSystem, dot_with_sys, pb.wavenumber(), baseState);
// else {
// BlockDecimateAndCompress (sweepParams, system, newSystem, false, dot_with_sys, pb.wavenumber(), baseState);
// }
BlockDecimateAndCompress (sweepParams, system, newSystem, warmUp, dot_with_sys,pb, baseState);
//Need to substitute by?
system = newSystem;
if (dmrginp.outputlevel() > 0){
pout << system<<endl;
pout << system.get_braStateInfo()<<endl;
system.printOperatorSummary();
}
//system size is going to be less than environment size
if (forward && system.get_complementary_sites()[0] >= dmrginp.last_site()/2)
dot_with_sys = false;
if (!forward && system.get_sites()[0]-1 < dmrginp.last_site()/2)
dot_with_sys = false;
//.........这里部分代码省略.........
示例9: do_one
void SweepGenblock::do_one(SweepParams &sweepParams, const bool &forward, int stateA, int stateB)
{
Timer sweeptimer;
int integralIndex = 0;
SpinBlock system;
sweepParams.set_sweep_parameters();
// a new renormalisation sweep routine
pout << ((forward) ? "\t\t\t Starting renormalisation sweep in forwards direction" : "\t\t\t Starting renormalisation sweep in backwards direction") << endl;
pout << "\t\t\t ============================================================================ " << endl;
InitBlocks::InitStartingBlock (system,forward, stateA, stateB, sweepParams.get_forward_starting_size(), sweepParams.get_backward_starting_size(), 0, false, false, integralIndex);
sweepParams.set_block_iter() = 0;
p2out << "\t\t\t Starting block is :: " << endl << system << endl;
bool dot_with_sys = true;
for (; sweepParams.get_block_iter() < sweepParams.get_n_iters(); )
{
pout << "\n\t\t\t Block Iteration :: " << sweepParams.get_block_iter() << endl;
pout << "\t\t\t ----------------------------" << endl;
if (forward)
{ p1out << "\t\t\t Current direction is :: Forwards " << endl; }
else
{ p1out << "\t\t\t Current direction is :: Backwards " << endl; }
if (dmrginp.no_transform())
sweepParams.set_guesstype() = BASIC;
else if ( sweepParams.get_block_iter() != 0)
sweepParams.set_guesstype() = TRANSFORM;
else if ( sweepParams.get_block_iter() == 0 )
sweepParams.set_guesstype() = TRANSPOSE;
else
sweepParams.set_guesstype() = BASIC;
p1out << "\t\t\t Blocking and Decimating " << endl;
SpinBlock newSystem;
BlockAndDecimate (sweepParams, system, newSystem, false, dot_with_sys, stateA, stateB);
system = newSystem;
SpinBlock::store(forward, system.get_sites(), system, stateA, stateB);
//system size is going to be less than environment size
if (forward && system.get_complementary_sites()[0] >= dmrginp.last_site()/2)
dot_with_sys = false;
if (!forward && system.get_sites()[0]-1 < dmrginp.last_site()/2)
dot_with_sys = false;
++sweepParams.set_block_iter();
}
pout << "\t\t\t Finished Generate-Blocks Sweep. " << endl;
pout << "\t\t\t ============================================================================ " << endl;
// update the static number of iterations
++sweepParams.set_sweep_iter();
ecpu = sweeptimer.elapsedcputime(); ewall = sweeptimer.elapsedwalltime();
pout << "\t\t\t Elapsed Sweep CPU Time (seconds): " << setprecision(3) << ecpu << endl;
pout << "\t\t\t Elapsed Sweep Wall Time (seconds): " << setprecision(3) << ewall << endl;
}