mirror of https://github.com/QMCPACK/qmcpack.git
Add a sample code for coupled MC.
git-svn-id: https://subversion.assembla.com/svn/qmcdev/trunk@5918 e5b18d87-469d-4833-9cc0-8cdfa06e9491
This commit is contained in:
parent
014362d7e3
commit
a254b87a2b
|
@ -11,6 +11,7 @@ SET(QMCAPPDIR
|
||||||
QMCAppBase.cpp
|
QMCAppBase.cpp
|
||||||
QMCDriverFactory.cpp
|
QMCDriverFactory.cpp
|
||||||
QMCMain.cpp
|
QMCMain.cpp
|
||||||
|
CoupledMC.cpp
|
||||||
)
|
)
|
||||||
ADD_LIBRARY(qmc ${QMCAPPDIR})
|
ADD_LIBRARY(qmc ${QMCAPPDIR})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
// (c) Copyright 2003- by Jeongnim Kim
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
// -*- C++ -*-
|
||||||
|
/**@file QMCMain.cpp
|
||||||
|
* @brief Implments QMCMain operators.
|
||||||
|
*/
|
||||||
|
#include "QMCApp/QMCMain.h"
|
||||||
|
#include "QMCApp/ParticleSetPool.h"
|
||||||
|
#include "QMCApp/WaveFunctionPool.h"
|
||||||
|
#include "QMCApp/HamiltonianPool.h"
|
||||||
|
#include "QMCWaveFunctions/TrialWaveFunction.h"
|
||||||
|
#include "QMCHamiltonians/QMCHamiltonian.h"
|
||||||
|
#include "ParticleBase/RandomSeqGenerator.h"
|
||||||
|
#include "Utilities/OhmmsInfo.h"
|
||||||
|
#include "Utilities/Timer.h"
|
||||||
|
#include "QMCDrivers/QMCDriver.h"
|
||||||
|
#include "QMCDrivers/CMC/DummyIonMove.h"
|
||||||
|
#include "Message/Communicate.h"
|
||||||
|
#include "Message/OpenMP.h"
|
||||||
|
#include "qmc_common.h"
|
||||||
|
using namespace std;
|
||||||
|
#include "OhmmsData/AttributeSet.h"
|
||||||
|
|
||||||
|
namespace qmcplusplus
|
||||||
|
{
|
||||||
|
|
||||||
|
bool QMCMain::executeCMCSection(xmlNodePtr cur)
|
||||||
|
{
|
||||||
|
bool success=true;
|
||||||
|
string target("ion0");
|
||||||
|
OhmmsAttributeSet a;
|
||||||
|
a.add(target,"target");
|
||||||
|
a.put(cur);
|
||||||
|
|
||||||
|
MCWalkerConfiguration *ions = ptclPool->getWalkerSet(target);
|
||||||
|
TrialWaveFunction* primaryPsi=psiPool->getPrimary();
|
||||||
|
QMCHamiltonian* primaryH=hamPool->getPrimary();
|
||||||
|
|
||||||
|
app_log() << "QMCMain::executeCMCSection moving " << target << " by dummy move." << endl;
|
||||||
|
//DummyIonMove dummy(*ions,*primaryPsi,*primaryH,*hamPool,*psiPool,qmcDriver);
|
||||||
|
//dummy.run();
|
||||||
|
|
||||||
|
int nat = ions->getTotalNum();
|
||||||
|
ParticleSet::ParticlePos_t deltaR(nat);
|
||||||
|
|
||||||
|
makeGaussRandomWithEngine(deltaR,Random); //generate random displaement
|
||||||
|
|
||||||
|
//update QMC system
|
||||||
|
qmcSystem->update();
|
||||||
|
|
||||||
|
double logpsi1 = primaryPsi->evaluateLog(*qmcSystem);
|
||||||
|
cout << "logpsi1 " << logpsi1 << endl;
|
||||||
|
|
||||||
|
double eloc1 = primaryH->evaluate(*qmcSystem);
|
||||||
|
cout << "Local Energy " << eloc1 << endl;
|
||||||
|
|
||||||
|
for (int i=0; i<primaryH->sizeOfObservables(); i++)
|
||||||
|
app_log() << " HamTest " << primaryH->getObservableName(i) << " " << primaryH->getObservable(i) << endl;
|
||||||
|
|
||||||
|
for(int iat=0; iat<nat; ++iat)
|
||||||
|
{
|
||||||
|
ions->R[iat]+=deltaR[iat];
|
||||||
|
|
||||||
|
ions->update(); //update position and distance table of itself
|
||||||
|
primaryH->update_source(*ions);
|
||||||
|
|
||||||
|
qmcSystem->update();
|
||||||
|
double logpsi2 = primaryPsi->evaluateLog(*qmcSystem);
|
||||||
|
double eloc2 = primaryH->evaluate(*qmcSystem);
|
||||||
|
|
||||||
|
cout << "\nION " << iat << " " << ions->R[iat] << endl;
|
||||||
|
cout << "logpsi " << logpsi2 << endl;
|
||||||
|
cout << "Local Energy " << eloc2 << endl;
|
||||||
|
for (int i=0; i<primaryH->sizeOfObservables(); i++)
|
||||||
|
app_log() << " HamTest " << primaryH->getObservableName(i) << " " << primaryH->getObservable(i) << endl;
|
||||||
|
|
||||||
|
ions->R[iat]-=deltaR[iat];
|
||||||
|
ions->update(); //update position and distance table of itself
|
||||||
|
primaryH->update_source(*ions);
|
||||||
|
|
||||||
|
qmcSystem->update();
|
||||||
|
double logpsi3 = primaryPsi->evaluateLog(*qmcSystem);
|
||||||
|
double eloc3 = primaryH->evaluate(*qmcSystem);
|
||||||
|
|
||||||
|
if(abs(eloc1-eloc3)>1e-12)
|
||||||
|
{
|
||||||
|
cout << "ERROR Energies are different " << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//for(int i=0; i<ions->getTotalNum(); ++i)
|
||||||
|
//{
|
||||||
|
// ions->R[i]+=deltaR(i);
|
||||||
|
// ions->update();
|
||||||
|
// primaryH->update_source(*ions);
|
||||||
|
// qmcDriver->run();
|
||||||
|
//}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/***********************************************************************
|
||||||
|
* $RCSfilMCMain.cpp,v $ $Author: jnkim $
|
||||||
|
* $Revision: 5845 $ $Date: 2013-05-14 16:10:18 -0400 (Tue, 14 May 2013) $
|
||||||
|
* $Id: QMCMain.cpp 5845 2013-05-14 20:10:18Z jnkim $
|
||||||
|
***************************************************************************/
|
|
@ -41,6 +41,16 @@ ParticleSetPool::ParticleSetPool(Communicate* c, const char* aname)
|
||||||
myName=aname;
|
myName=aname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParticleSetPool::make_clones(int n)
|
||||||
|
{
|
||||||
|
PoolType::const_iterator it(myPool.begin()), it_end(myPool.end());
|
||||||
|
while(it != it_end)
|
||||||
|
{
|
||||||
|
(*it).second->make_clones(n);
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ParticleSet* ParticleSetPool::getParticleSet(const string& pname)
|
ParticleSet* ParticleSetPool::getParticleSet(const string& pname)
|
||||||
{
|
{
|
||||||
map<string,ParticleSet*>::iterator pit(myPool.find(pname));
|
map<string,ParticleSet*>::iterator pit(myPool.find(pname));
|
||||||
|
|
|
@ -98,6 +98,10 @@ public:
|
||||||
*/
|
*/
|
||||||
void randomize();
|
void randomize();
|
||||||
|
|
||||||
|
/** make clones for the ParticleSets of this pool
|
||||||
|
* */
|
||||||
|
void make_clones(int n);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** global SimulationCell
|
/** global SimulationCell
|
||||||
*
|
*
|
||||||
|
|
|
@ -115,6 +115,10 @@ bool QMCMain::execute()
|
||||||
executeLoop(cur);
|
executeLoop(cur);
|
||||||
qmc_common.qmc_counter=0;
|
qmc_common.qmc_counter=0;
|
||||||
}
|
}
|
||||||
|
else if(cname == "cmc")
|
||||||
|
{
|
||||||
|
executeCMCSection(cur);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_qmcaction.clear();
|
m_qmcaction.clear();
|
||||||
app_log() << " Total Execution time = " << t1.elapsed() << " secs" << endl;
|
app_log() << " Total Execution time = " << t1.elapsed() << " secs" << endl;
|
||||||
|
@ -280,50 +284,44 @@ bool QMCMain::validateXML()
|
||||||
{
|
{
|
||||||
putCommunicator(cur);
|
putCommunicator(cur);
|
||||||
}
|
}
|
||||||
else
|
else if(cname == "particleset")
|
||||||
if(cname == "particleset")
|
{
|
||||||
|
ptclPool->put(cur);
|
||||||
|
}
|
||||||
|
else if(cname == "wavefunction")
|
||||||
|
{
|
||||||
|
psiPool->put(cur);
|
||||||
|
}
|
||||||
|
else if(cname == "hamiltonian")
|
||||||
|
{
|
||||||
|
hamPool->put(cur);
|
||||||
|
}
|
||||||
|
else if(cname == "include")
|
||||||
|
{
|
||||||
|
//file is provided
|
||||||
|
const xmlChar* a=xmlGetProp(cur,(const xmlChar*)"href");
|
||||||
|
if(a)
|
||||||
{
|
{
|
||||||
ptclPool->put(cur);
|
pushDocument((const char*)a);
|
||||||
|
inputnode = processPWH(XmlDocStack.top()->getRoot());
|
||||||
|
popDocument();
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
if(cname == "wavefunction")
|
else if(cname == "qmcsystem")
|
||||||
{
|
{
|
||||||
psiPool->put(cur);
|
processPWH(cur);
|
||||||
}
|
}
|
||||||
else
|
else if(cname == "init")
|
||||||
if(cname == "hamiltonian")
|
{
|
||||||
{
|
InitMolecularSystem moinit(ptclPool);
|
||||||
hamPool->put(cur);
|
moinit.put(cur);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if(cname == "include")
|
{
|
||||||
{
|
//everything else goes to m_qmcaction
|
||||||
//file is provided
|
m_qmcaction.push_back(pair<xmlNodePtr,bool>(cur,true));
|
||||||
const xmlChar* a=xmlGetProp(cur,(const xmlChar*)"href");
|
inputnode=false;
|
||||||
if(a)
|
}
|
||||||
{
|
|
||||||
pushDocument((const char*)a);
|
|
||||||
inputnode = processPWH(XmlDocStack.top()->getRoot());
|
|
||||||
popDocument();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(cname == "qmcsystem")
|
|
||||||
{
|
|
||||||
processPWH(cur);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(cname == "init")
|
|
||||||
{
|
|
||||||
InitMolecularSystem moinit(ptclPool);
|
|
||||||
moinit.put(cur);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//everything else goes to m_qmcaction
|
|
||||||
m_qmcaction.push_back(pair<xmlNodePtr,bool>(cur,true));
|
|
||||||
inputnode=false;
|
|
||||||
}
|
|
||||||
if(inputnode)
|
if(inputnode)
|
||||||
lastInputNode=cur;
|
lastInputNode=cur;
|
||||||
cur=cur->next;
|
cur=cur->next;
|
||||||
|
@ -373,28 +371,25 @@ bool QMCMain::processPWH(xmlNodePtr cur)
|
||||||
{
|
{
|
||||||
ptclPool->putLattice(cur);
|
ptclPool->putLattice(cur);
|
||||||
}
|
}
|
||||||
|
else if(cname == "particleset")
|
||||||
|
{
|
||||||
|
ptclPool->putTileMatrix(cur_root);
|
||||||
|
ptclPool->put(cur);
|
||||||
|
}
|
||||||
|
else if(cname == "wavefunction")
|
||||||
|
{
|
||||||
|
psiPool->put(cur);
|
||||||
|
}
|
||||||
|
else if(cname == "hamiltonian")
|
||||||
|
{
|
||||||
|
hamPool->put(cur);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
if(cname == "particleset")
|
//add to m_qmcaction
|
||||||
{
|
{
|
||||||
ptclPool->putTileMatrix(cur_root);
|
inputnode=false;
|
||||||
ptclPool->put(cur);
|
m_qmcaction.push_back(pair<xmlNodePtr,bool>(xmlCopyNode(cur,1),false));
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if(cname == "wavefunction")
|
|
||||||
{
|
|
||||||
psiPool->put(cur);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(cname == "hamiltonian")
|
|
||||||
{
|
|
||||||
hamPool->put(cur);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
//add to m_qmcaction
|
|
||||||
{
|
|
||||||
inputnode=false;
|
|
||||||
m_qmcaction.push_back(pair<xmlNodePtr,bool>(xmlCopyNode(cur,1),false));
|
|
||||||
}
|
|
||||||
cur=cur->next;
|
cur=cur->next;
|
||||||
}
|
}
|
||||||
//flush
|
//flush
|
||||||
|
|
|
@ -86,6 +86,9 @@ private:
|
||||||
* @return true, if a section is successfully executed.
|
* @return true, if a section is successfully executed.
|
||||||
*/
|
*/
|
||||||
bool executeQMCSection(xmlNodePtr cur, bool noloop=true);
|
bool executeQMCSection(xmlNodePtr cur, bool noloop=true);
|
||||||
|
///execute <cmc/> element
|
||||||
|
bool executeCMCSection(xmlNodePtr cur);
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue