Files
lammps/src/MOLFILE/molfile_interface.h
2021-10-12 21:47:02 -04:00

171 lines
6.0 KiB
C++

/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing author: Axel Kohlmeyer (Temple U)
------------------------------------------------------------------------- */
#ifndef LMP_MOLFILE_INTERFACE_H
#define LMP_MOLFILE_INTERFACE_H
namespace LAMMPS_NS {
// This class provides an abstract interface
// to the VMD plugin library.
class MolfileInterface {
public:
// plugin modes.
enum {
M_NONE = 0,
M_READ = 1 << 0,
M_WRITE = 1 << 1,
M_RSTRUCT = 1 << 2,
M_WSTRUCT = 1 << 3,
M_RBONDS = 1 << 4,
M_WBONDS = 1 << 5,
M_RANGLES = 1 << 6,
M_WANGLES = 1 << 7,
M_RVOL = 1 << 8,
M_WVOL = 1 << 9,
M_RVELS = 1 << 10,
M_WVELS = 1 << 11,
M_LAST = 1 << 12
};
// plugin finder return values.
enum {
E_NONE = 0, //< nothing happened
E_DIR, //< path is not a directory or not readable
E_FILE, //< file not a DSO or not readable
E_SYMBOL, //< DSO is not a VMD plugin
E_TYPE, //< plugin is not of the correct type
E_ABI, //< plugin ABI does not match
E_MODE, //< plugin does not support desired mode
E_VERSION, //< plugin is not newer as the current one
E_MATCH, //< plugin matches
E_LAST //< last entry
};
// atom structure properties. deliberately not complete.
enum {
P_NONE = 0, //< no structure information available
P_NAME = 1 << 0, //< atom name, char[16]
P_TYPE = 1 << 1, //< atom type, char[16]
P_RESN = 1 << 2, //< residue name, char[ 8]
P_RESI = 1 << 3, //< residue index, int
P_SEGN = 1 << 4, //< segment name, char[ 8]
P_CHAI = 1 << 5, //< chain id, char[ 2]
P_OCCP = 1 << 6, //< occupancy, float
P_BFAC = 1 << 7, //< B factor, float
P_MASS = 1 << 8, //< atom mass, float
P_CHRG = 1 << 9, //< atom charge, float
P_RADS = 1 << 10, //< atom radius, float
P_ATMN = 1 << 11, //< atomic number, int
P_LAST = 1 << 12 //< last entry
};
MolfileInterface(const char *type, const int mode);
~MolfileInterface();
// disallowed default methods
private:
MolfileInterface(){};
MolfileInterface(const MolfileInterface &){};
MolfileInterface &operator=(const MolfileInterface &) { return *this; };
public:
// search in the given directory path for a molfile plugin that
// is of the right type and supports the desired mode.
// if a plugin is already registered and a newer version is
// found, this new version will override the old one.
int find_plugin(const char *path);
// try to register the plugin at given file name
int load_plugin(const char *name);
// deregister the current plugin/DSO and clean up.
void forget_plugin();
// return formatted string describing plugin
char *get_plugin_name() const { return _name; };
// return canonical plugin name (= file type)
char *get_plugin_type() const { return _type; };
// file operations
// open file through plugin
int open(const char *name, int *natoms);
// read/write structure info
int structure();
// read/write timestep
int timestep(float *coords, float *vels, float *cell, double *simtime);
// close file managed by plugin
int close();
// inquire on interface status
// true if file stream is active.
bool is_open() const { return (_ptr != nullptr); };
// true if file format requires or provides atom properties
bool has_props() const { return (_mode & (M_RSTRUCT | M_WSTRUCT)) != 0; };
// true if file format can read or write velocities
bool has_vels() const { return (_mode & (M_RVELS | M_WVELS)) != 0; };
// return number of atoms in current file. -1 if closed/invalid;
bool get_natoms() const { return _natoms; };
// return property bitmask
bool get_props() const { return _props; };
// atom property operations
// set/get atom floating point property
int property(int propid, int idx, float *prop);
// set/get per type floating point property
int property(int propid, int *types, float *prop);
// set/get per atom floating point property
int property(int propid, float *prop);
// set/get atom floating point property
int property(int propid, int idx, double *prop);
// set/get per type floating point property
int property(int propid, int *types, double *prop);
// set/get per atom floating point property
int property(int propid, double *prop);
// set/get atom integer property
int property(int propid, int idx, int *prop);
// set/get per type integer property
int property(int propid, int *types, int *prop);
// set/get per atom integer property
int property(int propid, int *prop);
// set/get atom string property
int property(int propid, int idx, char *prop);
// set/get per type string property
int property(int propid, int *types, char **prop);
// set/get per atom string property
int property(int propid, char **prop);
// internal data
protected:
void *_plugin; // pointer to plugin struct
void *_dso; // handle to DSO
void *_ptr; // pointer to plugin data handle
void *_info; // pointer to atomic info data
char *_type; // canonical plugin name
char *_name; // plugin formatted name
int _natoms; // number of atoms
int _mode; // plugin mode of operation
int _caps; // plugin capabilities
int _props; // accumulated/available properties
};
} // namespace LAMMPS_NS
#endif