#include "OpenMM.h" #include "OpenMMCWrapper.h" #include <cstring> #include <vector> using namespace OpenMM; using namespace std; extern "C" { /* OpenMM_Vec3 */ OPENMM_EXPORT void openmm_vec3_scale_(const OpenMM_Vec3& vec, double const& scale, OpenMM_Vec3& result) { result = OpenMM_Vec3_scale(vec, scale); } OPENMM_EXPORT void OPENMM_VEC3_SCALE(const OpenMM_Vec3& vec, double const& scale, OpenMM_Vec3& result) { result = OpenMM_Vec3_scale(vec, scale); } /* OpenMM_Vec3Array */ OPENMM_EXPORT void openmm_vec3array_create_(OpenMM_Vec3Array*& result, const int& size) { result = OpenMM_Vec3Array_create(size); } OPENMM_EXPORT void OPENMM_VEC3ARRAY_CREATE(OpenMM_Vec3Array*& result, const int& size) { result = OpenMM_Vec3Array_create(size); } OPENMM_EXPORT void openmm_vec3array_destroy_(OpenMM_Vec3Array*& array) { OpenMM_Vec3Array_destroy(array); array = 0; } OPENMM_EXPORT void OPENMM_VEC3ARRAY_DESTROY(OpenMM_Vec3Array*& array) { OpenMM_Vec3Array_destroy(array); array = 0; } OPENMM_EXPORT int openmm_vec3array_getsize_(const OpenMM_Vec3Array* const& array) { return OpenMM_Vec3Array_getSize(array); } OPENMM_EXPORT int OPENMM_VEC3ARRAY_GETSIZE(const OpenMM_Vec3Array* const& array) { return OpenMM_Vec3Array_getSize(array); } OPENMM_EXPORT void openmm_vec3array_resize_(OpenMM_Vec3Array* const& array, const int& size) { OpenMM_Vec3Array_resize(array, size); } OPENMM_EXPORT void OPENMM_VEC3ARRAY_RESIZE(OpenMM_Vec3Array* const& array, const int& size) { OpenMM_Vec3Array_resize(array, size); } OPENMM_EXPORT void openmm_vec3array_append_(OpenMM_Vec3Array* const& array, const OpenMM_Vec3& vec) { OpenMM_Vec3Array_append(array, vec); } OPENMM_EXPORT void OPENMM_VEC3ARRAY_APPEND(OpenMM_Vec3Array* const& array, const OpenMM_Vec3& vec) { OpenMM_Vec3Array_append(array, vec); } OPENMM_EXPORT void openmm_vec3array_set_(OpenMM_Vec3Array* const& array, const int& index, const OpenMM_Vec3& vec) { OpenMM_Vec3Array_set(array, index-1, vec); } OPENMM_EXPORT void OPENMM_VEC3ARRAY_SET(OpenMM_Vec3Array* const& array, const int& index, const OpenMM_Vec3& vec) { OpenMM_Vec3Array_set(array, index-1, vec); } OPENMM_EXPORT void openmm_vec3array_get_(const OpenMM_Vec3Array* const& array, const int& index, OpenMM_Vec3& result) { result = *OpenMM_Vec3Array_get(array, index-1); } OPENMM_EXPORT void OPENMM_VEC3ARRAY_GET(const OpenMM_Vec3Array* const& array, const int& index, OpenMM_Vec3& result) { result = *OpenMM_Vec3Array_get(array, index-1); } /* OpenMM_StringArray */ static void copyAndPadString(char* dest, const char* source, int length) { bool reachedEnd = false; for (int i = 0; i < length; i++) { if (source[i] == 0) reachedEnd = true; dest[i] = (reachedEnd ? ' ' : source[i]); } } /* copy blank-trimmed Fortran string into an std::string */ static string makeString(const char* fsrc, int length) { while (length && fsrc[length-1]==' ') --length; return string(fsrc, length); } OPENMM_EXPORT void openmm_stringarray_create_(OpenMM_StringArray*& result, const int& size) { result = OpenMM_StringArray_create(size); } OPENMM_EXPORT void OPENMM_STRINGARRAY_CREATE(OpenMM_StringArray*& result, const int& size) { result = OpenMM_StringArray_create(size); } OPENMM_EXPORT void openmm_stringarray_destroy_(OpenMM_StringArray*& array) { OpenMM_StringArray_destroy(array); array = 0; } OPENMM_EXPORT void OPENMM_STRINGARRAY_DESTROY(OpenMM_StringArray*& array) { OpenMM_StringArray_destroy(array); array = 0; } OPENMM_EXPORT int openmm_stringarray_getsize_(const OpenMM_StringArray* const& array) { return OpenMM_StringArray_getSize(array); } OPENMM_EXPORT int OPENMM_STRINGARRAY_GETSIZE(const OpenMM_StringArray* const& array) { return OpenMM_StringArray_getSize(array); } OPENMM_EXPORT void openmm_stringarray_resize_(OpenMM_StringArray* const& array, const int& size) { OpenMM_StringArray_resize(array, size); } OPENMM_EXPORT void OPENMM_STRINGARRAY_RESIZE(OpenMM_StringArray* const& array, const int& size) { OpenMM_StringArray_resize(array, size); } OPENMM_EXPORT void openmm_stringarray_append_(OpenMM_StringArray* const& array, const char* str, int length) { OpenMM_StringArray_append(array, makeString(str, length).c_str()); } OPENMM_EXPORT void OPENMM_STRINGARRAY_APPEND(OpenMM_StringArray* const& array, const char* str, int length) { OpenMM_StringArray_append(array, makeString(str, length).c_str()); } OPENMM_EXPORT void openmm_stringarray_set_(OpenMM_StringArray* const& array, const int& index, const char* str, int length) { OpenMM_StringArray_set(array, index-1, makeString(str, length).c_str()); } OPENMM_EXPORT void OPENMM_STRINGARRAY_SET(OpenMM_StringArray* const& array, const int& index, const char* str, int length) { OpenMM_StringArray_set(array, index-1, makeString(str, length).c_str()); } OPENMM_EXPORT void openmm_stringarray_get_(const OpenMM_StringArray* const& array, const int& index, char* result, int length) { const char* str = OpenMM_StringArray_get(array, index-1); copyAndPadString(result, str, length); } OPENMM_EXPORT void OPENMM_STRINGARRAY_GET(const OpenMM_StringArray* const& array, const int& index, char* result, int length) { const char* str = OpenMM_StringArray_get(array, index-1); copyAndPadString(result, str, length); } /* OpenMM_BondArray */ OPENMM_EXPORT void openmm_bondarray_create_(OpenMM_BondArray*& result, const int& size) { result = OpenMM_BondArray_create(size); } OPENMM_EXPORT void OPENMM_BONDARRAY_CREATE(OpenMM_BondArray*& result, const int& size) { result = OpenMM_BondArray_create(size); } OPENMM_EXPORT void openmm_bondarray_destroy_(OpenMM_BondArray*& array) { OpenMM_BondArray_destroy(array); array = 0; } OPENMM_EXPORT void OPENMM_BONDARRAY_DESTROY(OpenMM_BondArray*& array) { OpenMM_BondArray_destroy(array); array = 0; } OPENMM_EXPORT int openmm_bondarray_getsize_(const OpenMM_BondArray* const& array) { return OpenMM_BondArray_getSize(array); } OPENMM_EXPORT int OPENMM_BONDARRAY_GETSIZE(const OpenMM_BondArray* const& array) { return OpenMM_BondArray_getSize(array); } OPENMM_EXPORT void openmm_bondarray_resize_(OpenMM_BondArray* const& array, const int& size) { OpenMM_BondArray_resize(array, size); } OPENMM_EXPORT void OPENMM_BONDARRAY_RESIZE(OpenMM_BondArray* const& array, const int& size) { OpenMM_BondArray_resize(array, size); } OPENMM_EXPORT void openmm_bondarray_append_(OpenMM_BondArray* const& array, const int& particle1, const int& particle2) { OpenMM_BondArray_append(array, particle1, particle2); } OPENMM_EXPORT void OPENMM_BONDARRAY_APPEND(OpenMM_BondArray* const& array, const int& particle1, const int& particle2) { OpenMM_BondArray_append(array, particle1, particle2); } OPENMM_EXPORT void openmm_bondarray_set_(OpenMM_BondArray* const& array, const int& index, const int& particle1, const int& particle2) { OpenMM_BondArray_set(array, index-1, particle1, particle2); } OPENMM_EXPORT void OPENMM_BONDARRAY_SET(OpenMM_BondArray* const& array, const int& index, const int& particle1, const int& particle2) { OpenMM_BondArray_set(array, index-1, particle1, particle2); } OPENMM_EXPORT void openmm_bondarray_get_(const OpenMM_BondArray* const& array, const int& index, int* particle1, int* particle2) { OpenMM_BondArray_get(array, index-1, particle1, particle2); } OPENMM_EXPORT void OPENMM_BONDARRAY_GET(const OpenMM_BondArray* const& array, const int& index, int* particle1, int* particle2) { OpenMM_BondArray_get(array, index-1, particle1, particle2); } /* OpenMM_ParameterArray */ OPENMM_EXPORT int openmm_parameterarray_getsize_(const OpenMM_ParameterArray* const& array) { return OpenMM_ParameterArray_getSize(array); } OPENMM_EXPORT int OPENMM_PARAMETERARRAY_GETSIZE(const OpenMM_ParameterArray* const& array) { return OpenMM_ParameterArray_getSize(array); } OPENMM_EXPORT double openmm_parameterarray_get_(const OpenMM_ParameterArray* const& array, const char* name, int length) { return OpenMM_ParameterArray_get(array, makeString(name, length).c_str()); } OPENMM_EXPORT double OPENMM_PARAMETERARRAY_GET(const OpenMM_ParameterArray* const& array, const char* name, int length) { return OpenMM_ParameterArray_get(array, makeString(name, length).c_str()); } /* These methods need to be handled specially, since their C++ APIs cannot be directly translated to C. Unlike the C++ versions, the return value is allocated on the heap, and you must delete it yourself. */ OPENMM_EXPORT void openmm_context_getstate_(const OpenMM_Context*& target, int const& types, OpenMM_State*& result) { result = OpenMM_Context_getState(target, types); }; OPENMM_EXPORT void OPENMM_CONTEXT_GETSTATE(const OpenMM_Context*& target, int const& types, OpenMM_State*& result) { result = OpenMM_Context_getState(target, types); }; OPENMM_EXPORT void openmm_platform_loadpluginsfromdirectory_(const char* directory, OpenMM_StringArray*& result, int length) { result = OpenMM_Platform_loadPluginsFromDirectory(makeString(directory, length).c_str()); }; OPENMM_EXPORT void OPENMM_PLATFORM_LOADPLUGINSFROMDIRECTORY(const char* directory, OpenMM_StringArray*& result, int length) { result = OpenMM_Platform_loadPluginsFromDirectory(makeString(directory, length).c_str()); }; } /* */ OPENMM_EXPORT void _create_(*& result, const int& size) { result = _create(size); } OPENMM_EXPORT void _CREATE(*& result, const int& size) { result = _create(size); } OPENMM_EXPORT void _destroy_(*& array) { _destroy(array); array = 0; } OPENMM_EXPORT void _DESTROY(*& array) { _destroy(array); array = 0; } OPENMM_EXPORT int _getsize_(const * const& array) { return _getSize(array); } OPENMM_EXPORT int _GETSIZE(const * const& array) { return _getSize(array); } OPENMM_EXPORT void _resize_(* const& array, const int& size) { _resize(array, size); } OPENMM_EXPORT void _RESIZE(* const& array, const int& size) { _resize(array, size); } OPENMM_EXPORT void _append_(* const& array, value) { _append(array, value); } OPENMM_EXPORT void _APPEND(* const& array, value) { _append(array, value); } OPENMM_EXPORT void _set_(* const& array, const int& index, value) { _set(array, index-1, value); } OPENMM_EXPORT void _SET(* const& array, const int& index, value) { _set(array, index-1, value); } OPENMM_EXPORT void _get_(const * const& array, const int& index, & result) { result = _get(array, index-1); } OPENMM_EXPORT void _GET(const * const& array, const int& index, & result) { result = _get(array, index-1); } /* OpenMM:: OPENMM_EXPORT & const& result = OpenMM_ , } OPENMM_EXPORT OpenMM_ destroy = 0; } OPENMM_EXPORT , & const& , target , copyAndPadString(result, result_chars, result_length); }; 1 1 1 1 1 1 1 1