示例#1
0
int main() {
  cout << textio::splash();
  InputMap mcp("cigars2fibrils.json");
  FormatMXYZ mxyz;
  EnergyDrift sys;

  // Energy functions and space
  Tspace spc(mcp);
  Energy::NonbondedVector<Tspace,Tpairpot> pot(mcp);

  // Markov moves and analysis
  Move::Propagator<Tspace> mv( mcp, pot, spc );

  sys.init( Energy::systemEnergy( spc,pot,spc.p ) );

  cout << atom.info() + spc.info() + pot.info() + textio::header("MC Simulation Begins!");

  MCLoop loop( mcp );
  mxyz.save( "cigars2fibrils-mov", spc.p, spc.geo.len, loop.innerCount() );

  while ( loop[0] ) {  // Markov chain 
    while ( loop[1] )
      sys += mv.move();

    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current

    cout << loop.timing();

    mxyz.save( "cigars2fibrils-mov", spc.p, spc.geo.len, loop.innerCount() );
  } // end of macro loop

  // print information about simulationat the end
  cout << loop.info() + sys.info() + mv.info();
}
示例#2
0
int main() {

  InputMap mcp( "gcmol.json" );

  Tspace spc( mcp );
  spc.load( "state", Tspace::RESIZE );

  auto pot = Energy::Nonbonded<Tspace,Tpairpot>(mcp);
  Move::Propagator<Tspace> mv( mcp, pot, spc );

  EnergyDrift sys;
  sys.init( Energy::systemEnergy( spc,pot,spc.p ) );

  cout << atom.info() << pot.info() << textio::header( "MC Simulation Begins!" );

  MCLoop loop( mcp );
  while ( loop[0] ) {
    while ( loop[1] )
      sys += mv.move();
    cout << loop.timing();
  }

  sys.checkDrift( Energy::systemEnergy( spc,pot,spc.p ) );
  spc.save("state");
  FormatPQR::save("confout.pqr", spc.p, spc.geo.len);

  UnitTest test( mcp );
  sys.test( test );
  mv.test( test );

  cout << loop.info() << sys.info() << spc.info() << mv.info() << test.info() << endl;

  return test.numFailed();
}
示例#3
0
int main() {
  cout << textio::splash();                 // show faunus banner and credits
  //InputMap mcp("cigars2fibrils.input");     // open user input file
  InputMap mcp("psc-nvt.input");
  MCLoop loop(mcp);                         // class for handling mc loops
  FormatMXYZ mxyz;                          // MXYZ structure file I/O
  EnergyDrift sys;                         // class for tracking system energy drifts

    
  // Energy functions and space
  Tspace spc(mcp);
  auto pot = Energy::NonbondedVector<Tspace,Tpairpot>(mcp);

  // Markov moves and analysis
  Move::AtomicTranslation<Tspace> mv(mcp, pot, spc);
  Move::AtomicRotation<Tspace> rot(mcp, pot, spc);

  cout <<"before adding cigars";

  // Add cigars
  Group cigars;
  cigars.addParticles(spc, mcp);
  cigars.name="PSC";
  for (auto i : cigars) {
    spc.p[i].dir.ranunit(slump);
    spc.p[i].patchdir.ranunit(slump);
    Geometry::cigar_initialize(spc.geo, spc.p[i]);
    spc.trial[i]=spc.p[i];
  }
  sys.init( Energy::systemEnergy(spc,pot,spc.p)  );      // store initial total system energy

  cout << atom.info() << spc.info() << pot.info() << textio::header("MC Simulation Begins!");

  mxyz.save("cigars2fibrils-mov", spc.p, spc.geo.len, loop.count());
  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int i= slump.rand() % 2;
      switch (i) {
        case 0:
          mv.setGroup(cigars);
          sys+=mv.move( cigars.size() );  // translate cigars
          break;
        case 1:
          rot.setGroup(cigars);
          sys+=rot.move( cigars.size() ); // translate cigars
          break;
      }
    } // end of micro loop
  sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current

  cout << loop.timing();

  mxyz.save("cigars2fibrils-mov", spc.p, spc.geo.len, loop.count());
  } // end of macro loop

  // print information
  cout << loop.info() << sys.info() << mv.info() << rot.info();
}
示例#4
0
int main() {
    ::atom.includefile("stockmayer.json");         // load atom properties
    InputMap in("stockmayer.input");               // open parameter file for user input
    Energy::NonbondedVector<Tspace,Tpair> pot(in); // non-bonded only
    EnergyDrift sys;                               // class for tracking system energy drifts
    Tspace spc(in);                // create simulation space, particles etc.
    Group sol;
    sol.addParticles(spc, in);                     // group for particles
    MCLoop loop(in);                               // class for mc loop counting
    Analysis::RadialDistribution<> rdf(0.05);       // particle-particle g(r)
    Analysis::Table2D<double,Average<double> > mucorr(0.1);       // particle-particle g(r)
    TmoveTran trans(in,pot,spc);
    TmoveRot rot(in,pot,spc);
    trans.setGroup(sol);                                // tells move class to act on sol group
    rot.setGroup(sol);                                  // tells move class to act on sol group
    spc.load("state");
    spc.p = spc.trial;
    UnitTest test(in);               // class for unit testing
    FormatXTC xtc(spc.geo.len.norm());

    sys.init( Energy::systemEnergy(spc,pot,spc.p)  );   // initial energy
    while ( loop.macroCnt() ) {                         // Markov chain
        while ( loop.microCnt() ) {
            if (slp_global() > 0.5)
                sys+=trans.move( sol.size() );                // translate
            else
                sys+=rot.move( sol.size() );                  // rotate

            if (slp_global()<1.5)
                for (auto i=sol.front(); i<sol.back(); i++) { // salt rdf
                    for (auto j=i+1; j<=sol.back(); j++) {
                        double r =spc.geo.dist(spc.p[i],spc.p[j]);
                        rdf(r)++;
                        mucorr(r) += spc.p[i].mu.dot(spc.p[j].mu);
                    }
                }
            if (slp_global()>0.99)
                xtc.save(textio::prefix+"out.xtc", spc.p);
        }
        sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current
        cout << loop.timing();
    }

    // perform unit tests
    trans.test(test);
    rot.test(test);
    sys.test(test);

    FormatPQR().save("confout.pqr", spc.p);
    rdf.save("gofr.dat");                               // save g(r) to disk
    mucorr.save("mucorr.dat");                               // save g(r) to disk
    std::cout << spc.info() + pot.info() + trans.info()
              + rot.info() + sys.info() + test.info(); // final info
    spc.save("state");

    return test.numFailed();
}
示例#5
0
int main() {
  InputMap mcp("grand.input");                  // open user input file
  Tspace spc(mcp);                              // simulation space
  Energy::Nonbonded<Tspace,CoulombHS> pot(mcp); // hamiltonian
  pot.setSpace(spc);                            // share space w. hamiltonian

  Group salt;                                   // group for salt particles
  salt.addParticles(spc, mcp);
  spc.load("state",Tspace::RESIZE);             // load old config. from disk (if any)

  // Two different Widom analysis methods
  double lB = Coulomb(mcp).bjerrumLength();     // get bjerrum length
  Analysis::Widom<PointParticle> widom1;        // widom analysis (I)
  Analysis::WidomScaled<Tspace> widom2(lB,1);   // ...and (II)
  widom1.add(spc.p);
  widom2.add(spc.p);

  Move::GrandCanonicalSalt<Tspace> gc(mcp,pot,spc,salt);
  Move::AtomicTranslation<Tspace> mv(mcp,pot,spc);
  mv.setGroup(salt);

  EnergyDrift sys;                              // class for tracking system energy drifts
  sys.init(Energy::systemEnergy(spc,pot,spc.p));// store initial total system energy

  cout << atom.info() + spc.info() + pot.info() + "\n";

  MCLoop loop(mcp);                             // class for handling mc loops
  while ( loop[0] ) {
    while ( loop[1] ) {
      if (slp_global() < 0.5)
        sys+=mv.move( salt.size() );            // translate salt
      else 
        sys+=gc.move();                         // grand canonical exchange
      widom1.sample(spc,pot,1);
      widom2.sample(spc.p,spc.geo);
    }                                           // end of micro loop
    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // calc. energy drift
    cout << loop.timing();
  }                                             // end of macro loop

  FormatPQR::save("confout.pqr", spc.p);        // PQR snapshot for VMD etc.
  spc.save("state");                            // final simulation state

  UnitTest test(mcp);                           // class for unit testing
  gc.test(test);
  mv.test(test);
  sys.test(test);
  widom1.test(test);

  cout << loop.info() + sys.info() + mv.info() + gc.info() + test.info()
    + widom1.info() + widom2.info();

  return test.numFailed();
}
示例#6
0
int main() {
  ::atom.includefile("stockmayer.json");         // load atom properties
  InputMap in("stockmayer.input");               // open parameter file for user input
  Energy::NonbondedVector<Tpair,Tgeo> pot(in);   // create Hamiltonian, non-bonded only
  EnergyDrift sys;                               // class for tracking system energy drifts
  Space spc( pot.getGeometry() );                // create simulation space, particles etc.
  GroupAtomic sol(spc, in);                      // group for particles
  MCLoop loop(in);                               // class for mc loop counting
  Analysis::RadialDistribution<> rdf(0.05);       // particle-particle g(r)
  Analysis::Table2D<double,Average<double> > mucorr(0.05);       // particle-particle g(r)

  Move::AtomicTranslation trans(in, pot, spc);   // particle move class
  Move::AtomicRotation rot(in, pot, spc);        // particle move class
  //PolarizeMove<AtomicTranslation> trans(in,pot,spc);
  //PolarizeMove<AtomicRotation> rot(in,pot,spc);
  trans.setGroup(sol);                                // tells move class to act on sol group
  rot.setGroup(sol);                                  // tells move class to act on sol group
  //spc.load("state_ST");


  double limit = 1e-6;
  Point ExternalField(0,0,0);

  sys.init( Energy::systemEnergy(spc,pot,spc.p)  );      // store initial total system energy
  while ( loop.macroCnt() ) {                         // Markov chain 
    while ( loop.microCnt() ) {
      if (slp_global() > 0.5)
        sys+=trans.move( sol.size() );                     // translate
      else
        sys+=rot.move( sol.size() );                       // rotate

      if (slp_global()<0.5)
        for (auto i=sol.front(); i<sol.back(); i++) { // salt radial distribution function
          for (auto j=i+1; j<=sol.back(); j++) {
            double r =pot.geometry.dist(spc.p[i],spc.p[j]); 
            rdf(r)++;
            mucorr(r) += spc.p[i].mu.dot(spc.p[j].mu)/(spc.p[i].muscalar*spc.p[j].muscalar);
          }
        }
    }

    cout << "Eps: " << getDielectricConstant(pot,spc,in.get<double>("dipdip_cutoff",pc::infty)) << "\n";
    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current
    cout << loop.timing();
  }

  FormatPQR().save("confout.pqr", spc.p);
  rdf.save("gofr.dat");                               // save g(r) to disk
  mucorr.save("mucorr.dat");                               // save g(r) to disk
  std::cout << spc.info() + pot.info() + trans.info() + rot.info() + sys.info(); // final info
  spc.save("state_ST");
}
示例#7
0
int main() {
  //::atom.includefile("stockmayer.json");         // load atom properties
  InputMap in("stockmayer.input");               // open parameter file for user input
  Energy::NonbondedVector<Tspace,Tpair> pot(in); // non-bonded only
  EnergyDrift sys;                               // class for tracking system energy drifts
  Tspace spc(in);                // create simulation space, particles etc.
  Group sol;
  sol.addParticles(spc, in);                     // group for particles
  MCLoop loop(in);                               // class for mc loop counting
  TmoveTran trans(in,pot,spc);
  TmoveRot rot(in,pot,spc);
  trans.setGroup(sol);                                // tells move class to act on sol group
  rot.setGroup(sol);                                  // tells move class to act on sol group
  spc.load("state");
  spc.trial = spc.p;
  UnitTest test(in);               // class for unit testing
  Analysis::DipoleAnalysis dian(spc,in);
  DipoleWRL sdp;
  FormatXTC xtc(spc.geo.len.norm());
  sys.init( Energy::systemEnergy(spc,pot,spc.p)  );   // initial energy
  while ( loop[0] ) {                         // Markov chain 
    while ( loop[1] ) {
      if (slp_global() > 0.5)
        sys+=trans.move( sol.size() );                // translate
      else
        sys+=rot.move( sol.size() );                  // rotate

      if (slp_global()<0.5)
        dian.sampleMuCorrelationAndKirkwood(spc);
      if (slp_global()>0.99)
        xtc.save(textio::prefix+"out.xtc", spc.p);  
      dian.sampleDP(spc);
    }    
    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current
    cout << loop.timing() << std::flush;
  }

  // perform unit tests
  trans.test(test);
  rot.test(test);
  sys.test(test);
  sdp.saveDipoleWRL("stockmayer.wrl",spc,sol);
  FormatPQR().save("confout.pqr", spc.p);
  std::cout << spc.info() + pot.info() + trans.info()
    + rot.info() + sys.info() + test.info() + dian.info(); // final info
  dian.save();
  spc.save("state");

  return test.numFailed();
}
示例#8
0
int main() {
  cout << textio::splash();            // faunus splash info!
  ::atom.includefile("titrate.json");  // load atom properties
  InputMap mcp("titrate.input");
  EnergyDrift sys;                     // track system energy drift
  UnitTest test(mcp);

  // Space and hamiltonian
  Tspace spc(mcp);
  auto pot = Energy::Nonbonded<Tspace,Potential::DebyeHuckel>(mcp)
    + Energy::EquilibriumEnergy<Tspace>(mcp);

  // Add molecule to middle of simulation container
  string file = mcp.get<string>("molecule", string());
  Tspace::ParticleVector v;
  FormatAAM::load(file,v);
  Geometry::cm2origo(spc.geo,v); // center molecule
  Group g = spc.insert(v);       // insert into space
  g.name="peptide"; // babtise
  spc.enroll(g);    // enroll group in space

  spc.load("state");

  Move::SwapMove<Tspace> tit(mcp,pot,spc,pot.second);
  Analysis::ChargeMultipole mp;

  sys.init( Energy::systemEnergy(spc,pot,spc.p) );

  cout << atom.info() + spc.info() + pot.info() + tit.info()
    + textio::header("MC Simulation Begins!");

  MCLoop loop(mcp);            // class for handling mc loops
  while ( loop[0] ) {  // Markov chain 
    while ( loop[1] ) {
      sys+=tit.move();
      mp.sample(g,spc);
    } // end of micro loop

    sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) );
    cout << loop.timing();

  } // end of macro loop

  cout << loop.info() + sys.info() + tit.info() + g.info() + mp.info();

  FormatPQR().save("confout.pqr", spc.p);
  spc.save("state");
}
示例#9
0
int main() {
  InputMap mcp("grand.json");                   // open user input file
  Tspace spc(mcp);                              // simulation space
  Energy::Nonbonded<Tspace,CoulombHS> pot(mcp); // hamiltonian
  pot.setSpace(spc);                            // share space w. hamiltonian

  spc.load("state",Tspace::RESIZE);             // load old config. from disk (if any)

  // Two different Widom analysis methods
  double lB = pot.pairpot.first.bjerrumLength();// get bjerrum length
  Analysis::Widom<PointParticle> widom1;        // widom analysis (I)
  Analysis::WidomScaled<Tspace> widom2(lB,1);   // ...and (II)
  widom1.add(spc.p);
  widom2.add(spc.p);

  Move::Propagator<Tspace> mv(mcp,pot,spc);

  EnergyDrift sys;                              // class for tracking system energy drifts
  sys.init(Energy::systemEnergy(spc,pot,spc.p));// store initial total system energy

  cout << atom.info() + spc.info() + pot.info() + "\n";

  MCLoop loop(mcp);                             // class for handling mc loops
  while ( loop[0] ) {
    while ( loop[1] ) {
      sys+=mv.move();                           // move!
      widom1.sample(spc,pot,1);
      widom2.sample(spc.p,spc.geo);
    }                                           // end of micro loop
    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // calc. energy drift
    cout << loop.timing();
  }                                             // end of macro loop

  FormatPQR::save("confout.pqr", spc.p);        // PQR snapshot for VMD etc.
  spc.save("state");                            // final simulation state

  UnitTest test(mcp);                           // class for unit testing
  mv.test(test);
  sys.test(test);
  widom1.test(test);

  cout << loop.info() + sys.info() + mv.info() + test.info()
    + widom1.info() + widom2.info();

  return test.numFailed();
}
示例#10
0
int main() {
  
  InputMap mcp("gcmol.input");     // open user input file
  MCLoop loop(mcp);                   // class for handling mc loops
  EnergyDrift sys;                    // class for tracking system energy drifts
  UnitTest test(mcp);

  // Create Space and a Hamiltonian with three terms
  Tspace spc(mcp);
  auto pot = Energy::Nonbonded<Tspace,Tpairpot>(mcp);

  //    ADD CONFIGURATIONS FOR POOL INSERTS
  string file = mcp.get<string>("polymer_file", "");
  p_vec conf;
  FormatAAM::load(file,conf);
  molecule.pushConfiguration("polymer", conf);   // p_vec is one molecule large
  molecule.pushConfiguration("polymer2",conf);

  // Markov moves and analysis
  Move::GCMolecular<Tspace> gc(mcp, pot, spc);

  sys.init( Energy::systemEnergy(spc,pot,spc.p)  );      // store initial total system energy

  cout << atom.info() << molecule.info() << gc.info() << spc.info() << pot.info() << textio::header("MC Simulation Begins!");

  while ( loop[0] ) {  // Markov chain
    while ( loop[1] ) {
      sys+=gc.move();
    }
    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current
    cout << loop.timing();
  } // end of macro loop

  sys.test(test);
  gc.test(test);

  // print information
  cout << loop.info() << sys.info() << gc.info() << spc.info() <<test.info() << endl;

  // clean allocated memory
  spc.freeGroups();

  return test.numFailed();
}
示例#11
0
int main() {

  cout << textio::splash();      // show faunus banner and credits
  InputMap mcp("membrane.json"); //read input file

  FormatXTC xtc(1000);
  EnergyDrift sys;               // class for tracking system energy drifts

  // Energy functions and space
  auto pot = Energy::NonbondedCutg2g<Tspace,Tpairpot>(mcp)
    + Energy::Bonded<Tspace>()
    + Energy::ExternalPressure<Tspace>(mcp)
    + Energy::EquilibriumEnergy<Tspace>(mcp);

  auto nonbonded = std::get<0>( pot.tuple() );
  auto bonded    = std::get<1>( pot.tuple() );

  nonbonded->noPairPotentialCutoff=true;
  Tspace spc(mcp);

  auto lipids = spc.findMolecules("lipid");

  Group allLipids( lipids.front()->front(), lipids.back()->back() );
  allLipids.setMolSize(3);
  MakeDesernoMembrane(allLipids, *bonded, nonbonded->pairpot, mcp);

  // Place all lipids in xy plane (z=0);
  for ( auto g : lipids ) {
    double dz = spc.p[ g->back() ].z();
    for (auto i : *g) {
      spc.p[i].z() -= dz;
      spc.geo.boundary( spc.p[i] );
    }
    g->setMassCenters( spc );
  }
  spc.trial=spc.p;   // sync. particle trial vector
  spc.load("state"); // load old config. from disk (if any)

  // Markov moves and analysis
  Move::Propagator<Tspace> mv(mcp, pot, spc);
  Analysis::BilayerStructure lipidstruct;
  Analysis::VirialPressure<Tspace> virial(mcp, pot, spc);

  sys.init( Energy::systemEnergy(spc,pot,spc.p)  ); // store total energy

  cout << atom.info() + spc.info() + pot.info();

  MCLoop loop(mcp);                      // class for handling mc loops
  while ( loop[0] ) {                    // Markov chain 
    while ( loop[1] ) {
      sys += mv.move();
      double ran = slump();
      if ( ran > 0.99 ) {
        xtc.setbox( spc.geo.len );
        xtc.save("traj.xtc", spc.p);
      }
      if ( ran > 0.90 ) {
        virial.sample();
        lipidstruct.sample(spc.geo, spc.p, allLipids);
      }

    } // end of micro loop

    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // energy drift?

    // save to disk
    FormatPQR::save("confout.pqr", spc.p);
    spc.save("state");

    cout << loop.timing();
  } // end of macro loop

  // perform unit tests
  UnitTest test(mcp);
  mv.test(test);
  sys.test(test);
  lipidstruct.test(test);

  cout << loop.info() + mv.info()
    + lipidstruct.info() + sys.info() + virial.info() + test.info();

  return test.numFailed();
}
示例#12
0
int main(int argc, char** argv) {
    InputMap mcp("cyl.input");
    MCLoop loop(mcp);                    // class for handling mc loops
    FormatXTC xtc(1000);                 // XTC gromacs trajectory format
    EnergyDrift sys;                     // class for tracking system energy drifts
    UnitTest test(mcp);

    bool movie = mcp.get("movie", true);

    Tspace spc(mcp);
    auto pot = Energy::Nonbonded<Tspace,Tpairpot>(mcp)
               + Energy::ExternalPressure<Tspace>(mcp)
               + Energy::HydrophobicSASA<Tspace>(mcp)
               + Energy::EquilibriumEnergy<Tspace>(mcp);

    auto eqenergy = &pot.second;

    // set hydrophobic-hydrophobic LJ epsilon
    double epsh = mcp.get("eps_hydrophobic", 0.05);
    for (size_t i=0; i<atom.size()-1; i++)
        for (size_t j=i+1; j<atom.size(); j++)
            if (atom[i].hydrophobic)
                if (atom[j].hydrophobic)
                    pot.first.first.first.pairpot.second.customEpsilon(i,j,epsh);

    // Add molecules
    int N1 = mcp.get("molecule1_N",0);
    int N2 = mcp.get("molecule2_N",0);
    bool inPlane = mcp.get("molecule_plane", false);
    string file;
    vector<Group> pol(N1+N2);
    for (int i=0; i<N1+N2; i++) {
        if (i>=N1)
            file = mcp.get<string>("molecule2");
        else
            file = mcp.get<string>("molecule1");
        Tspace::ParticleVector v;

        // PQR or AAM molecular file format?
        if (file.find(".pqr")!=std::string::npos)
            FormatPQR::load(file,v);
        else
            FormatAAM::load(file,v);

        Geometry::FindSpace fs;
        if (inPlane)
            fs.dir=Point(0,0,1);
        fs.find(spc.geo,spc.p,v);
        pol[i] = spc.insert(v);
        pol[i].name=file+std::to_string(i);
        spc.enroll( pol[i] );
    }
    Group allpol( pol.front().front(), pol.back().back() );

    // Add atomic species
    Group salt;
    salt.addParticles(spc, mcp);
    salt.name="Atomic Species";
    spc.enroll(salt);

    Analysis::LineDistribution<> rdf(0.5);
    Analysis::ChargeMultipole mpol;
    Analysis::MultipoleDistribution<Tspace> mpoldist(mcp);
    FormatQtraj qtrj("qtrj.dat");

    spc.load("state");

    Move::Isobaric<Tspace> iso(mcp,pot,spc);
    Move::TranslateRotate<Tspace> gmv(mcp,pot,spc);
    Move::AtomicTranslation<Tspace> mv(mcp, pot, spc);
    Move::SwapMove<Tspace> tit(mcp,pot,spc,*eqenergy);
    if (inPlane)
        for (auto &m : pol)
            gmv.directions[ m.name ]=Point(0,0,1);

    eqenergy->eq.findSites(spc.p);

    sys.init( Energy::systemEnergy(spc,pot,spc.p) );    // Store total system energy

    cout << atom.info() << spc.info() << pot.info() << tit.info()
         << textio::header("MC Simulation Begins!");

    while ( loop.macroCnt() ) {  // Markov chain
        while ( loop.microCnt() ) {
            int k,i=rand() % 2;
            switch (i) {
            case 0:
                k=pol.size();
                while (k-->0) {
                    gmv.setGroup( pol[ rand() % pol.size() ] );
                    sys+=gmv.move();
                }
                for (auto i=pol.begin(); i!=pol.end()-1; i++)
                    for (auto j=i+1; j!=pol.end(); j++)
                        rdf( spc.geo.dist(i->cm,j->cm) )++;
                break;
            case 1:
                sys+=tit.move();
                break;
            case 2:
                sys+=iso.move();
                break;
            case 3:
                mv.setGroup(salt);
                sys+=mv.move();
                break;
            }

            double xi = slp_global(); // random number [0,1)

            // Sample multipolar moments and distribution
            if ( xi>0.95 ) {
                pol[0].setMassCenter(spc);
                pol[1].setMassCenter(spc);
                mpol.sample(pol,spc);
                mpoldist.sample(spc, pol[0], pol[1]);
            }

            if ( movie==true && xi>0.995 ) {
                xtc.setbox( 1000. );
                xtc.save("traj.xtc", spc.p);
                qtrj.save(spc.p);
            }
        } // end of micro loop

        sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) ); // detect energy drift
        cout << loop.timing();

        spc.save("state");
        mcp.save("mdout.mdp");
        rdf.save("rdf_p2p.dat");
        mpoldist.save("multipole.dat");
        FormatPQR::save("confout.pqr", spc.p);

    } // end of macro loop

    cout << loop.info() + sys.info() + gmv.info() + mv.info()
         + iso.info() + tit.info() + mpol.info();

}
示例#13
0
文件: tabtest.cpp 项目: hax3l/faunus
int main(int argc, char** argv) {
  cout << textio::splash();
  InputMap mcp("cluster.input");
  MCLoop loop(mcp);                    // class for handling mc loops
  FormatPQR pqr;                       // PQR structure file I/O
  FormatAAM aam;                       // AAM structure file I/O
  FormatXTC xtc(1000);                 // XTC gromacs trajectory format
  EnergyDrift sys;                     // class for tracking system energy drifts
  UnitTest test(mcp);

  Energy::Hamiltonian pot;
#ifdef tab
  Energy::Nonbonded<Potential::PotentialMapTabulated<Tpairpot,Tabulate::tabulator<double>>,Tgeometry> nb(mcp); // Tabulation
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
#ifdef tablin
  Energy::Nonbonded<Potential::PotentialMapTabulated<Tpairpot,Tabulate::tabulatorlin<double>>,Tgeometry> nb(mcp); // Tabulation
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
#ifdef tabherm
  Energy::Nonbonded<Potential::PotentialMapTabulated<Tpairpot,Tabulate::tabulatorherm<double>>,Tgeometry> nb(mcp); // Tabulation
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
#ifdef tabopt
  Energy::Nonbonded<Potential::PotentialVecTabulated<Tpairpot,Tabulate::tabulator<double>>,Tgeometry> nb(mcp); // Tabulation optimized
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
#ifdef taboptlin
  Energy::Nonbonded<Potential::PotentialVecTabulated<Tpairpot,Tabulate::tabulatorlin<double>>,Tgeometry> nb(mcp); // Tabulation optimized
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
#ifdef taboptherm
  Energy::Nonbonded<Potential::PotentialVecTabulated<Tpairpot,Tabulate::tabulatorherm<double>>,Tgeometry> nb(mcp); // Tabulation optimized
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
#ifdef org
  Energy::Nonbonded<Potential::PotentialMap<Tpairpot>,Tgeometry> nb(mcp); //  Non-tabulation
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
#ifdef orgopt
  Energy::Nonbonded<Potential::PotentialVec<Tpairpot>,Tgeometry> nb(mcp); //  Non-tabulation
  nb.pairpot.add(atom["Ca"].id,atom["Ca"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Ca"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Na"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Na"].id,atom["Cl"].id,Tpairpot(mcp));
  nb.pairpot.add(atom["Cl"].id,atom["Cl"].id,Tpairpot(mcp));
  auto nonbonded = pot.create(nb);
#endif
  

#ifdef tabsingle
  auto nonbonded = pot.create( Energy::Nonbonded<Potential::PotentialTabulate<Tpairpot>,Tgeometry>(mcp) );
#endif 
#ifdef taboptsingle
  auto nonbonded = pot.create( Energy::Nonbonded<Potential::PotentialTabulateVec<Tpairpot>,Tgeometry>(mcp) );
#endif 
#ifdef orgsingle
  auto nonbonded = pot.create( Energy::Nonbonded<Tpairpot,Tgeometry>(mcp) );
#endif 
  
  //nb.pairpot.print_tabulation(); // Print files to compare tabulation with real potential
  
  
  Space spc( pot.getGeometry() );

  // Add salt
  GroupAtomic salt(spc, mcp);
  salt.name="Salt";
  spc.enroll(salt);

  spc.load("state");

  Move::AtomicTranslation mv(mcp, pot, spc);
  mv.setGroup(salt);   // specify atomic particles to be moved

  short na = atom["Na"].id;
  short ca = atom["Ca"].id;
  short cl = atom["Cl"].id;
  
  Analysis::RadialDistribution<float,unsigned int> rdf1(0.2); // 0.2 Å resolution
  Analysis::RadialDistribution<float,unsigned int> rdf2(0.2); // 0.2 Å resolution

  
  
  sys.init( Energy::systemEnergy(spc,pot,spc.p) );

  cout << atom.info() << spc.info() << pot.info() << textio::header("MC Simulation Begins!");
  
  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      xtc.save("out.xtc", spc.p);
      int i=rand() % 1;
      switch (i) {
        case 0:
          mv.setGroup(salt);
          sys+=mv.move( salt.size()/2+1 );
          break;
      }
      if (slp_global() > 0.9) {
        rdf1.sample( spc, salt, na, cl );
        rdf2.sample( spc, salt, ca, cl );
      }
    } // end of micro loop

    sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) );
    spc.save("state");
    cout << loop.timing();
  } // end of macro loop
  
#ifdef tab
  rdf1.save("naclrdf_tab.dat");
  rdf2.save("caclrdf_tab.dat");
#endif
#ifdef tabopt
  rdf1.save("naclrdf_tabopt.dat");
  rdf2.save("caclrdf_tabopt.dat");
#endif
#ifdef org
  rdf1.save("naclrdf_notab.dat");
  rdf2.save("caclrdf_notab.dat");
#endif

  pqr.save("confout.pqr", spc.p);

  cout << loop.info() << spc.info() << sys.info() << mv.info();
}
示例#14
0
int main(int argc, char** argv) {
  InputMap mcp("cyl.input");
  MCLoop loop(mcp);                    // class for handling mc loops
  FormatXTC xtc(1000);                 // XTC gromacs trajectory format
  EnergyDrift sys;                     // class for tracking system energy drifts
  UnitTest test(mcp);
  bool inPlane = mcp.get<bool>("molecule_plane");

  Tspace spc(mcp);
  auto pot = Energy::Nonbonded<Tspace,Tpairpot>(mcp)
    + Energy::MassCenterConstrain<Tspace>(mcp) 
    + Energy::EquilibriumEnergy<Tspace>(mcp);

  auto constrainenergy = &pot.first.second;
  auto eqenergy = &pot.second;

  // Add molecules
  int N1 = mcp.get("molecule1_N",0);
  int N2 = mcp.get("molecule2_N",0);
  string file;
  vector<Group> pol(N1+N2);
  for (int i=0; i<N1+N2; i++) {
    if (i>=N1)
      file = mcp.get<string>("molecule2");
    else
      file = mcp.get<string>("molecule1");
    Tspace::ParticleVector v;
    FormatAAM::load(file,v);
    Geometry::FindSpace fs;
    if (inPlane)
      fs.dir=Point(0,0,1);
    fs.find(spc.geo,spc.p,v);
    pol[i] = spc.insert(v);
    pol[i].name=file+std::to_string(i);
    spc.enroll( pol[i] );
  }
  Group allpol( pol.front().front(), pol.back().back() );

  constrainenergy->addPair(pol[0], pol[1]);

  // Add atomic species
  Group salt;
  salt.addParticles(spc, mcp);
  salt.name="Atomic Species";
  spc.enroll(salt);

  Analysis::LineDistribution<> rdf(0.5);
  Analysis::ChargeMultipole mpol;

  spc.load("state");

  Move::Isobaric<Tspace> iso(mcp,pot,spc);
  Move::TranslateRotate<Tspace> gmv(mcp,pot,spc);
  Move::AtomicTranslation<Tspace> mv(mcp, pot, spc);
  Move::SwapMove<Tspace> tit(mcp,pot,spc,*eqenergy);
  if (inPlane)
    for (auto &m : pol)
      gmv.directions[ m.name ]=Point(0,0,1);

  eqenergy->eq.findSites(spc.p);

  sys.init( Energy::systemEnergy(spc,pot,spc.p) );    // Store total system energy

  cout << atom.info() << spc.info() << pot.info() << tit.info()
    << textio::header("MC Simulation Begins!");

  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int k,i=rand() % 2;
      switch (i) {
        case 0:
          k=pol.size();
          while (k-->0) {
            gmv.setGroup( pol[ rand() % pol.size() ] );
            sys+=gmv.move();
          }
          for (auto i=pol.begin(); i!=pol.end()-1; i++)
            for (auto j=i+1; j!=pol.end(); j++)
              rdf( spc.geo.dist(i->cm,j->cm) )++;
          break;
        case 1:
          sys+=tit.move();
          if( slp_global()>0.9 )
            mpol.sample(pol,spc);
          break;
        case 2:
          sys+=iso.move();
          break;
        case 3:
          mv.setGroup(salt);
          sys+=mv.move();
          break;
      }
      if ( slp_global()<-0.001 ) {
        xtc.setbox( 1000. );
        xtc.save("traj.xtc", spc);
      }
    } // end of micro loop

    sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) ); // detect energy drift
    cout << loop.timing();

    rdf.save("rdf_p2p_macro" + std::to_string(loop.getMacroCnt()) +".dat");
    FormatPQR::save("confout.pqr", spc.p);
    spc.save("state");
    mcp.save("mdout.mdp");

  } // end of macro loop

  cout << loop.info() + sys.info() + gmv.info() + mv.info()
    + iso.info() + tit.info() + mpol.info();
}
示例#15
0
int main() {
  
  std::vector<Coord> sasaCoords;     //vector of sasa coordinates
  std::vector<Scalar> sasaWeights;   //vector of sasa weights
  
  clock_t clk_a, clk_b, clk_sum = 0;
  
  /*
  sasaCoords.push_back(Coord(1.0,2.0,3.0));
  sasaWeights.push_back(1.0);
  
  POWERSASA::PowerSasa<Scalar,Coord> *ps = 
    new POWERSASA::PowerSasa<Scalar,Coord>(sasaCoords, sasaWeights, 1, 1, 1, 1);
  ps->calc_sasa_all();
  
  
  Scalar volume = 0.0, surf = 0.0;
  for (unsigned int i = 0; i < sasaCoords.size(); ++i)
  {
	printf("%4d sasa=%7.3lf vol=%7.3lf\n", i, (ps->getSasa())[i], (ps->getVol())[i]);
	volume += (ps->getVol())[i];
	surf += (ps->getSasa())[i];
  }
  printf("volume=%lf\n", volume);
  printf("sasa  =%lf\n", surf);

  delete ps;
  */
  cout << textio::splash();           // show faunus banner and credits
  
  InputMap mcp("polymers.input");     // open user input file
  MCLoop loop(mcp);                   // class for handling mc loops
  EnergyDrift sys;                    // class for tracking system energy drifts
  UnitTest test(mcp);                 // class for unit testing

  // Create Space and a Hamiltonian with three terms
  Tspace spc(mcp);
  auto pot = Energy::Nonbonded<Tspace,Tpairpot>(mcp)
    + Energy::SASAEnergy<Tspace>(mcp)
    + Energy::ExternalPressure<Tspace>(mcp) + Energy::Bonded<Tspace>();

  auto bonded = &pot.second; // pointer to bond energy class

  // Add salt
  Group salt;
  salt.addParticles(spc, mcp);

  // Add polymers
  vector<Group> pol( mcp.get("polymer_N",0));            // vector of polymers
  string file = mcp.get<string>("polymer_file", "");
  double req = mcp.get<double>("polymer_eqdist", 0);
  double k   = mcp.get<double>("polymer_forceconst", 0);
  for (auto &g : pol) {                                  // load polymers
    Tspace::ParticleVector v;                            // temporary, empty particle vector
    FormatAAM::load(file,v);                             // load AAM structure into v
    Geometry::FindSpace().find(spc.geo,spc.p,v);         // find empty spot in particle vector
    g = spc.insert(v);                                   // insert into space
    g.name="Polymer";
    spc.enroll(g);
    for (int i=g.front(); i<g.back(); i++)
      bonded->add(i, i+1, Potential::Harmonic(k,req));   // add bonds
  }
  Group allpol( pol.front().front(), pol.back().back() );// make group w. all polymers

  // Markov moves and analysis
  Move::Isobaric<Tspace> iso(mcp,pot,spc);
  Move::TranslateRotate<Tspace> gmv(mcp,pot,spc);
  Move::AtomicTranslation<Tspace> mv(mcp, pot, spc);
  Move::CrankShaft<Tspace> crank(mcp, pot, spc);
  Move::Pivot<Tspace> pivot(mcp, pot, spc);
  Analysis::PolymerShape shape;
  Analysis::RadialDistribution<> rdf(0.2);
  Scatter::DebyeFormula<Scatter::FormFactorUnity<>> debye(mcp);

  spc.load("state");                                     // load old config. from disk (if any)
  sys.init( Energy::systemEnergy(spc,pot,spc.p)  );      // store initial total system energy

  cout << atom.info() << spc.info() << pot.info() << textio::header("MC Simulation Begins!");

  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int k,i=slp_global.rand() % 6;
      switch (i) {
        case 0:
          mv.setGroup(salt);
          sys+=mv.move( salt.size() );  // translate salt
          break;
        case 1:
          mv.setGroup(allpol);
          sys+=mv.move( allpol.size() );// translate monomers
          for (auto &g : pol) {
            g.setMassCenter(spc);
            shape.sample(g,spc);        // sample gyration radii etc.
          }
          break;
        case 2:
          k=pol.size();
          while (k-->0) {
            gmv.setGroup( pol[ slp_global.rand() % pol.size() ] );
            sys+=gmv.move();            // translate/rotate polymers
          }
          break;
        case 3:
          sys+=iso.move();              // isobaric volume move
          break;
        case 4:
          k=pol.size();
          while (k-->0) {
            crank.setGroup( pol[ slp_global.rand() % pol.size() ] );
            sys+=crank.move();          // crank shaft move
          }
          break;
        case 5:
          k=pol.size();
          while (k-->0) {
            pivot.setGroup( pol[ slp_global.rand() % pol.size() ] );
            sys+=pivot.move();          // pivot move
          }
          break;
      }

      // polymer-polymer mass center rdf
      for (auto i=pol.begin(); i!=pol.end()-1; i++)
        for (auto j=i+1; j!=pol.end(); j++)
          rdf( spc.geo.dist(i->cm,j->cm) )++;


      // SASA
      sasaCoords.clear();
      sasaWeights.clear();

/*
      for (auto i = pol.begin(); i != pol.end(); i++) {
		sasaCoords.push_back(i->cm);
		sasaWeights.push_back(5.0);
	  }
*/

      /*
      for (auto i = allpol.begin(); i != allpol.end(); i++) {
		auto monomer = spc.p.at(*i);
		sasaCoords.push_back(monomer);
		sasaWeights.push_back(10.0);
	  }
      clk_a = clock();
      auto ps = new POWERSASA::PowerSasa<Scalar,Coord>(sasaCoords, sasaWeights, 1, 1, 1, 1);
      ps->calc_sasa_all();
      clk_b = clock();
      clk_sum += clk_b - clk_a;
      
      {
		  Scalar volume = 0.0, surf = 0.0;
		  for (unsigned int i = 0; i < sasaCoords.size(); ++i)
		  {
			volume += (ps->getVol())[i];
			surf += (ps->getSasa())[i];
		  }
		  //printf("volume=%lf\n", volume);
		  //printf("sasa  =%lf\n", surf);
	  }
      delete ps;
*/
    } // end of micro loop

    // sample scattering
    debye.sample(spc.p);

    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current
    cout << loop.timing();

  } // end of macro loop

  // save to disk
  rdf.save("rdf_p2p.dat");
  spc.save("state");
  debye.save("debye.dat");
  FormatPQR::save("confout.pqr", spc.p);

  // perform unit tests
  iso.test(test);
  gmv.test(test);
  mv.test(test);
  sys.test(test);

  // print information
  cout << loop.info() << sys.info() << mv.info() << gmv.info() << crank.info()
    << pivot.info() << iso.info() << shape.info() << test.info();

  cout << endl << endl << "SASA" << endl;
  cout << "Time " << (float) clk_sum/CLOCKS_PER_SEC << " s = " << (float) clk_sum/CLOCKS_PER_SEC/3600 << " h" << endl;
  
  cout << sasaCoords.size() << endl;

  cout << pot.first.first.second.info() ;
  
  /*
  cout << allpol.size() << endl;
  cout << allpol.info() << endl;
  cout << spc.info() << endl;
  cout << typeid(spc.p.at(34)).name() << endl;
  cout << typeid(allpol.begin()).name() << endl;
  cout << spc.findGroup(34)->info() << endl;
*/	
  
  //for (auto i = allpol.begin(); i != allpol.end(); i++) {
  //}

  return test.numFailed();
}
示例#16
0
int main() {
  cout << textio::splash();          // Spam

  InputMap mcp("slitpolymer.input"); // Open input parameter file
  MCLoop loop(mcp);                  // handle mc loops
  EnergyDrift sys;                   // track system energy drifts
  UnitTest test(mcp);                // unit testing
  Geometry::Cuboidslit geo(mcp);     // rectangular simulation box w. XY periodicity

  Energy::ExternalPotential< Potential::GouyChapman<> > pot(mcp);
  pot.setGeometry(geo);              // Pass on geometry to potential
  pot.expot.setSurfPositionZ( &geo.len_half.z() ); // Pass position of GC surface
  Space spc( pot.getGeometry() );    // Simulation space (all particles and group info)

  // Load and add polymer to Space
  FormatAAM aam;                                      // AAM structure file I/O
  string polyfile = mcp.get<string>("polymer_file", "");
  aam.load(polyfile);                                 // Load polymer structure into aam class
  Geometry::FindSpace().find(*spc.geo, spc.p, aam.particles()); // find empty spot
  GroupMolecular pol = spc.insert( aam.particles() ); // Insert into Space and return matching group
  pol.name="polymer";                                 // Give polymer arbitrary name
  spc.enroll(pol);                                    // Enroll polymer in Space

  // MC moves
  Move::TranslateRotate gmv(mcp,pot,spc);
  Move::CrankShaft crank(mcp,pot,spc);
  Move::Pivot pivot(mcp,pot,spc);
  Move::Reptation rep(mcp,pot,spc);

  Analysis::PolymerShape shape;                       // sample polymer shape
  Analysis::LineDistribution<> surfmapall;            // monomer-surface histogram
  spc.load("state");                                  // Load start configuration, if any
  sys.init( Energy::systemEnergy(spc,pot,spc.p) );    // Store total system energy

  cout << spc.info() + pot.info() + pol.info() + textio::header("MC Simulation Begins!");

  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int i=slp_global.rand() % 4;
      switch (i) {
        case 0: // translate and rotate polymer
          gmv.setGroup(pol);
          sys+=gmv.move(); 
          break;
        case 1: // pivot
          pivot.setGroup(pol);
          sys+=pivot.move();
          break;
        case 2: // crankshaft
          crank.setGroup(pol);
          sys+=crank.move();
          break;
        case 3: // reptation
          rep.setGroup(pol);
          sys+=rep.move();
          break;
      }

      double rnd = slp_global(); // [0:1[
      if (rnd<0.05)
        shape.sample(pol,spc);   // sample polymer shape - gyration radius etc.
      if (rnd<0.05)
        for (auto i : pol)
          surfmapall( pot.expot.surfDist( spc.p[i] ) )++;  // sample monomer distribution

    } // end of micro loop

    sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) ); // re-calc system energy and detect drift
    cout << loop.timing();                                 // print timing and ETA information

  } // end of macro loop

  spc.save("state");               // save final state of simulation (positions etc)
  surfmapall.save("surfall.dat");  // save monomer-surface distribution
  FormatPQR().save("confout.pqr", spc.p);  // save PQR file

  // Perform unit tests (only for faunus integrity)
  gmv.test(test);
  sys.test(test);
  pivot.test(test);
  crank.test(test);
  rep.test(test);
  shape.test(test);

  cout << loop.info() + sys.info() + gmv.info() + crank.info()
    + pivot.info() + rep.info() + shape.info() + spc.info() + test.info();

  return test.numFailed();
}
示例#17
0
int main(int argc, char** argv) {
  Faunus::MPI::MPIController mpi;
  InputMap mcp(textio::prefix+"input");
  mpi.cout << textio::splash();
  MCLoop loop(mcp);                    // class for handling mc loops
  FormatPQR pqr;                       // PQR structure file I/O
  FormatAAM aam;                       // AAM structure file I/O
  FormatTopology top;
  FormatXTC xtc(1000);                 // XTC gromacs trajectory format
  EnergyDrift sys;                     // class for tracking system energy drifts
  UnitTest test(mcp);

  Energy::Hamiltonian pot;
  auto nonbonded = pot.create( Energy::Nonbonded<Tpairpot,Tgeometry>(mcp) );
  //auto constrain = pot.create( Energy::MassCenterConstrain(pot.getGeometry()) );
  Space spc( pot.getGeometry() );

  // Add molecular species
  int cnt=0;
  int N1=mcp.get("polymer1_N",0);
  int N2=mcp.get("polymer2_N",0);
  vector<GroupMolecular> pol( N1+N2);
  for (auto &g : pol) {
    cnt++;
    string polyfilekey = (cnt>N1) ? "polymer2_file" : "polymer1_file";
    aam.load( mcp.get<string>(polyfilekey, "") );
    Geometry::FindSpace f;
    f.dir.x()=0; // put mass center
    f.dir.y()=0; //   at [x,y,z] = [0,0,random]
    if (f.find(*spc.geo, spc.p, aam.p )) {
      g = spc.insert( aam.p );
      g.name=mcp.get<string>(polyfilekey, "");
      spc.enroll(g);
    } else
      return 1;
  }

  //constrain->addPair(pol[0], pol[1], 20, 150);

  // Add salt
  GroupAtomic salt(spc, mcp);
  salt.name="Salt";
  //spc.enroll(salt);

  Move::SwapMove tit(mcp,pot,spc);
  Move::TranslateRotate gmv(mcp,pot,spc);
  Move::AtomicTranslation mv(mcp, pot, spc);
  Move::ParallelTempering pt(mcp,pot,spc,mpi);
  mv.setGroup(salt);   // specify atomic particles to be moved

  tit.findSites(spc.p);  // search for titratable sites
  spc.load(textio::prefix+"state");

  typedef Analysis::Table2D<float, Average<double> > Tdiptable;
  Tdiptable dip1(0.25, Tdiptable::XYDATA);
  Tdiptable dip2(0.25, Tdiptable::XYDATA);
  Tdiptable dipdip(0.25, Tdiptable::XYDATA);

  gmv.directions[ pol[0].name ].x()=0; // do not move in x
  gmv.directions[ pol[0].name ].y()=0; // do not move in y
  gmv.directions[ pol[0].name ].z()=1; // do move in z
  gmv.directions[ pol[1].name ].x()=0; // do not move in x
  gmv.directions[ pol[1].name ].y()=0; // do not move in y
  gmv.directions[ pol[1].name ].z()=1; // do move in z
  Analysis::LineDistribution<float,unsigned long int> rdf(0.5);
  //rdf.maxdist=150;

  sys.init( Energy::systemEnergy(spc,pot,spc.p) );

  mpi.cout << atom.info() << spc.info() << pot.info() << textio::header("MC Simulation Begins!");

  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int k,i=rand() % 3;
      switch (i) {
        case 2:
          sys+=pt.move();
          //mv.setGroup(salt);
          //sys+=mv.move( salt.size()/2 );
          break;
        case 0:
          if (slp_global()<0.1)
            sys+=tit.move();
          break;
        case 1:
          k=pol.size();
          while (k-->0) {
            gmv.setGroup( pol[ rand() % pol.size() ] );
            sys+=gmv.move();
          }
          for (auto i=pol.begin(); i!=pol.end()-1; i++)
            for (auto j=i+1; j!=pol.end(); j++) {
              double r=spc.geo->dist(i->cm,j->cm);
              if (r<rdf.maxdist) {
                rdf(r)++;
              }
            }
          double r=spc.geo->dist(pol[0].cm,pol[1].cm);
          Point mu1 = pol[0].dipolemoment(spc);
          Point mu2 = pol[1].dipolemoment(spc);
          dip1(r) += mu1.z()/mu1.len();
          dip2(r) += mu2.z()/mu2.len();
          dipdip(r) += mu1.z()*mu2.z() / mu1.len() / mu2.len();
          break;
      }
    } // end of micro loop

    sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) );
    rdf.save(textio::prefix+"rdf_p2p.dat");
    mpi.cout << loop.timing();
  } // end of macro loop

  pqr.save(textio::prefix+"confout.pqr", spc.p);
  spc.save(textio::prefix+"state");
  dip1.save(textio::prefix+"dip1.dat");
  dip2.save(textio::prefix+"dip2.dat");
  dipdip.save(textio::prefix+"dipdip.dat");

  mpi.cout << loop.info() << spc.info() << sys.info() << mv.info() << gmv.info()
    << tit.info() << pol[0].info() << pol[0].charge(spc.p) << pt.info();
}
示例#18
0
int main(int argc, char** argv) {
  Faunus::MPI::MPIController mpi;
  mpi.cout << textio::splash();

  InputMap mcp(textio::prefix+"manybody.input");
  MCLoop loop(mcp);                    // class for handling mc loops
  FormatPQR pqr;                       // PQR structure file I/O
  FormatAAM aam;                       // AAM structure file I/O
  FormatTopology top;
  FormatXTC xtc(1000);                 // XTC gromacs trajectory format for only cuboid geomtries
  EnergyDrift sys;                     // class for tracking system energy drifts
  UnitTest test(mcp);

  Energy::Hamiltonian pot;
  auto nonbonded = pot.create( Energy::Nonbonded<Tpairpot,Tgeometry>(mcp) );
  auto bonded    = pot.create( Energy::Bonded() );
//  auto mfc       = pot.create( Energy::MeanFieldCorrection(mcp) );  //pot.create returns a smart pointer!!
  auto swpair    = pot.create( Energy::PairListID() );
  swpair->add( atom["HIS"].id, atom["Zn"].id, Potential::SquareWell(mcp) );  //add square-well poteintial between Zn+2 and HIS resiues
  swpair->add( atom["ZNHIS"].id, atom["HIS"].id, Potential::SquareWellShifted(mcp, "squarewell_ZNHIS") );  //add square-well poteintial between ZNHIS and HIS resiues
#ifdef SLIT
  auto gouy = pot.create( Energy::GouyChapman(mcp) );
  gouy->setPosition( nonbonded->geometry.len_half.z() ); // Place the surface xy plane at +z direction
  auto restricted = pot.create( Energy::RestrictedVolumeCM(mcp) );
#endif
  Space spc( pot.getGeometry() );

  // Add polymers
  vector<GroupMolecular> pol( mcp.get("polymer_N",0) );
  string polyfile = mcp.get<string>("polymer_file", "");
  atom["MM"].dp = 0.;
  int ii=1;
  mpi.cout << "Number of polymers: " << pol.size() << endl;
  for (auto &g : pol) {                              // load polymers
    aam.load(polyfile);
    Geometry::FindSpace f;
    f.find(*spc.geo, spc.p, aam.particles());        // find empty spot in particle vector
    g = spc.insert( aam.particles() );               // insert into space
    ostringstream o;
    o << "Polymer" << ii++;
    g.name=o.str();
    spc.enroll(g);
#ifdef SLIT
    //(*restricted).groups.push_back( &g );   // Restrict center of masses of all proteins
    restricted->groups.push_back( &g );       // Restrict center of masses of all proteins
#endif
    for (int i=g.front(); i<g.back(); i++)
      bonded->add(i, i+1, Tbondpot(mcp, "polymer_", "minuslj_")); // add bonds
  }
  Group allpol( pol.front().front(), pol.back().back() ); // make group w. all polymers
  
  // Add salts
  GroupAtomic salt(spc, mcp);
  salt.name="salt";
  mpi.cout << "Number of salts: " << salt.size() << endl;

  // atom["NTR"].dp = 10.;
  // atom["CTR"].dp = 10.;
  // atom["HIS"].dp = 10.;
  // atom["HNTR"].dp = 10.;
  // atom["HCTR"].dp = 10.;
  // atom["HHIS"].dp = 10.;

  //Move::Isobaric iso(mcp,pot,spc);
  Move::TranslateRotate gmv(mcp,pot,spc);
  Move::AtomicTranslation mv(mcp, pot, spc);
  Move::AtomicTranslation mv2(mcp, pot, spc, "ion");
  Move::SwapMove tit(mcp,pot,spc);
  Move::CrankShaft crank(mcp, pot, spc);
  Move::Pivot pivot(mcp, pot, spc);
  Move::ParallelTempering temper(mcp,pot,spc,mpi);
  Move::Reptation rep(mcp, pot, spc);

  Analysis::RadialDistribution<float,int> rdf(0.25);
#ifdef SLIT
  Analysis::LineDistribution<float,int> surfdist(0.25), surfmapall(0.25);
  //std::map< string , Analysis::LineDistribution<float,int> > surfmap, surfmapall;
  std::map< int , Analysis::LineDistribution<float,int> > surfmap_res;
  typedef Analysis::Table2D<double, Average<double> > Ttable;
  std::map<string , Ttable> dst_map;
#endif
  Analysis::ChargeMultipole mpol;
  Analysis::PolymerShape shape;
  spc.load(textio::prefix+"state");

  sys.init( Energy::systemEnergy(spc,pot,spc.p) );

  mpi.cout << atom.info() << spc.info() << pot.info() << tit.info()
    << textio::header("MC Simulation Begins!");

  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int k,i=rand() % 6;
      switch (i) {
        case 0: // translate and rotate molecules
          k=pol.size()+salt.size();
          while (k-->0) {
            int s=rand()%2;
            if (s==1) {
              gmv.setGroup( pol.at( rand() % pol.size() ) );
              sys+=gmv.move(); 
            }
            else {
              mv2.setGroup(salt); // translate salt particles 
              if (salt.size()>0)
                sys+=mv2.move( rand() % salt.size() ); 
            }
          }
#ifdef SLIT
          for (auto &g : pol) {
            //surfmap[g.name]( gouy->dist2surf(g.cm) )++;
            surfdist( gouy->dist2surf(g.cm) )++; // polymer mass center to GC surface histogram
	    for (int i=g.front(); i<=g.back(); i++) {
              surfmap_res[i]( gouy->dist2surf( spc.p[i] ) )++; // monomer to GC surface histogram
              surfmapall( gouy->dist2surf( spc.p.at(i) ) )++;
            }
          }
#endif
          for (auto i=pol.begin(); i!=pol.end()-1; i++)
            for (auto j=i+1; j!=pol.end(); j++)
              rdf( spc.geo->dist(i->cm,j->cm) )++; // sample polymer-polymer rdf
          break;
        case 1:
          mv.setGroup(allpol);
          sys+=mv.move( allpol.size() ); // translate monomers
          for (auto &g : pol) {
            g.setMassCenter(spc);
            shape.sample(g,spc);
          }
          break;
        case 2: // titration move
          sys+=tit.move();
          mpol.sample(pol,spc);
          break;
        case 3: // crankshaft move
          k=pol.size();
          while (k-->0) {
            crank.setGroup( pol[ rand() % pol.size() ] );
            sys+=crank.move();
          }
          for (auto &g : pol) {
            g.setMassCenter(spc);
            shape.sample(g,spc);
          }
          break;
        case 4: // pivot move
          k=pol.size();
          while (k-->0) {
            pivot.setGroup( pol[ rand() % pol.size() ] );
            sys+=pivot.move();
          }
          for (auto &g : pol) {
            g.setMassCenter(spc);
            shape.sample(g,spc);
          }
          break;
        case 5: // reptation move
          k=pol.size();
          while (k-->0) {
            rep.setGroup( pol[ rand() % pol.size() ] );
            sys+=rep.move();
          }
          for (auto &g : pol) {
            g.setMassCenter(spc);
            shape.sample(g,spc);
          }
          break;
        //case 5: // volume move
          //sys+=iso.move();
         // break;
        }

      if ( slp_global.runtest(0.00001) ) {
        xtc.setbox( nonbonded->geometry.len );
        xtc.save(textio::prefix+"traj.xtc", spc);
      }
      //if ( slp_global.runtest(0.1) ) 
        //(*mfc).sample(spc.p, )
#ifdef SLIT
      if ( slp_global.runtest(0.1) ) {
         for (auto &g : pol) {
           double d = gouy->dist2surf(g.cm);
           dst_map["Q"]( d )+=g.charge(spc.p);
           Point p=shape.vectorgyrationRadiusSquared(g, spc);
           dst_map["Rg2"]( d )+=p.x()+p.y()+p.z();
           dst_map["Rg2x"]( d )+=p.x();
           dst_map["Rg2z"]( d )+=p.z();
           dst_map["Ree2"]( d )+=spc.geo->sqdist( spc.p[g.front()], spc.p[g.back()] );
           //dst_map["<Energy>"]( d )+=sys.current();
           for (int i=g.front(); i<=g.back(); i++){
            ostringstream o;
            o << "qres" << i ;
            dst_map[o.str()]( d )+=spc.p[i].charge;
           }
         } 
      }
#endif

    } // end of micro loop

    temper.setCurrentEnergy( sys.current() );
    sys+=temper.move();

    sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) );

    mpi.cout << loop.timing();
    cout << loop.timing();

    rdf.save(textio::prefix+"rdf_p2p.dat");

#ifdef SLIT
    surfdist.save(textio::prefix+"surfdist.dat");
    surfmapall.save(textio::prefix+"surfall.dat");
    dst_map["Q"].save(textio::prefix+"netq.dat");
    //dst_map["<Energy>"].save(textio::prefix+"aveenergy.dat");

    for (auto &g : pol){   //Saving averages 
      //surfmap[g.name].save(textio::prefix+g.name+"surfdist.dat");
      std::ofstream f(textio::prefix+"res-surfdist.dat");
      std::ofstream f1(textio::prefix+"Rg-comp.dat");
      std::ofstream f2(textio::prefix+"qres.dat");
      f.precision(7);
      f1.precision(7);
      f2.precision(7);
      if (f && f1 && f2) {
        //f << "#g(z) of each residue from 1 to " << g.size() << endl;
        for (double d=0; d<=nonbonded->geometry.len.z(); d+=0.25){
          f1 << d; 
          if (dst_map["Rg2"](d).cnt > 0) f1 << "\t" << dst_map["Rg2"](d); //If counter is empty, then it prints shit lot of warning
          else f1 << "\t0";

          if (dst_map["Rg2x"](d).cnt > 0)f1 << "\t" << dst_map["Rg2x"](d); 
          else f1 << "\t0";

          if (dst_map["Rg2z"](d).cnt > 0)  f1 << "\t" << dst_map["Rg2z"](d); 
          else f1 << "\t0";

          if (dst_map["Ree2"](d).cnt > 0)  f1 << "\t" << dst_map["Ree2"](d); 
          else f1 << "\t0";
          f1 << endl;

          f << d; 
          f2 << d;
          for (int i=g.front(); i<=g.back(); i++){
            f << "\t" << surfmap_res[i](d);
            ostringstream o;
            o << "qres" << i ;
            if (dst_map[o.str()]( d ).cnt > 0 ) f2 << "\t" << dst_map[o.str()]( d );
            else f2 << "\t0"; 
          }
          f << endl;
          f2 << endl;
        }
      }
    }
#endif

    pqr.save(textio::prefix+"confout.pqr", spc.p);
    aam.save(textio::prefix+"confout.aam", spc.p);
    mcp.save(textio::prefix+"mdout.mdp");
    spc.save(textio::prefix+"state");


  } // end of macro loop

  mpi.cout << loop.info() << sys.info() << gmv.info() <<  mv.info() << mv2.info() 
    << crank.info() << pivot.info() << rep.info() << temper.info() 
    << tit.info() << mpol.info()  <<  shape.info() << spc.info();   

  tit.applycharges(spc.p);
  pqr.save(textio::prefix+"conf_aveq.pqr", spc.p);
  aam.save(textio::prefix+"conf_aveq.aam", spc.p);

}
示例#19
0
int main(int argc, char** argv) {

#ifdef TEMPER
  #define cout mpi.cout
  Faunus::MPI::MPIController mpi;
#endif

  cout << textio::splash();

  InputMap mcp(textio::prefix+"gouychapman.input");
  MCLoop loop(mcp);                    // class for handling mc loops
  FormatPQR pqr;                       // PQR structure file I/O
  FormatAAM aam;                       // AAM structure file I/O
  FormatXTC xtc(1000);                 // XTC gromacs trajectory format for only cuboid geomtries
  EnergyDrift sys;                     // class for tracking system energy drifts

  Tspace spc(mcp);

  auto pot = Energy::Nonbonded<Tspace, Tpairpot>(mcp) + 
    Energy::ExternalPotential<Tspace,Potential::GouyChapman<> >(mcp);
  pot.second.setSurfPositionZ( &spc.geo.len_half.z() );
  pot.setSpace(spc);

  // Add rigid molecules
  vector<GroupMolecular> pol( mcp.get("polymer_N",0));
  string polyfile = mcp.get<string>("polymer_file", "");
  for (auto &g : pol) {                    // load molecules
    aam.load(polyfile);
    Geometry::FindSpace f;
    f.find(*spc.geo, spc.p, aam.p);        // find empty spot in particle vector
    g = spc.insert( aam.p );               // insert into space
    g.name="Molecule";
    spc.enroll(g);
  }

  Move::TranslateRotate<Tspace> gmv(mcp,pot,spc);
#ifdef TEMPER
  Move::ParallelTempering<Tspace> temper(mcp,pot,spc,mpi);
#endif

  Analysis::RadialDistribution<float,int> rdf(0.25);
  Analysis::LineDistribution<float,int> surfdist(0.25);

  spc.load(textio::prefix+"state");
  pqr.save(textio::prefix+"initial.pqr", spc.p);

  sys.init( Energy::systemEnergy(spc,pot,spc.p) );

  cout << atom.info() << spc.info() << pot.info() << textio::header("MC Simulation Begins!");

  while ( loop.macroCnt() ) {                      // Markov chain 
    while ( loop.microCnt() ) {
      int k,i= slump.rand() % 1;
      switch (i) {
        case 0:                                    // translate and rotate molecules
          k=pol.size();
          while (k-->0) {
            gmv.setGroup( pol[ slump.rand() % pol.size() ] );
            sys+=gmv.move();
          }

          for (auto &g : pol)
            surfdist( gouy->dist2surf(g.cm) )++;   // molecule mass center to GC surface histogram

          for (auto i=pol.begin(); i!=pol.end()-1; i++)
            for (auto j=i+1; j!=pol.end(); j++)
              rdf( spc.geo->dist(i->cm,j->cm) )++; // molecule-molecule rdf

          break;
      }

      if ( slump.runtest(0.0001) ) {
        xtc.setbox( spc.geo.len );
        xtc.save(textio::prefix+"traj.xtc", spc);  // gromacs xtc file output
      }
    } // end of micro loop
#ifdef TEMPER
    temper.setCurrentEnergy( sys.current() );
    sys+=temper.move();
#endif

    sys.checkDrift( Energy::systemEnergy(spc,pot,spc.p) );

    cout << loop.timing();

    rdf.save(textio::prefix+"rdf_p2p.dat");
    surfdist.save(textio::prefix+"surfdist.dat");
    pqr.save(textio::prefix+"confout.pqr", spc.p);
    spc.save(textio::prefix+"state");

  } // end of macro loop

  cout << loop.info() << pot.first.info() << sys.info() << gmv.info();   
#ifdef TEMPER
  cout << temper.info();
#endif
}
示例#20
0
int main() {
  Group g(100,1);
  g.resize(0);
  cout << "size = " << g.size() << endl;
  cout << "range = " << g.front() << " " << g.back() << endl;
  cout << "empty bool = " << g.empty() << endl;
  for (auto i=g.begin(); i!=g.end(); i++)
    cout << *i << endl;

  cout << textio::splash();
  atom.includefile("atomlist.inp");    // load atom properties
  InputMap mcp("bulk.inp");
  MCLoop loop(mcp);                    // class for handling mc loops
  FormatPQR pqr;                       // PQR structure file I/O
  EnergyDrift sys;                     // class for tracking system energy drifts

  Energy::Hamiltonian pot;
  auto nonbonded = pot.create( Energy::Nonbonded<Tpairpot,Tgeometry>(mcp) );
  Space spc( pot.getGeometry() );

  // Handle particles
  GroupAtomic salt(spc, mcp);
  salt.name="Salt";
  spc.load("space.state", Space::RESIZE);

  Move::GrandCanonicalSalt gc(mcp,pot,spc,salt);
  Move::AtomicTranslation mv(mcp, pot, spc);  // Particle move class
  mv.setGroup(salt);

  // Widom particle insertion
  Analysis::RadialDistribution<float,unsigned int> rdf(0.2);
  rdf.maxdist = 50.;
  particle a;
  Analysis::Widom widom(spc, pot);
  a = atom["Cl"];
  widom.addGhost( spc);
  widom.addGhost( a );

#define UTOTAL \
  + pot.g_internal(spc.p, salt)  + pot.g_external(spc.p, salt)\
  + pot.external()
  sys.init( UTOTAL );

  cout << atom.info() << spc.info() << pot.info() << mv.info()
    << textio::header("MC Simulation Begins!");

  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      sys+=mv.move( salt.size() );
      sys+=gc.move( salt.size()/2 );
      if (slp_global.randOne()>0.9) {
        widom.sample();
        rdf.sample(spc,salt,atom["Na"].id, atom["Cl"].id);
      }
    }
    sys.checkDrift( UTOTAL );
    cout << loop.timing();
  }

  pqr.save("confout.pqr", spc.p);
  spc.save("space.state");
  rdf.save("rdf.dat");

  cout << sys.info() << loop.info() << mv.info() << gc.info() << widom.info();
}
示例#21
0
int main() {
  cout << textio::splash();           // show faunus banner and credits
  InputMap mcp("sc-npt.input");     // open user input file
  MCLoop loop(mcp);                   // class for handling mc loops
  FormatPQR pqr;                      // PQR structure file I/O
  EnergyDrift sys; // class for tracking system energy drifts

  // Energy functions and space
  Tspace spc(mcp);
  auto pot = Energy::NonbondedVector<Tspace,Tpairpot>(mcp)
    + Energy::ExternalPressure<Tspace>(mcp);

  // Markov moves and analysis
  Move::Isobaric<Tspace> iso(mcp,pot,spc);
  Move::AtomicTranslation<Tspace> mv(mcp, pot, spc);
  Move::AtomicRotation<Tspace> rot(mcp, pot, spc);
  Analysis::RadialDistribution<> rdf(0.2);

  // Add cigars
  Group cigars;
  cigars.addParticles(spc, mcp);
  cigars.name="cigars";
  for (auto i : cigars) {
    spc.p[i].halfl = 2.5;
    spc.p[i].dir.ranunit(slp_global);
    spc.trial[i]=spc.p[i];
  }

  spc.load("state");                                     // load old config. from disk (if any)

  sys.init( Energy::systemEnergy(spc,pot,spc.p)  );      // store initial total system energy

  cout << atom.info() << spc.info() << pot.info() << textio::header("MC Simulation Begins!");

  std::ofstream m("snapshot");
  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int i=slp_global.rand() % 3;
      switch (i) {
        case 0:
          mv.setGroup(cigars);
          sys+=mv.move( cigars.size() );  // translate cigars
          break;
        case 1:
          rot.setGroup(cigars);
          sys+=rot.move( cigars.size() ); // translate cigars
          break;
        case 2:
          sys+=iso.move();                // isobaric volume move
          break;
      }

      // movie
      if (slp_global()<0.001)
      {
        m << spc.p.size() << "\n"
          << "sweep " << loop.count() << "; box "
          << spc.geo.len.x() << " "
          << spc.geo.len.y() << " "
          << spc.geo.len.z() << "\n";
        for (auto &i : spc.p) {
          m << i.x() << " " << i.y() << " " << i.z() << " "
            << i.dir.x() << " " << i.dir.y() << " " << i.dir.z() << " "
            << " 0 0 0 0\n";
        }

      }

    } // end of micro loop

    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // compare energy sum with current

    cout << loop.timing();

  } // end of macro loop

  // save to disk
  rdf.save("rdf_p2p.dat");
  pqr.save("confout.pqr", spc.p);
  spc.save("state");

  // print information
  cout << loop.info() << sys.info() << mv.info() << rot.info() << iso.info();
}
示例#22
0
int main() {
  InputMap mcp("water2.input");//read input file
  slp_global.seed(mcp.get<int>("seed", -7));

  // Energy functions and space
  auto pot = Energy::NonbondedVector<Tspace,Tpairpot>(mcp)
    + Energy::ExternalPressure<Tspace>(mcp);
  Tspace spc(mcp);

  // Load and add polymer to Space
  auto N    = mcp.get<int>("mol_N",1);
  auto file = mcp.get<string>("mol_file");
  vector<Group> water(N);
  Tspace::ParticleVector v;                   // temporary, empty particle vector
  FormatAAM::load(file,v);                    // load AAM structure into v
  for (auto &i : water) {
    Geometry::FindSpace f;
    f.allowMatterOverlap=true;
    f.find(spc.geo,spc.p,v);// find empty spot in particle vector
    i = spc.insert(v);                          // Insert into Space
    i.name="h2o";
    spc.enroll(i);
  }

  // Markov moves and analysis
  Move::PolarizeMove<TranslateRotate<Tspace> >  gmv(mcp,pot,spc);
  //Move::TranslateRotate<Tspace> gmv(mcp,pot,spc);
  Move::Isobaric<Tspace> iso(mcp,pot,spc);
  
  Analysis::RadialDistribution<> rdfOO(0.05);
  Analysis::RadialDistribution<> rdfOH(0.05);
  Analysis::RadialDistribution<> rdfHH(0.05);

  spc.load("state"); // load old config. from disk (if any)
  Analysis::DipoleAnalysis dian(spc,mcp);
  dian.load(mcp.get<string>("dipole_data_ext", ""));

  FormatPQR::save("initial.pqr", spc.p);

  EnergyDrift sys;   // class for tracking system energy drifts
  sys.init( Energy::systemEnergy(spc,pot,spc.p)  ); // store total energy

  cout << atom.info() + spc.info() + pot.info() + textio::header("MC Simulation Begins!");

  MCLoop loop(mcp);            // class for handling mc loops
  while ( loop.macroCnt() ) {  // Markov chain 
    while ( loop.microCnt() ) {
      int i=slp_global.rand() % 2;
      int j,k=water.size();
      Group g;
      switch (i) {
        case 0:
          while (k-->0) {
            j=slp_global.rand() % (water.size());
            gmv.setGroup(water[j]);
            sys+=gmv.move();          // translate/rotate polymers
          }
          break;
        case 1:
          sys+=iso.move();
          break;
      }
      dian.sampleDP(spc);
      // sample oxygen-oxygen rdf
      if (slp_global()>0.5) {
        dian.sampleMuCorrelationAndKirkwood(spc);
        auto idO = atom["OW"].id;
        auto idH = atom["HW"].id;
        rdfOO.sample(spc,idO,idO);
        rdfOH.sample(spc,idO,idH);
        rdfHH.sample(spc,idH,idH);
      }
    } // end of micro loop
    //rdfOO.save("rdfOO.dat"+std::to_string(loop.count()));
    //rdfOH.save("rdfOH.dat"+std::to_string(loop.count()));
    //rdfHH.save("rdfHH.dat"+std::to_string(loop.count()));
    //dian.save(std::to_string(loop.count()));
    sys.checkDrift(Energy::systemEnergy(spc,pot,spc.p)); // energy drift?

    cout << loop.timing();
  } // end of macro loop

  // save to disk
  spc.save("state");
  rdfOO.save("rdfOO.dat");
  rdfOH.save("rdfOH.dat");
  rdfHH.save("rdfHH.dat");
  spc.save("state");
  dian.save();
  FormatPQR::save("confout.pqr", spc.p, spc.geo.len);

  // print information
  cout << loop.info() + sys.info() + gmv.info() + iso.info() + dian.info();
}