-
Notifications
You must be signed in to change notification settings - Fork 298
/
fortran.hpp
88 lines (74 loc) · 3.17 KB
/
fortran.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//
// Copyright (C) 2002, 2003 Si-Lab b.v.b.a., Toon Knapen and Kresimir Fresl
// 2010 Thomas Klimpel
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_CONFIG_FORTRAN_HPP
#define BOOST_NUMERIC_BINDINGS_DETAIL_CONFIG_FORTRAN_HPP
#if defined(BIND_FORTRAN_LOWERCASE_UNDERSCORE) || defined(BIND_FORTRAN_LOWERCASE) || defined(BIND_FORTRAN_UPPERCASE_UNDERSCORE) || defined(BIND_FORTRAN_UPPERCASE)
// Allow manual override of the defaults, e.g. if you want to use a fortran
// lib compiled with gcc from MSVC
#else
// We have no chance of determining the conventions for linking C with Fortran
// here, because they only depend on the fortran compiler and it's command line
// switches, but not on the C++ compiler which compiles these lines.
// We default to lowercase underscore, because this is much more common than
// the other option. (The previous automatic configuration only selected the
// other option in case of "defined(__IBMCPP__) || defined(_MSC_VER)".)
#define BIND_FORTRAN_LOWERCASE_UNDERSCORE
#endif
// Next we define macro's to convert our symbols to
// the current convention
#if defined(BIND_FORTRAN_LOWERCASE_UNDERSCORE)
#define FORTRAN_ID( id ) id##_
#define FORTRAN_ID2( id, ID2 ) id##_
#elif defined(BIND_FORTRAN_LOWERCASE)
#define FORTRAN_ID( id ) id
#define FORTRAN_ID2( id, ID2 ) id
#elif defined(BIND_FORTRAN_UPPERCASE_UNDERSCORE)
#define FORTRAN_ID2( id, ID2 ) ID2##_
#elif defined(BIND_FORTRAN_UPPERCASE)
#define FORTRAN_ID2( id, ID2 ) ID2
#else
#error do not know how to bind to fortran calling convention
#endif
#ifdef BIND_FORTRAN_F2C_RETURN_CONVENTIONS
// "g77" or clapack or "gfortran -ff2c"
#define BIND_FORTRAN_RETURN_REAL_DOUBLE
#define BIND_FORTRAN_RETURN_COMPLEX_FIRST_ARG
#elif BIND_FORTRAN_MKL_RETURN_CONVENTIONS
// mkl
#define BIND_FORTRAN_RETURN_COMPLEX_FIRST_ARG
#elif BIND_FORTRAN_OSX_RETURN_CONVENTIONS
// OS X
#define BIND_FORTRAN_RETURN_COMPLEX_LAST_ARG
#else
// "g77 -fno-f2c" or "gfortran"
#endif
// "g77" or "gfortran" or mkl_intel_lp64
//#undef BIND_FORTRAN_INTEGER_8
// clapack or "gfortran -fdefault-integer-8" or mkl_intel_ilp64
//#define BIND_FORTRAN_INTEGER_8
// Most fortran compilers use fortran_int_t := int by default, so we follow
// this default, even so f2c (=clapack) uses "typedef long int integer;"
#ifndef BIND_FORTRAN_INTEGER_8
typedef int fortran_int_t;
#else
typedef std::ptrdiff_t fortran_int_t;
#endif
// Looks like fortran_int_t and fortran_bool_t should be identical, the unsigned is
// required so overloads can distinguish between fortran_bool_t and fortran_int_t.
#ifndef BIND_FORTRAN_INTEGER_8
typedef unsigned int fortran_bool_t;
#else
typedef std::size_t fortran_bool_t;
#endif
// This definition of external_fp is identical to the definition of L_fp from
// f2c, and it seems to work more or less. These functions return fortran_bool_t,
// but they don't all take the same type of arguments. A reinterpret_cast will
// probably work for most compilers to extend the allowed function signatures.
typedef fortran_bool_t (*external_fp)(...);
#endif // BOOST_NUMERIC_BINDINGS_TRAITS_FORTRAN_H