Load a 32-bit FORTRAN library in 64-bit Python
This example shows how to access a 32-bit FORTRAN library from 64-bit Python.
Fortran32 is the 32-bit server and
Fortran64 is the 64-bit client.
The source code of the FORTRAN program is available here.
Note
If you have issues running the example please make sure that you have the prerequisites installed for your operating system.
Important
By default ctypes expects that a ctypes.c_int data type is
returned from the library call. If the returned value from the library is
not a ctypes.c_int then you must redefine the ctypes
restype value to be the appropriate data
type. The Fortran32 class shows various
examples of redefining the restype value.
Create a Fortran64 client to communicate
with the 32-bit fortran_lib32 library
>>> from msl.examples.loadlib import Fortran64
>>> f = Fortran64()
Add two int8 values, see
sum_8bit()
>>> f.sum_8bit(-50, 110)
60
Add two int16 values, see
sum_16bit()
>>> f.sum_16bit(2**15-1, -1)
32766
Add two int32 values, see
sum_32bit()
>>> f.sum_32bit(123456788, 1)
123456789
Add two int64 values, see
sum_64bit()
>>> f.sum_64bit(-2**63, 1)
-9223372036854775807...
Multiply two float32 values, see
multiply_float32()
>>> f.multiply_float32(1e30, 2e3)
1.99999998899...e+33
Multiply two float64 values, see
multiply_float64()
>>> f.multiply_float64(1e30, 2e3)
2.00000000000...e+33
Check if a value is positive, see
is_positive()
>>> f.is_positive(1e-100)
True
>>> f.is_positive(-1e-100)
False
Add or subtract two integers, see
add_or_subtract()
>>> f.add_or_subtract(1000, 2000, True)
3000
>>> f.add_or_subtract(1000, 2000, False)
-1000
Calculate the n’th factorial, see
factorial()
>>> f.factorial(0)
1.0
>>> f.factorial(127)
3.012660018457658e+213
Calculate the standard deviation of an list of values, see
standard_deviation()
>>> f.standard_deviation([float(val) for val in range(1,10)])
2.73861278752583...
Compute the Bessel function of the first kind of order 0, see
besselJ0()
>>> f.besselJ0(8.6)
0.0146229912787412...
Reverse a string, see
reverse_string()
>>> f.reverse_string('hello world!')
'!dlrow olleh'
Add two 1D arrays, see
add_1D_arrays()
>>> a = [float(val) for val in range(1, 10)]
>>> b = [0.5*val for val in range(1, 10)]
>>> a
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
>>> b
[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
>>> f.add_1D_arrays(a, b)
[1.5, 3.0, 4.5, 6.0, 7.5, 9.0, 10.5, 12.0, 13.5]
Multiply two matrices, see
matrix_multiply()
>>> m1 = [[1, 2, 3], [4, 5, 6]]
>>> m2 = [[1, 2], [3, 4], [5, 6]]
>>> f.matrix_multiply(m1, m2)
[[22.0, 28.0], [49.0, 64.0]]
Shutdown the 32-bit server when you are done communicating with the 32-bit library
>>> stdout, stderr = f.shutdown_server32()