Source code for use_libwoden
import ctypes
import importlib_resources
import wodenpy
import numpy as np
import sys
import os
from wodenpy.use_libwoden.visibility_set import Visi_Set_Float, Visi_Set_Double
from wodenpy.use_libwoden.woden_settings import Woden_Settings_Float, Woden_Settings_Double
from wodenpy.use_libwoden.skymodel_structs import Source_Catalogue_Float, Source_Catalogue_Double
from wodenpy.use_libwoden.array_layout_struct import Array_Layout
VELC = 299792458.0
[docs]
def load_in_woden_library(precision='double'):
"""Load in the WODEN C and CUDA code via a dynamic library, with the
required `precision` (either load `libwoden_float.so` or `libwoden_double.so`)
Parameters
----------
precision : str, optional
Choose to use "float" precision or "double". By default 'double'
Returns
-------
run_woden : _NamedFuncPointer
The C wrapper function `run_woden`, which runs the C/CUDA code.
This function takes the following args when `precision="double"`
- ctypes.POINTER(Woden_Settings_Double)
- ctypes.POINTER(Visi_Set_Double)
- ctypes.POINTER(Source_Catalogue_Double)
- ctypes.POINTER(Array_Layout)
- ctypes.POINTER(ctypes.c_double)
This function takes the following args when `precision="float"`
- ctypes.POINTER(Woden_Settings_Float)
- ctypes.POINTER(Visi_Set_Float)
- ctypes.POINTER(Source_Catalogue_Float)
- ctypes.POINTER(Array_Layout)
- ctypes.POINTER(ctypes.c_float)
"""
woden_lib = importlib_resources.files(wodenpy).joinpath(f"libwoden_{precision}.so")
print("LOADING IN", woden_lib)
## Read in the C library
libwoden = ctypes.cdll.LoadLibrary(woden_lib)
# ##Define the input and return types for the `test_RTS_calculate_MWA_analytic_beam` function
run_woden = libwoden.run_woden
run_woden.restype = ctypes.c_int
if precision == 'float':
run_woden.argtypes = [ctypes.POINTER(Woden_Settings_Float),
ctypes.POINTER(Visi_Set_Float),
ctypes.POINTER(Source_Catalogue_Float),
ctypes.POINTER(Array_Layout),
ctypes.POINTER(ctypes.c_float)]
else:
run_woden.argtypes = [ctypes.POINTER(Woden_Settings_Double),
ctypes.POINTER(Visi_Set_Double),
ctypes.POINTER(Source_Catalogue_Double),
ctypes.POINTER(Array_Layout),
ctypes.POINTER(ctypes.c_double)]
return run_woden