pyfmm.c_interfaces 源代码

"""
    :file:     c_interfaces.py  
    :author:   Zhu Dengda (zhudengda@mail.iggcas.ac.cn)  
    :date:     2023-04

    该文件包括 C库的调用接口  

"""

import os
from ctypes import *
from typing import Any

PDOUBLE = POINTER(c_double)
PFLOAT = POINTER(c_float)
PINT = POINTER(c_int)

USE_FLOAT:bool = False
"""libfmm库中走时和慢度数组是否使用单精度浮点数"""
NPCT_REAL_TYPE:str = 'f8'

C_FastMarching:Any = None
C_FMM_raytracing:Any = None

[文档] def load_c_lib(use_float:bool=False): r''' 加载单精度或双精度的C库,修改c_interfaces下的NPCT_REAL_TYPE变量和C函数接口 :param use_float: 是否使用单精度 ''' global USE_FLOAT, NPCT_REAL_TYPE, C_FastMarching, C_FMM_raytracing USE_FLOAT = use_float NPCT_REAL_TYPE = 'f4' if USE_FLOAT else 'f8' _suffix = 'float' if USE_FLOAT else 'double' REAL = c_float if USE_FLOAT else c_double PREAL = POINTER(REAL) libfmm = cdll.LoadLibrary( os.path.join( os.path.abspath(os.path.dirname(__file__)), f"C_extension/lib/libfmm_{_suffix}.so")) """libfmm库""" C_FastMarching = libfmm.FastMarching """C库中计算走时场的主函数 FastMarching, 详见C API同名函数""" C_FMM_raytracing = libfmm.FMM_raytracing """C库中根据走时场进行射线追踪 FMM_raytracing, 详见C API同名函数""" C_FastMarching.restype = None C_FastMarching.argtypes = [ PDOUBLE, c_int, PDOUBLE, c_int, PDOUBLE, c_int, c_double, c_double, c_double, c_int, PREAL, PREAL, c_bool, c_int, c_int, c_bool ] C_FMM_raytracing.restype = c_float C_FMM_raytracing.argtypes = [ PDOUBLE, c_int, PDOUBLE, c_int, PDOUBLE, c_int, c_double, c_double, c_double, c_double, c_double, c_double, c_double, c_double, PREAL, c_bool, PDOUBLE, PINT ]