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(); }
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(); }
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(); }
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(); }
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(); }
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"); }
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(); }
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"); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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); }
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 }
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(); }
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(); }
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(); }