7804ef901be13691b710c9a006482218f213453c
[alexxy/gromacs.git] / src / gmxlib / oenv.c
1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
2  *
3  * 
4  *                This source code is part of
5  * 
6  *                 G   R   O   M   A   C   S
7  * 
8  *          GROningen MAchine for Chemical Simulations
9  * 
10  *                        VERSION 3.2.0
11  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13  * Copyright (c) 2001-2004, The GROMACS development team,
14  * check out http://www.gromacs.org for more information.
15  
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  * 
21  * If you want to redistribute modifications, please consider that
22  * scientific software is very special. Version control is crucial -
23  * bugs must be traceable. We will be happy to consider code for
24  * inclusion in the official distribution, but derived work must not
25  * be called official GROMACS. Details are found in the README & COPYING
26  * files - if they are missing, get the official version at www.gromacs.org.
27  * 
28  * To help us fund GROMACS development, we humbly ask that you cite
29  * the papers on the package - you can find them in the top README file.
30  * 
31  * For more info, check our website at http://www.gromacs.org
32  * 
33  * And Hey:
34  * GROningen Mixture of Alchemy and Childrens' Stories
35  */
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif
39
40
41 #include <ctype.h>
42 #include <assert.h>
43 #include "sysstuff.h"
44 #include "macros.h"
45 #include "string2.h"
46 #include "smalloc.h"
47 #include "pbc.h"
48 #include "statutil.h"
49 #include "names.h"
50 #include "vec.h"
51 #include "futil.h"
52 #include "wman.h"
53 #include "tpxio.h"
54 #include "gmx_fatal.h"
55 #include "network.h"
56 #include "vec.h"
57 #include "mtop_util.h"
58 #include "gmxfio.h"
59 #include "oenv.h"
60
61 #ifdef GMX_THREAD_MPI
62 #include "thread_mpi.h"
63 #endif
64
65
66
67 /* The source code in this file should be thread-safe. 
68       Please keep it that way. */
69
70 /******************************************************************
71  *
72  *             T R A J E C T O R Y   S T U F F
73  *
74  ******************************************************************/
75
76 /* read only time names */
77 /* These must correspond to the time units type time_unit_t in statutil.h */
78 static const real timefactors[] =   { 0,  1e3,  1, 1e-3, 1e-6, 1e-9, 1e-12, 0 };
79 static const real timeinvfactors[] ={ 0, 1e-3,  1,  1e3,  1e6,  1e9,  1e12, 0 };
80 static const char *time_units_str[] = { NULL, "fs", "ps", "ns", "us", 
81                                         "\\mus", "ms", "s" };
82 static const char *time_units_xvgr[] = { NULL, "fs", "ps", "ns",  
83                                         "ms", "s", NULL };
84
85
86
87 /***** OUTPUT_ENV MEMBER FUNCTIONS ******/
88
89 void output_env_init(output_env_t oenv,  int argc, char *argv[],
90                      time_unit_t tmu, gmx_bool view, xvg_format_t xvg_format,
91                      int verbosity, int debug_level)
92 {
93     int i;
94     int cmdlength=0;
95     char *argvzero=NULL, *extpos;
96
97     oenv->time_unit  = tmu;
98     oenv->view=view;
99     oenv->xvg_format = xvg_format;
100     oenv->verbosity=verbosity;
101     oenv->debug_level=debug_level;
102     oenv->program_name=NULL;
103
104     if (argv)
105     {
106         argvzero=argv[0];
107         assert(argvzero);
108     }
109     /* set program name */
110     if (argvzero)
111     {
112         /* if filename has file ending (e.g. .exe) then strip away */
113         extpos=strrchr(argvzero,'.');
114         if(extpos > strrchr(argvzero,DIR_SEPARATOR))
115         {
116             oenv->program_name=gmx_strndup(argvzero,extpos-argvzero);
117         }
118         else
119         {
120             oenv->program_name=gmx_strdup(argvzero);
121         }
122     }
123     if (oenv->program_name == NULL)
124     {
125         oenv->program_name = gmx_strdup("GROMACS");
126     }
127
128     /* copy command line */ 
129     if (argv) 
130     {
131         cmdlength = strlen(argvzero);
132         for (i=1; i<argc; i++) 
133         {
134             cmdlength += strlen(argv[i]);
135         }
136     }
137         
138     /* Fill the cmdline string */
139     snew(oenv->cmd_line,cmdlength+argc+1);
140     if (argv)
141     {
142         for (i=0; i<argc; i++)
143         {
144             strcat(oenv->cmd_line,argv[i]);
145             strcat(oenv->cmd_line," ");
146         }
147     }
148 }
149
150
151 void output_env_init_default(output_env_t oenv)
152 {
153     output_env_init(oenv, 0, NULL, time_ps, FALSE, exvgNONE, 0, 0);
154 }
155
156
157 void output_env_done(output_env_t oenv)
158 {
159     sfree(oenv->program_name);
160     sfree(oenv->cmd_line);
161     sfree(oenv);
162 }
163
164
165
166 int output_env_get_verbosity(const output_env_t oenv)
167 {
168     return oenv->verbosity;
169 }
170
171 int output_env_get_debug_level(const output_env_t oenv)
172 {
173     return oenv->debug_level;
174 }
175
176
177 const char *output_env_get_time_unit(const output_env_t oenv)
178 {
179     return time_units_str[oenv->time_unit];
180 }
181
182 const char *output_env_get_time_label(const output_env_t oenv)
183 {
184     char *label;
185     snew(label, 20);
186     
187     sprintf(label,"Time (%s)",time_units_str[oenv->time_unit] ? 
188             time_units_str[oenv->time_unit]: "ps");
189     
190     return label;
191 }
192
193 const char *output_env_get_xvgr_tlabel(const output_env_t oenv)
194 {
195     char *label;
196     snew(label, 20);
197     
198     sprintf(label,"Time (%s)", time_units_xvgr[oenv->time_unit] ?
199             time_units_xvgr[oenv->time_unit] : "ps");
200     
201     return label;
202 }
203
204
205 real output_env_get_time_factor(const output_env_t oenv)
206 {
207     return timefactors[oenv->time_unit];
208 }
209
210 real output_env_get_time_invfactor(const output_env_t oenv)
211 {
212     return timeinvfactors[oenv->time_unit];
213 }
214
215 real output_env_conv_time(const output_env_t oenv, real time)
216 {
217     return time*timefactors[oenv->time_unit];
218 }
219
220
221 void output_env_conv_times(const output_env_t oenv, int n, real *time)
222 {
223     int i;
224     double fact=timefactors[oenv->time_unit];
225     
226     if (fact!=1.)
227         for(i=0; i<n; i++)
228             time[i] *= fact;
229 }
230
231 gmx_bool output_env_get_view(const output_env_t oenv)
232 {
233     return oenv->view;
234 }
235
236 xvg_format_t output_env_get_xvg_format(const output_env_t oenv)
237 {
238     return oenv->xvg_format;
239 }
240
241 const char *output_env_get_program_name(const output_env_t oenv)
242 {
243     return oenv->program_name;
244 }
245
246 const char *output_env_get_short_program_name(const output_env_t oenv)
247 {
248     const char *pr,*ret;
249     pr=ret=oenv->program_name; 
250     if ((pr=strrchr(ret,DIR_SEPARATOR)) != NULL)
251         ret=pr+1;
252     /* Strip away the libtool prefix if it's still there. */
253     if(strlen(ret) > 3 && !strncmp(ret, "lt-", 3))
254         ret = ret + 3;
255     return ret;
256 }
257
258
259
260 const char *output_env_get_cmd_line(const output_env_t oenv)
261 {
262     return oenv->cmd_line;
263 }
264
265