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 }