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:
Jeongnim Kim 2013-08-05 13:29:46 +00:00
parent 014362d7e3
commit a254b87a2b
6 changed files with 185 additions and 63 deletions

View File

@ -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})

109
src/QMCApp/CoupledMC.cpp Normal file
View File

@ -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 $
***************************************************************************/

View File

@ -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));

View File

@ -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
* *

View File

@ -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

View File

@ -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