1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
4 * This file is part of Gromacs Copyright (c) 1991-2008
5 * David van der Spoel, Erik Lindahl, Berk Hess, University of Groningen.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * To help us fund GROMACS development, we humbly ask that you cite
13 * the research papers on the package. Check out http://www.gromacs.org
16 * Gnomes, ROck Monsters And Chili Sauce
22 /* Derived from PluginMgr.C and catdcd.c */
24 /* PluginMgr.C: Copyright: */
25 /***************************************************************************
27 * cr (C) Copyright 1995-2009 The Board of Trustees of the
28 * cr University of Illinois
29 * cr All Rights Reserved
31 Developed by: Theoretical and Computational Biophysics Group
32 University of Illinois at Urbana-Champaign
33 http://www.ks.uiuc.edu/
35 Permission is hereby granted, free of charge, to any person obtaining a copy of
36 this software and associated documentation files (the Software), to deal with
37 the Software without restriction, including without limitation the rights to
38 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
39 of the Software, and to permit persons to whom the Software is furnished to
40 do so, subject to the following conditions:
42 Redistributions of source code must retain the above copyright notice,
43 this list of conditions and the following disclaimers.
45 Redistributions in binary form must reproduce the above copyright notice,
46 this list of conditions and the following disclaimers in the documentation
47 and/or other materials provided with the distribution.
49 Neither the names of Theoretical and Computational Biophysics Group,
50 University of Illinois at Urbana-Champaign, nor the names of its contributors
51 may be used to endorse or promote products derived from this Software without
52 specific prior written permission.
54 THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
55 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
56 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
57 THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
58 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
59 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
60 OTHER DEALINGS WITH THE SOFTWARE.
61 ***************************************************************************/
63 /* catdcd.c: Copyright: */
64 /*****************************************************************************/
66 /* (C) Copyright 2001-2005 Justin Gullingsrud and the University of Illinois.*/
68 /*****************************************************************************/
76 * Plugin header files; get plugin source from www.ks.uiuc.edu/Research/vmd"
78 #include "external/vmd_molfile/molfile_plugin.h"
79 #include "external/vmd_molfile/vmddlopen.h"
80 #ifndef GMX_NATIVE_WINDOWS
91 #include "types/simple.h"
96 typedef int (*initfunc)(void);
97 typedef int (*regfunc)(void *, vmdplugin_register_cb);
98 typedef int (*finifunc)(void);
102 static int register_cb(void *v, vmdplugin_t *p)
104 const char *key = p->name;
105 t_gmxvmdplugin *vmdplugin = (t_gmxvmdplugin*)v;
107 if (strcmp(key, vmdplugin->filetype) == 0)
109 vmdplugin->api = (molfile_plugin_t *)p;
111 return VMDPLUGIN_SUCCESS;
114 static int load_sharedlibrary_plugins(const char *fullpath, t_gmxvmdplugin* vmdplugin)
116 /* Open the dll; try to execute the init function. */
117 void *handle, *ifunc, *registerfunc;
118 handle = vmddlopen(fullpath);
123 fprintf(debug, "\nUnable to open dynamic library %s.\n%s\n", fullpath, vmddlerror()); /*only to debug because of stdc++ erros */
128 ifunc = vmddlsym(handle, "vmdplugin_init");
129 if (!ifunc || ((initfunc)(ifunc))())
131 printf("\nvmdplugin_init() for %s returned an error; plugin(s) not loaded.\n", fullpath);
136 registerfunc = vmddlsym(handle, "vmdplugin_register");
139 printf("\nDidn't find the register function in %s; plugin(s) not loaded.\n", fullpath);
145 /* Load plugins from the library.*/
146 ((regfunc)registerfunc)(vmdplugin, register_cb);
149 /* in case this library does not support the filetype, close it */
150 if (vmdplugin->api == NULL)
158 /*return: 1: success, 0: last frame, -1: error*/
159 gmx_bool read_next_vmd_frame(t_trxframe *fr)
163 molfile_timestep_t ts;
166 fr->bV = fr->vmdplugin->bV;
169 snew(ts.coords, fr->natoms*3);
172 snew(ts.velocities, fr->natoms*3);
175 ts.coords = (float*)fr->x;
178 ts.velocities = (float*)fr->v;
182 rc = fr->vmdplugin->api->read_next_timestep(fr->vmdplugin->handle, fr->natoms, &ts);
186 fprintf(stderr, "\nError reading input file (error code %d)\n", rc);
190 fr->vmdplugin->api->close_file_read(fr->vmdplugin->handle);
195 for (i = 0; i < fr->natoms; i++)
197 fr->x[i][0] = .1*ts.coords[i*3];
198 fr->x[i][1] = .1*ts.coords[i*3+1];
199 fr->x[i][2] = .1*ts.coords[i*3+2];
202 fr->v[i][0] = .1*ts.velocities[i*3];
203 fr->v[i][1] = .1*ts.velocities[i*3+1];
204 fr->v[i][2] = .1*ts.velocities[i*3+2];
210 sfree(ts.velocities);
213 for (i = 0; i < fr->natoms; i++)
215 svmul(.1, fr->x[i], fr->x[i]);
218 svmul(.1, fr->v[i], fr->v[i]);
225 vec[0] = .1*ts.A; vec[1] = .1*ts.B; vec[2] = .1*ts.C;
226 angle[0] = ts.alpha; angle[1] = ts.beta; angle[2] = ts.gamma;
227 matrix_convert(fr->box, vec, angle);
228 if (fr->vmdplugin->api->abiversion > 10)
231 fr->time = ts.physical_time;
242 static int load_vmd_library(const char *fn, t_gmxvmdplugin *vmdplugin)
244 char pathname[GMX_PATH_MAX], filename[GMX_PATH_MAX];
249 char pathenv_buffer[GMX_PATH_MAX];
250 #ifndef GMX_NATIVE_WINDOWS
252 const char *defpath_suffix = "/plugins/*/molfile";
253 const char *defpathenv = GMX_VMD_PLUGIN_PATH;
256 HANDLE hFind = INVALID_HANDLE_VALUE;
257 char progfolder[GMX_PATH_MAX];
258 char defpathenv[GMX_PATH_MAX];
259 const char *defpath_suffix = "\\plugins\\WIN32\\molfile";
260 SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progfolder);
261 sprintf(defpathenv, "%s\\University of Illinois\\VMD\\plugins\\WIN32\\molfile", progfolder);
264 vmdplugin->api = NULL;
265 vmdplugin->filetype = strrchr(fn, '.');
266 if (!vmdplugin->filetype)
270 vmdplugin->filetype++;
272 /* First look for an explicit path given at run time for the
273 * plugins, then an implicit run-time path, and finally for one
274 * given at configure time. This last might be hard-coded to the
275 * default for VMD installs. */
276 pathenv = getenv("VMD_PLUGIN_PATH");
279 pathenv = getenv("VMDDIR");
282 printf("\nNeither VMD_PLUGIN_PATH or VMDDIR set. ");
283 printf("Using default location:\n%s\n", defpathenv);
284 pathenv = defpathenv;
288 printf("\nVMD_PLUGIN_PATH no set, but VMDDIR is set. ");
290 _snprintf_s(pathenv_buffer, sizeof(pathenv_buffer), _TRUNCATE, "%s%s", pathenv, defpath_suffix);
292 snprintf(pathenv_buffer, sizeof(pathenv_buffer), "%s%s", pathenv, defpath_suffix);
294 printf("Using semi-default location:\n%s\n", pathenv_buffer);
295 pathenv = pathenv_buffer;
298 strncpy(pathname, pathenv, sizeof(pathname));
299 #ifndef GMX_NATIVE_WINDOWS
300 strcat(pathname, "/*.so");
301 glob(pathname, 0, NULL, &globbuf);
302 if (globbuf.gl_pathc == 0)
304 printf("\nNo VMD Plugins found\n"
305 "Set the environment variable VMD_PLUGIN_PATH to the molfile folder within the\n"
306 "VMD installation.\n"
307 "The architecture (e.g. 32bit versus 64bit) of Gromacs and VMD has to match.\n");
310 for (i = 0; i < globbuf.gl_pathc && vmdplugin->api == NULL; i++)
312 /* FIXME: Undefined which plugin is chosen if more than one plugin
313 can read a certain file ending. Requires some additional command
314 line option or enviroment variable to specify which plugin should
317 ret |= load_sharedlibrary_plugins(globbuf.gl_pathv[i], vmdplugin);
321 strcat(pathname, "\\*.so");
322 hFind = FindFirstFile(pathname, &ffd);
323 if (INVALID_HANDLE_VALUE == hFind)
325 printf("\nNo VMD Plugins found\n");
330 sprintf(filename, "%s\\%s", pathenv, ffd.cFileName);
331 ret |= load_sharedlibrary_plugins(filename, vmdplugin);
333 while (FindNextFile(hFind, &ffd ) != 0 && vmdplugin->api == NULL);
339 printf("\nCould not open any VMD library.\n");
343 printf("Compiled with dlopen?\n");
347 printf("Last error:\n%s\n", err);
352 if (vmdplugin->api == NULL)
354 printf("\nNo plugin for %s found\n", vmdplugin->filetype);
358 if (vmdplugin->api->abiversion < 10)
360 printf("\nPlugin and/or VMD is too old. At least VMD 1.8.6 is required.\n");
364 printf("\nUsing VMD plugin: %s (%s)\n", vmdplugin->api->name, vmdplugin->api->prettyname);
370 int read_first_vmd_frame(const char *fn, t_trxframe *fr)
372 molfile_timestep_metadata_t *metadata = NULL;
374 snew(fr->vmdplugin, 1);
375 if (!load_vmd_library(fn, fr->vmdplugin))
380 fr->vmdplugin->handle = fr->vmdplugin->api->open_file_read(fn, fr->vmdplugin->filetype, &fr->natoms);
382 if (!fr->vmdplugin->handle)
384 fprintf(stderr, "\nError: could not open file '%s' for reading.\n",
389 if (fr->natoms == MOLFILE_NUMATOMS_UNKNOWN)
391 fprintf(stderr, "\nFormat of file %s does not record number of atoms.\n", fn);
394 else if (fr->natoms == MOLFILE_NUMATOMS_NONE)
396 fprintf(stderr, "\nNo atoms found by VMD plugin in file %s.\n", fn );
399 else if (fr->natoms < 1) /*should not be reached*/
401 fprintf(stderr, "\nUnknown number of atoms %d for VMD plugin opening file %s.\n",
406 snew(fr->x, fr->natoms);
408 fr->vmdplugin->bV = 0;
409 if (fr->vmdplugin->api->abiversion > 10 && fr->vmdplugin->api->read_timestep_metadata)
411 fr->vmdplugin->api->read_timestep_metadata(fr->vmdplugin->handle, metadata);
413 fr->vmdplugin->bV = metadata->has_velocities;
414 if (fr->vmdplugin->bV)
416 snew(fr->v, fr->natoms);
422 "\nThis trajectory is being read with a VMD plug-in from before VMD"
423 "\nversion 1.8, or from a trajectory that lacks time step metadata."
424 "\nEither way, GROMACS cannot tell whether the trajectory has velocities.\n");