From 79602bac2da43afa013629dae1d050f499dba7ce Mon Sep 17 00:00:00 2001 From: sjplimp <sjplimp@f3b2605a-c512-4ea7-a41b-209d697bcdaa> Date: Thu, 22 Feb 2007 19:57:04 +0000 Subject: [PATCH] git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@341 f3b2605a-c512-4ea7-a41b-209d697bcdaa --- tools/Makefile | 4 + tools/thermo_extract.c | 238 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 242 insertions(+) create mode 100644 tools/thermo_extract.c diff --git a/tools/Makefile b/tools/Makefile index 599184471b..6e4c93e925 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -25,8 +25,12 @@ micelle2d: micelle2d.o data2xmovie: data2xmovie.o g++ -g data2xmovie.o -o data2xmovie +thermo_extract: thermo_extract.o + gcc -g thermo_extract.o -o thermo_extract + clean: rm binary2txt replicate restart2data chain micelle2d data2xmovie + rm thermo_extract rm *.o # diff --git a/tools/thermo_extract.c b/tools/thermo_extract.c new file mode 100644 index 0000000000..f79da3aca9 --- /dev/null +++ b/tools/thermo_extract.c @@ -0,0 +1,238 @@ +/* Written by Vikas Varshney + Dated Feb 22, 2007 + Contact Info: vikas.varshney@gmail.com + +The main purpose of this simple code is to extract thermodynamic +information such as Temperature, Pressure, Energy, etc from LAMMPS log +files, to plot them as a function of timestep in a simple plotting +programs such as xmgrace. + +Such plots are useful at initial stages of a simulation to make sure +the system is equilibrated. + +To run this program please compile it as + gcc -O3 thermo_extract.c -lm -o thermo_extract + +To extract temperature as a function of timestep, run the code as + +thermo_extract -p Temp -s/-m logfile1 logfile2 ... (all the log files) + +Time and temperature is output as 2 columns of data. It can +be re-directed to a file for plotting. + + -p for thermo parameter to extract + -s if the output format is single line, or + -m is the output format is multi line + +Few points + +1. The log file must contain a "thermo N" command where N is the + frequency of the thermo output. + +2. The name of the property "Temp" (in previous example) has to match + the thermo property in the logfile. + +3. The log file(s) can contain thermo info for multiple runs. + +4. Currently, you can only use one parameter as input, so for extracting + multiple properties, you have to run the code again. + +5. The Program uses the following keywords to keep track of the data in + the file. In general, these keywords are not used in input script (which + in turn get printed in log file) but are worth mentioning. + + PLEASE avoid using + "Dangerous", "Memory", "Step" and "Loop" in the input script + + "thermo" and "run" except when they are used to specify frequency of + thermo output and total number of steps to be run, respectively. + +*/ + +#include<stdio.h> +#include<stdlib.h> +#include<math.h> +#include <string.h> +#include <stddef.h> + +FILE *input; +char filename_input[100]; +char string1[100],*string2; +char temp[80]; +int j,k,check,timestep; +double datapoint; +int thermostylecounter,thermocounter,runcounter,totalsteps; +int narg1; +char *token; +char templl[80]; +int thermo[100]; +int run[100]; + +void scan_first_part() +{ + while(strcmp(temp,"Memory")) + fscanf(input,"%s ",&temp); +} + +void scan_data_multi(int temp1,char* chartemp) +{ + totalsteps=run[temp1]/thermo[temp1]+1; + for(j=0;j<totalsteps;j++) + { + while(strcmp(temp,"Step")) + fscanf(input,"%s ",&temp); + + fscanf(input,"%s ",&temp); + timestep=atoi(temp); + + while(strcmp(temp,chartemp)) + fscanf(input,"%s ",&temp); + + fscanf(input,"%s ",&temp); + fscanf(input,"%s ",&temp); + datapoint=atof(temp); + if ((temp1!=0) && (j==0)) + {} + else + printf("%d %f\n",timestep,datapoint); + } +} + +void scan_data_single(int temp1,char* chartemp) +{ + fgets(string1,100,input); + fgets(string1,100,input); + narg1=0; + for(j=0;j<strlen(string1);j++) + if(string1[j]==' ') + narg1++; + + token=strtok(string1," "); + check=0; + for(j=1;j<narg1;j++) + { + token=strtok(NULL," "); + if (!strcmp(token,chartemp)) + { + check=j; + break; + } + } + + if (check>0) + {} + else + { + printf("Couldn't recognize parameter\n"); + exit(1); + } + + totalsteps=run[temp1]/thermo[temp1]+1; + for(j=0;j<totalsteps;j++) + { + fscanf(input,"%s ",&temp); + timestep=atoi(temp); + for(k=0;k<check;k++) + fscanf(input,"%s ",&temp); + datapoint=atof(temp); + for(k=0;k<narg1-1-check;k++) + fscanf(input,"%s ",&temp); + if ((temp1!=0) && (j==0)) + {} + else + printf("%d %f\n",timestep,datapoint); + } +} + +int main(int arg, char **argv) +{ + int singleoutput,next,eofpointer,i,file; + char firsttemp[256]; + int iterations; + if (arg<5) + { + printf("Insufficient number of arguements\n"); + printf("Please make sure the systax has the following format\n"); + printf("thermo_extract -p parameter -m/-s logfile1 logfile2 ...\n"); + exit(1); + } + for(file=4;file<arg;file++) + { + sprintf(filename_input,argv[file]); + if ((input=fopen(filename_input,"r"))==NULL) + { + printf("Error reading %dth file.\n",file); + exit(1); + } + iterations=0; + while(!feof(input)) + { + fscanf(input,"%s ",&firsttemp); + if (!strcmp(firsttemp,"Dangerous")) + iterations++; + } + rewind(input); + for(i=0;i<100;i++) + { + thermo[i]=0; + run[i]=0; + } + + for(i=0;i<iterations;i++) + { + while(strcmp(firsttemp,"run")) + { + fscanf(input,"%s ",&firsttemp); + if (!strcmp(firsttemp,"thermo")) + { + fscanf(input,"%s ",&firsttemp); + thermo[i]=atoi(firsttemp); + } + } + fscanf(input,"%s ",&firsttemp); + run[i]=atoi(firsttemp); + if ((i==0) && (thermo[i]==0)) + { + printf("thermo info not found in the file.. Exiting\n"); + exit(1); + } + if (thermo[i]==0) + thermo[i]=thermo[i-1]; + } + + rewind(input); + + if (!strcmp(argv[3],"-m")) + thermostylecounter=1; + else if (!strcmp(argv[3],"-s")) + thermostylecounter=0; + else + { + printf("Couldn't recognize file format. Please use either -m or -s\n"); + exit(1); + } + + if (thermostylecounter==1) + for(i=0;i<iterations;i++) + { + scan_first_part(); + scan_data_multi(i,argv[2]); + while(strcmp(temp,"Loop")) + fscanf(input,"%s ",&temp); + for(j=0;j<19;j++) + fgets(temp,80,input); + } + else + for(i=0;i<iterations;i++) + { + scan_first_part(); + scan_data_single(i,argv[2]); + while(strcmp(temp,"Loop")) + fscanf(input,"%s ",&temp); + for(j=0;j<19;j++) + fgets(temp,80,input); + } + fclose(input); + } + return 0; +} -- GitLab