This example shows how to access a 32-bit FORTRAN library from 64-bit Python. ~msl.examples.loadlib.fortran32.Fortran32
is the 32-bit server and ~msl.examples.loadlib.fortran64.Fortran64
is the 64-bit client. The source code of the FORTRAN program is available here <fortran-lib>
.
Note
If you have issues running the example please make sure that you have the prerequisites <loadlib-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 <python:ctypes-return-types>
value to be the appropriate data type. The ~msl.examples.loadlib.fortran32.Fortran32
class shows various examples of redefining the restype <python:ctypes-return-types>
value.
Create a ~msl.examples.loadlib.fortran64.Fortran64
client to communicate with the 32-bit fortran_lib32 <fortran-lib>
library
>>> from msl.examples.loadlib import Fortran64
>>> f = Fortran64()
Add two int8
values, see ~msl.examples.loadlib.fortran64.Fortran64.sum_8bit
>>> f.sum_8bit(-50, 110)
60
Add two int16
values, see ~msl.examples.loadlib.fortran64.Fortran64.sum_16bit
>>> f.sum_16bit(2**15-1, -1)
32766
Add two int32
values, see ~msl.examples.loadlib.fortran64.Fortran64.sum_32bit
>>> f.sum_32bit(123456788, 1)
123456789
Add two int64
values, see ~msl.examples.loadlib.fortran64.Fortran64.sum_64bit
>>> f.sum_64bit(-2**63, 1)
-9223372036854775807...
Multiply two float32
values, see ~msl.examples.loadlib.fortran64.Fortran64.multiply_float32
>>> f.multiply_float32(1e30, 2e3)
1.99999998899...e+33
Multiply two float64
values, see ~msl.examples.loadlib.fortran64.Fortran64.multiply_float64
>>> f.multiply_float64(1e30, 2e3)
2.00000000000...e+33
Check if a value is positive, see ~msl.examples.loadlib.fortran64.Fortran64.is_positive
>>> f.is_positive(1e-100)
True
>>> f.is_positive(-1e-100)
False
Add or subtract two integers, see ~msl.examples.loadlib.fortran64.Fortran64.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 ~msl.examples.loadlib.fortran64.Fortran64.factorial
>>> f.factorial(0)
1.0
>>> f.factorial(127)
3.012660018457658e+213
Calculate the standard deviation of an list of values, see ~msl.examples.loadlib.fortran64.Fortran64.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 ~msl.examples.loadlib.fortran64.Fortran64.besselJ0
>>> f.besselJ0(8.6)
0.0146229912787412...
Reverse a string, see ~msl.examples.loadlib.fortran64.Fortran64.reverse_string
>>> f.reverse_string('hello world!')
'!dlrow olleh'
Add two 1D arrays, see ~msl.examples.loadlib.fortran64.Fortran64.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 ~msl.examples.loadlib.fortran64.Fortran64.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()