mirror of
https://github.com/triqs/dft_tools
synced 2024-12-25 13:53:40 +01:00
f2c7d449cc
for earlier commits, see TRIQS0.x repository.
77 lines
2.5 KiB
C++
77 lines
2.5 KiB
C++
|
|
/*******************************************************************************
|
|
*
|
|
* TRIQS: a Toolbox for Research in Interacting Quantum Systems
|
|
*
|
|
* Copyright (C) 2011 by M. Ferrero, O. Parcollet
|
|
*
|
|
* TRIQS is free software: you can redistribute it and/or modify it under the
|
|
* terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* TRIQS. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
******************************************************************************/
|
|
|
|
#ifndef FULL_UPDATE_H_jh93n8
|
|
#define FULL_UPDATE_H_jh93n8
|
|
|
|
/*
|
|
* Usage : create such an object
|
|
* transform it into boost::function<bool()> and pass it as AfterCycleDuty
|
|
*/
|
|
class full_update_mechanism {
|
|
int iter_fastup,nfastup;
|
|
double FullUpdate_diff_ALERT, FullUpdate_diff_increase, FullUpdate_diff_reduce;
|
|
triqs::utility::report_stream & REPORT;
|
|
|
|
public :
|
|
full_update_mechanism (triqs::utility::report_stream & rep_,
|
|
int NbreFastIteration_Init, int FullUpdate_diff_ALERT_, int FullUpdate_diff_increase_, int FullUpdate_diff_reduce_): REPORT(rep) {
|
|
// fast update mechanism
|
|
nfastup=NbreFastIteration_Init;
|
|
iter_fastup=0;
|
|
FullUpdate_diff_ALERT = FullUpdate_diff_ALERT_;
|
|
FullUpdate_diff_increase= FullUpdate_diff_increase_;
|
|
FullUpdate_diff_reduce = FullUpdate_diff_reduce_;
|
|
}
|
|
|
|
virtual ~full_update_mechanism() {}
|
|
|
|
virtual double fullUpdate(){return 0;}
|
|
|
|
bool operator()() {
|
|
|
|
//Update the FullUpdate data if necessary
|
|
iter_fastup++;
|
|
// Here we take some decision, depending whether nfastup is too big, too small ,etc
|
|
if ((nfastup>=0) && (iter_fastup>=nfastup)) {
|
|
iter_fastup=0;
|
|
// Now updating cleanly
|
|
double diff=this->fullUpdate();
|
|
//REPORT << "Full update done" << endl;
|
|
if (diff > FullUpdate_diff_ALERT)
|
|
REPORT <<"Full update : diff="<< diff <<" WARNING : Fast Update deviation too big "<<endl;
|
|
bool bo=false;
|
|
if (diff < FullUpdate_diff_increase) {bo=true; nfastup=2*nfastup;}
|
|
if (diff > FullUpdate_diff_reduce) {bo=true;nfastup=max(1,nfastup/2);}
|
|
if (bo) {
|
|
REPORT << "diff="<<diff<<endl;
|
|
REPORT << "New number of fast updates : "<< nfastup<<endl<<endl;
|
|
}
|
|
}
|
|
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|