From 2c01f1f20a4543b62a96320c02a87aa7d09334f8 Mon Sep 17 00:00:00 2001
From: Giovanni Bussi <giovanni.bussi@gmail.com>
Date: Wed, 22 Apr 2015 17:54:40 +0200
Subject: [PATCH] More virial components

I added the possibility to dump the 9 components of the virial
from the driver.
---
 src/cltools/Driver.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/cltools/Driver.cpp b/src/cltools/Driver.cpp
index f13d471d8..73b1b0e90 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]);
-- 
GitLab