diff --git a/src/cltools/Driver.cpp b/src/cltools/Driver.cpp index 468d2c21da67c459d3930ec5af47001ba9a83b55..be1d69a66c04b75c8c459db66191b141ada57417 100644 --- a/src/cltools/Driver.cpp +++ b/src/cltools/Driver.cpp @@ -221,6 +221,7 @@ void Driver<real>::registerKeywords( Keywords& keys ) { ); keys.add("compulsory","--multi","0","set number of replicas for multi environment (needs MPI)"); keys.addFlag("--noatoms",false,"don't read in a trajectory. Just use colvar files as specified in plumed.dat"); + keys.addFlag("--parse-only",false,"read the plumed input file and stop"); keys.add("atoms","--ixyz","the trajectory in xyz format"); keys.add("atoms","--igro","the trajectory in gro format"); #ifdef __PLUMED_HAS_XDRFILE @@ -252,7 +253,6 @@ void Driver<real>::registerKeywords( Keywords& keys ) { for(unsigned i=0; i<plugins.size(); i++) { string kk="--mf_"+string(plugins[i]->name); string mm=" molfile: the trajectory in "+string(plugins[i]->name)+" format " ; - //cerr<<"REGISTERING "<<kk<<mm<<endl; keys.add("atoms",kk,mm); } #endif @@ -285,6 +285,7 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc) { } // Are we reading trajectory data bool noatoms; parseFlag("--noatoms",noatoms); + bool parseOnly; parseFlag("--parse-only",parseOnly); std::string fakein; bool debug_float=false; @@ -447,7 +448,7 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc) { trajectoryFile=traj_trr; trajectory_fmt="xdr-trr"; } - if(trajectoryFile.length()==0) { + if(trajectoryFile.length()==0&&!parseOnly) { fprintf(stderr,"ERROR: missing trajectory data\n"); if(grex_log)fclose(grex_log); return 1; @@ -518,11 +519,17 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc) { int natoms; + if(parseOnly) { + if(command_line_natoms<0) error("--parseOnly requires setting the number of atoms with --natoms"); + natoms=command_line_natoms; + } + + FILE* fp=NULL; FILE* fp_forces=NULL; OFile fp_dforces; #ifdef __PLUMED_HAS_XDRFILE XDRFILE* xd=NULL; #endif - if(!noatoms) { + if(!noatoms&&!parseOnly) { if (trajectoryFile=="-") fp=in; else { @@ -605,16 +612,12 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc) { Random rnd; while(true) { - if(!noatoms) { + if(!noatoms&&!parseOnly) { if(use_molfile==true) { #ifdef __PLUMED_HAS_MOLFILE_PLUGINS int rc; rc = api->read_next_timestep(h_in, natoms, &ts_in); - //if(rc==MOLFILE_SUCCESS){ - // printf(" read this one :success \n"); - //} if(rc==MOLFILE_EOF) { - //printf(" read this one :eof or error \n"); break; } #endif @@ -624,7 +627,7 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc) { } bool first_step=false; - if(!noatoms) { + if(!noatoms&&!parseOnly) { if(use_molfile==false && (trajectory_fmt=="xyz" || trajectory_fmt=="gro")) { if(trajectory_fmt=="gro") if(!Tools::getline(fp,line)) error("premature end of trajectory file"); sscanf(line.c_str(),"%100d",&natoms); @@ -665,6 +668,7 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc) { checknatoms=natoms; p.cmd("setNatoms",&natoms); p.cmd("init"); + if(parseOnly) break; } if(checknatoms!=natoms) { std::string stepstr; Tools::convert(step,stepstr);