bool WaveFunctionFactory::build(xmlNodePtr cur, bool buildtree) {

    if(cur == NULL) return false;

    bool attach2Node=false;
    if(buildtree) {
      if(myNode == NULL) {
        myNode = xmlCopyNode(cur,1);
      } else {
        attach2Node=true;
      }
    }


    if(targetPsi==0) {//allocate targetPsi and set the name
      targetPsi  = new TrialWaveFunction;
      targetPsi->setName(myName);
      app_log() << "  Creating a trial wavefunction " << myName << endl;
    }

    cur = cur->children;
    bool success=true;
    while(cur != NULL) {
      string cname((const char*)(cur->name));
      if (cname == OrbitalBuilderBase::detset_tag) 
      {
        success = addFermionTerm(cur);
      } 
      else if (cname ==  OrbitalBuilderBase::jastrow_tag) 
      {
        OrbitalBuilderBase *jbuilder = new JastrowBuilder(*targetPtcl,*targetPsi,ptclPool);
        success = jbuilder->put(cur);
        addNode(jbuilder,cur);
      }
      else if(cname == "agp") 
      {
#if defined(QMC_COMPLEX)
        app_error() << "  AGPDeterminant cannot be used with QMC_COMPLEX=1" << endl;
        return false;
#else
        AGPDeterminantBuilder* agpbuilder = new AGPDeterminantBuilder(*targetPtcl,*targetPsi,ptclPool);
        success = agpbuilder->put(cur);
        addNode(agpbuilder,cur);
#endif
      } 
      if(attach2Node) xmlAddChild(myNode,xmlCopyNode(cur,1));
      cur = cur->next;
    }

    if(OrbitalBuilderBase::print_level>0)
    {
      app_log() << "  List of optimizable variables " << endl;
      targetPsi->VarList.print(app_log());

      //set to zero so that nothing is written again
      OrbitalBuilderBase::print_level=0;
    }

    return success;
  }
示例#2
0
  bool JastrowBuilder::addOneBody(xmlNodePtr cur) 
  {
    app_log() << "  JastrowBuilder::addOneBody "<< endl;

    if(sourceOpt == targetPtcl.getName()) 
    {
      app_warning() << "  One-Body Jastrow Function needs a source different from " << targetPtcl.getName() << endl;
      app_warning() << "  Exit JastrowBuilder::addOneBody." << endl;
      return false;
    }

    map<string,ParticleSet*>::iterator pa_it(ptclPool.find(sourceOpt));
    if(pa_it == ptclPool.end()) {
      app_warning() << "  JastrowBuilder::addOneBody failed. " << sourceOpt << " does not exist" << endl;
      return false;
    }

    ParticleSet* sourcePtcl= (*pa_it).second;
    if(funcOpt == "any" || funcOpt == "poly")
    {
      OrbitalConstraintsBase* control=0;
      if(funcOpt == "any")
        control = new AnyConstraints(targetPtcl,targetPsi);
      else
        control = new PolyConstraints(targetPtcl,targetPsi,true);
      control->put(cur);
      OrbitalBase* j=control->createOneBody(*sourcePtcl);
      if(j)
      {
        control->addOptimizables(targetPsi.VarList);
        targetPsi.addOrbital(j);
        Children.push_back(control);
        return true;
      }
      else
      {
        delete control;
        return false;
      }
    }
    else
    {
      app_log() << "\n  Using JABBuilder for one-body jatrow with analytic functions" << endl;
      OrbitalBuilderBase* jb = new JABBuilder(targetPtcl,targetPsi,ptclPool);
      Children.push_back(jb);
      return jb->put(cur);
    }
  }
示例#3
0
bool WaveFunctionFactory::build(xmlNodePtr cur, bool buildtree) {

    ReportEngine PRE(ClassName,"build");

    if(cur == NULL) return false;

    bool attach2Node=false;
    if(buildtree) {
        if(myNode == NULL) {
            myNode = xmlCopyNode(cur,1);
        } else {
            attach2Node=true;
        }
    }

    if(targetPsi==0) //allocate targetPsi and set the name
    {
        targetPsi  = new TrialWaveFunction(myComm);
        targetPsi->setName(myName);
    }

    cur = cur->children;
    bool success=true;
    while(cur != NULL)
    {
        string cname((const char*)(cur->name));
        if (cname == OrbitalBuilderBase::detset_tag)
        {
            success = addFermionTerm(cur);
        }
        else if (cname ==  OrbitalBuilderBase::jastrow_tag)
        {
            OrbitalBuilderBase *jbuilder = new JastrowBuilder(*targetPtcl,*targetPsi,ptclPool);
            jbuilder->setReportLevel(ReportLevel);
            success = jbuilder->put(cur);
            addNode(jbuilder,cur);
        }
#if OHMMS_DIM==3
        else if(cname == "agp")
        {
#if defined(QMC_COMPLEX)
            sendError("AGPDeterminant cannot be used with QMC_COMPLEX=1");
            return false;
#else
            AGPDeterminantBuilder* agpbuilder = new AGPDeterminantBuilder(*targetPtcl,*targetPsi,ptclPool);
            success = agpbuilder->put(cur);
            addNode(agpbuilder,cur);
#endif
        }
#endif
        if(attach2Node) xmlAddChild(myNode,xmlCopyNode(cur,1));
        cur = cur->next;
    }

    //{
    //  ReportEngine PREA("TrialWaveFunction","print");
    //  targetPsi->VarList.print(app_log());
    //}

    return success;
}