diff --git a/src/cltools/Driver.cpp b/src/cltools/Driver.cpp index f13d471d88a3d8ed20c1cae1e57ffb20de9f0883..73b1b0e903ed5142c6bb8ec0977c1aef86f4f93b 100644 --- a/src/cltools/Driver.cpp +++ b/src/cltools/Driver.cpp @@ -162,6 +162,7 @@ void Driver<real>::registerKeywords( Keywords& keys ){ keys.add("optional","--length-units","units for length, either as a string or a number"); keys.add("optional","--dump-forces","dump the forces on a file"); keys.add("optional","--dump-forces-fmt","( default=%%f ) the format to use to dump the forces"); + keys.addFlag("--dump-full-virial",false,"with --dump-forces, it dumps the 9 components of the virial"); keys.add("optional","--pdb","provides a pdb with masses and charges"); keys.add("optional","--box","comma-separated box dimensions (3 for orthorombic, 9 for generic)"); keys.add("optional","--natoms","provides number of atoms - only used if file format does not contain number of atoms"); @@ -267,8 +268,10 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc){ unsigned stride; parse("--trajectory-stride",stride); // are we writing forces string dumpforces(""), dumpforcesFmt("%f");; + bool dumpfullvirial=false; if(!noatoms) parse("--dump-forces",dumpforces); if(dumpforces!="") parse("--dump-forces-fmt",dumpforcesFmt); + if(dumpforces!="") parseFlag("--dump-full-virial",dumpfullvirial); string trajectory_fmt; @@ -722,8 +725,13 @@ int Driver<real>::main(FILE* in,FILE*out,Communicator& pc){ if(fp_forces){ fprintf(fp_forces,"%d\n",natoms); + string fmtv=dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+"\n"; string fmt=dumpforcesFmt+" "+dumpforcesFmt+" "+dumpforcesFmt+"\n"; - fprintf(fp_forces,fmt.c_str(),virial[0],virial[4],virial[8]); + if(dumpfullvirial){ + fprintf(fp_forces,fmtv.c_str(),virial[0],virial[1],virial[2],virial[3],virial[4],virial[5],virial[6],virial[7],virial[8]); + } else { + fprintf(fp_forces,fmt.c_str(),virial[0],virial[4],virial[8]); + } fmt="X "+fmt; for(int i=0;i<natoms;i++) fprintf(fp_forces,fmt.c_str(),forces[3*i],forces[3*i+1],forces[3*i+2]);