MODULE OpenMM_Types implicit none ! Global Constants real*8, parameter :: OpenMM_ ! Type Declarations type OpenMM_ integer*8 :: handle = 0 end type type OpenMM_Vec3Array integer*8 :: handle = 0 end type type OpenMM_StringArray integer*8 :: handle = 0 end type type OpenMM_BondArray integer*8 :: handle = 0 end type type OpenMM_ParameterArray integer*8 :: handle = 0 end type type OpenMM_PropertyArray integer*8 :: handle = 0 end type type OpenMM_DoubleArray integer*8 :: handle = 0 end type type OpenMM_IntArray integer*8 :: handle = 0 end type ! Enumerations integer*4, parameter :: OpenMM_False = 0 integer*4, parameter :: OpenMM_True = 1 END MODULE OpenMM_Types MODULE OpenMM use OpenMM_Types; implicit none interface ! OpenMM_Vec3 subroutine OpenMM_Vec3_scale(vec, scale, result) use OpenMM_Types; implicit none real*8 vec(3) real*8 scale real*8 result(3) end subroutine ! OpenMM_Vec3Array subroutine OpenMM_Vec3Array_create(result, size) use OpenMM_Types; implicit none integer*4 size type (OpenMM_Vec3Array) result end subroutine subroutine OpenMM_Vec3Array_destroy(destroy) use OpenMM_Types; implicit none type (OpenMM_Vec3Array) destroy end subroutine function OpenMM_Vec3Array_getSize(target) use OpenMM_Types; implicit none type (OpenMM_Vec3Array) target integer*4 OpenMM_Vec3Array_getSize end function subroutine OpenMM_Vec3Array_resize(target, size) use OpenMM_Types; implicit none type (OpenMM_Vec3Array) target integer*4 size end subroutine subroutine OpenMM_Vec3Array_append(target, vec) use OpenMM_Types; implicit none type (OpenMM_Vec3Array) target real*8 vec(3) end subroutine subroutine OpenMM_Vec3Array_set(target, index, vec) use OpenMM_Types; implicit none type (OpenMM_Vec3Array) target integer*4 index real*8 vec(3) end subroutine subroutine OpenMM_Vec3Array_get(target, index, result) use OpenMM_Types; implicit none type (OpenMM_Vec3Array) target integer*4 index real*8 result(3) end subroutine ! OpenMM_StringArray subroutine OpenMM_StringArray_create(result, size) use OpenMM_Types; implicit none integer*4 size type (OpenMM_StringArray) result end subroutine subroutine OpenMM_StringArray_destroy(destroy) use OpenMM_Types; implicit none type (OpenMM_StringArray) destroy end subroutine function OpenMM_StringArray_getSize(target) use OpenMM_Types; implicit none type (OpenMM_StringArray) target integer*4 OpenMM_StringArray_getSize end function subroutine OpenMM_StringArray_resize(target, size) use OpenMM_Types; implicit none type (OpenMM_StringArray) target integer*4 size end subroutine subroutine OpenMM_StringArray_append(target, str) use OpenMM_Types; implicit none type (OpenMM_StringArray) target character(*) str end subroutine subroutine OpenMM_StringArray_set(target, index, str) use OpenMM_Types; implicit none type (OpenMM_StringArray) target integer*4 index character(*) str end subroutine subroutine OpenMM_StringArray_get(target, index, result) use OpenMM_Types; implicit none type (OpenMM_StringArray) target integer*4 index character(*) result end subroutine ! OpenMM_BondArray subroutine OpenMM_BondArray_create(result, size) use OpenMM_Types; implicit none integer*4 size type (OpenMM_BondArray) result end subroutine subroutine OpenMM_BondArray_destroy(destroy) use OpenMM_Types; implicit none type (OpenMM_BondArray) destroy end subroutine function OpenMM_BondArray_getSize(target) use OpenMM_Types; implicit none type (OpenMM_BondArray) target integer*4 OpenMM_BondArray_getSize end function subroutine OpenMM_BondArray_resize(target, size) use OpenMM_Types; implicit none type (OpenMM_BondArray) target integer*4 size end subroutine subroutine OpenMM_BondArray_append(target, particle1, particle2) use OpenMM_Types; implicit none type (OpenMM_BondArray) target integer*4 particle1 integer*4 particle2 end subroutine subroutine OpenMM_BondArray_set(target, index, particle1, particle2) use OpenMM_Types; implicit none type (OpenMM_BondArray) target integer*4 index integer*4 particle1 integer*4 particle2 end subroutine subroutine OpenMM_BondArray_get(target, index, particle1, particle2) use OpenMM_Types; implicit none type (OpenMM_BondArray) target integer*4 index integer*4 particle1 integer*4 particle2 end subroutine ! OpenMM_ParameterArray function OpenMM_ParameterArray_getSize(target) use OpenMM_Types; implicit none type (OpenMM_ParameterArray) target integer*4 OpenMM_ParameterArray_getSize end function subroutine OpenMM_ParameterArray_get(target, name, result) use OpenMM_Types; implicit none type (OpenMM_ParameterArray) target character(*) name character(*) result end subroutine ! OpenMM_PropertyArray function OpenMM_PropertyArray_getSize(target) use OpenMM_Types; implicit none type (OpenMM_ParameterArray) target integer*4 OpenMM_PropertyArray_getSize end function subroutine OpenMM_PropertyArray_get(target, name, result) use OpenMM_Types; implicit none type (OpenMM_PropertyArray) target character(*) name character(*) result end subroutine ! These methods need to be handled specially, since their C++ APIs cannot be directly translated to Fortran. ! Unlike the C++ versions, the return value is allocated on the heap, and you must delete it yourself. subroutine OpenMM_Context_getState(target, types, enforcePeriodicBox, result) use OpenMM_Types; implicit none type (OpenMM_Context) target integer*4 types integer*4 enforcePeriodicBox type (OpenMM_State) result end subroutine subroutine OpenMM_Platform_loadPluginsFromDirectory(directory, result) use OpenMM_Types; implicit none character(*) directory type (OpenMM_StringArray) result end subroutine end interface END MODULE OpenMM ! subroutine _create(result, size) use OpenMM_Types; implicit none integer*4 size type () result end subroutine subroutine _destroy(destroy) use OpenMM_Types; implicit none type () destroy end subroutine function _getSize(target) use OpenMM_Types; implicit none type () target integer*4 _getSize end function subroutine _resize(target, size) use OpenMM_Types; implicit none type () target integer*4 size end subroutine subroutine _append(target, value) use OpenMM_Types; implicit none type () target value end subroutine subroutine _set(target, index, value) use OpenMM_Types; implicit none type () target integer*4 index value end subroutine subroutine _get(target, index, result) use OpenMM_Types; implicit none type () target integer*4 index result end subroutine ! OpenMM:: integer*4, parameter :: OpenMM_ subroutine OpenMM_ use OpenMM_Types; implicit none type (OpenMM_ subroutine OpenMM_ use OpenMM_Types; implicit none type (OpenMM_ function subroutine , & , & use OpenMM_Types; implicit none type (OpenMM_ 1