This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
2013:groups:sm:blha:api [2013/06/13 13:50] johann_felix.graf_von_sodenfraunhofen suggestion for c-compatible fortran interface |
2013:groups:sm:blha:api [2013/08/14 11:37] (current) johann_felix.graf_von_sodenfraunhofen OLP_Polvec added, C++ reference version adapted. |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Suggestion for implementation details of the BLHA2 accord ====== | ||
| - | C/C++ interface (pointer version) (olp.h) | ||
| - | <code c++> | + | ==== C/C++ interface (pointer version) (olp.h) ==== |
| + | |||
| + | <code c++ olp.h> | ||
| #ifndef __OLP_H__ | #ifndef __OLP_H__ | ||
| #define __OLP_H__ | #define __OLP_H__ | ||
| Line 11: | Line 13: | ||
| void OLP_Start(char* fname, int* ierr); | void OLP_Start(char* fname, int* ierr); | ||
| - | void OLP_SetParameter(char* line, double* real_part, double *cmplx_part, int* status); | + | void OLP_SetParameter(char* line, double* real_part, double* cmplx_part, int* status); |
| - | void OLP_EvalSubProcess2(int l, double* mom, double mu, double* r, 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 | #ifdef __cplusplus | ||
| Line 20: | Line 24: | ||
| </code> | </code> | ||
| - | C++ interface (reference version) | + | ==== C++ interface (reference version) ==== |
| - | <code c++> | + | <code c++ olp.h> |
| #ifndef __OLP_H__ | #ifndef __OLP_H__ | ||
| #define __OLP_H__ | #define __OLP_H__ | ||
| Line 30: | Line 34: | ||
| void OLP_Start(char* fname, int &ierr); | void OLP_Start(char* fname, int &ierr); | ||
| void OLP_SetParameter(char* line, double& real_part, double& cmplx_part, int& status); | void OLP_SetParameter(char* line, double& real_part, double& cmplx_part, int& status); | ||
| - | void OLP_EvalSubProcess2(int l, double& mom, double& mu, double& r, 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 | ||
| } | } | ||
| Line 38: | Line 44: | ||
| - | Fortran 2003 (or later) module for binding with C/C++: | + | ==== Fortran 2003 (or later) module for binding with C/C++: ==== |
| - | <code fortran> | + | <code fortran olp.f90> |
| module olp | module olp | ||
| implicit none | implicit none | ||
| public :: OLP_Start, OLP_EvalSubProcess2, OLP_SetParameter | public :: OLP_Start, OLP_EvalSubProcess2, OLP_SetParameter | ||
| + | public :: OLP_Info, OLP_Polvec | ||
| contains | contains | ||
| Line 76: | Line 83: | ||
| implicit none | implicit none | ||
| character(kind=c_char,len=1), intent(in) :: variable_name | character(kind=c_char,len=1), intent(in) :: variable_name | ||
| - | real(kind=c_double), value, intent(in) :: real_part, complex_part | + | real(kind=c_double), intent(in) :: real_part, complex_part |
| integer(kind=c_int), intent(out) :: success | integer(kind=c_int), intent(out) :: success | ||
| Line 82: | Line 89: | ||
| end subroutine | end subroutine | ||
| - | subroutine OLP_EvalSubProcess2(label, momenta, mu, res, rstatus) & | + | subroutine OLP_EvalSubProcess2(label, momenta, mu, res, acc) & |
| & bind(C,name="OLP_EvalSubProcess2") | & bind(C,name="OLP_EvalSubProcess2") | ||
| use, intrinsic :: iso_c_binding | use, intrinsic :: iso_c_binding | ||
| implicit none | implicit none | ||
| - | integer(kind=c_int), value, intent(in) :: label | + | integer(kind=c_int), intent(in) :: label |
| - | real(kind=c_double), value, intent(in) :: mu | + | real(kind=c_double), intent(in) :: mu |
| real(kind=c_double), dimension(50), intent(in) :: momenta | real(kind=c_double), dimension(50), intent(in) :: momenta | ||
| - | real(kind=c_double), dimension(4), intent(out) :: res | + | real(kind=c_double), dimension(60), intent(out) :: res |
| - | integer(kind=c_int), intent(out) :: rstatus | + | real(kind=c_double), dimension(1), intent(out) :: acc |
| !.... | !.... | ||
| end subroutine OLP_EvalSubProcess2 | 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 | end module olp | ||
| </code> | </code> | ||
| + | |||