====== Suggestion for implementation details of the BLHA2 accord ====== ==== C/C++ interface (pointer version) (olp.h) ==== #ifndef __OLP_H__ #define __OLP_H__ #ifdef __cplusplus extern "C" { #endif void OLP_Start(char* fname, int* ierr); void OLP_SetParameter(char* line, double* real_part, double* cmplx_part, int* status); void OLP_EvalSubProcess2(int* l, double* mom, double* mu, double* r, double* acc); void OLP_Info(char olp_name[15], char olp_version[15], char cite_message[255]); void OLP_Polvec(double* p, double* q, double* eps); // optional #ifdef __cplusplus } #endif // __cplusplus #endif // __OLP_H__ ==== C++ interface (reference version) ==== #ifndef __OLP_H__ #define __OLP_H__ extern "C" { void OLP_Start(char* fname, int &ierr); void OLP_SetParameter(char* line, double& real_part, double& cmplx_part, int& status); void OLP_EvalSubProcess2(int* l, double mom[], double* mu, double r[], double &acc); void OLP_Info(char olp_name[15], char olp_version[15], char cite_message[255]); void OLP_Polvec(double p[], double q[], double eps[]); // optional } #endif // __OLP_H__ ==== Fortran 2003 (or later) module for binding with C/C++: ==== module olp implicit none public :: OLP_Start, OLP_EvalSubProcess2, OLP_SetParameter public :: OLP_Info, OLP_Polvec contains subroutine OLP_Start(contract_file_name,ierr) & & bind(C,name="OLP_Start") use, intrinsic :: iso_c_binding implicit none character(kind=c_char,len=1), intent(in) :: contract_file_name integer(kind=c_int), intent(out) :: ierr interface function strlen(s) bind(C,name='strlen') use, intrinsic :: iso_c_binding implicit none character(kind=c_char,len=1), intent(in) :: s integer(kind=c_int) :: strlen end function strlen end interface ! ... ! open( ... , file=contract_file_name(1:strlen(l)), ...) ! ... end subroutine subroutine OLP_SetParameter(variable_name, real_part, complex_part, success) & & bind(C,name="OLP_SetParameter") use, intrinsic :: iso_c_binding implicit none character(kind=c_char,len=1), intent(in) :: variable_name real(kind=c_double), intent(in) :: real_part, complex_part integer(kind=c_int), intent(out) :: success !.... end subroutine subroutine OLP_EvalSubProcess2(label, momenta, mu, res, acc) & & bind(C,name="OLP_EvalSubProcess2") use, intrinsic :: iso_c_binding implicit none integer(kind=c_int), intent(in) :: label real(kind=c_double), intent(in) :: mu real(kind=c_double), dimension(50), intent(in) :: momenta real(kind=c_double), dimension(60), intent(out) :: res real(kind=c_double), dimension(1), intent(out) :: acc !.... end subroutine OLP_EvalSubProcess2 subroutine OLP_Info(olp_name, olp_version, cite_message) & & bind(C,name="OLP_Info") use, intrinsic :: iso_c_binding implicit none character(kind=c_char,len=1), intent(out) :: olp_name character(kind=c_char,len=1), intent(out) :: olp_version character(kind=c_char,len=1), intent(out) :: cite_message ! ... end subroutine OLP_Info subroutine OLP_Polvec(p, q, eps) & & bind(C,name="OLP_PolVec") use, intrinsic :: iso_c_binding implicit none real(ki), dimension(4), intent(in) :: p,q real(ki), dimension(8), intent(out) :: eps !.... optional end subroutine OLP_Polvec end module olp