"""
:file: c_interfaces.py
:author: Zhu Dengda (zhudengda@mail.iggcas.ac.cn)
:date: 2024-07-24
该文件包括 C库的调用接口
"""
import os
from ctypes import \
c_double, c_float, c_int, c_size_t, c_bool, c_char_p, c_void_p,\
POINTER, cdll
from .c_structures import *
FPOINTER = POINTER(c_float)
IPOINTER = POINTER(c_int)
DPOINTER = POINTER(c_double)
libgrt = cdll.LoadLibrary(
os.path.join(
os.path.abspath(os.path.dirname(__file__)),
"C_extension/lib/libgrt.so"))
"""libgrt库"""
C_grt_integ_grn_spec = libgrt.grt_integ_grn_spec
"""C库中计算格林函数的主函数 integ_grn_spec, 详见C API同名函数"""
C_grt_integ_grn_spec.argtypes = [
POINTER(c_GRT_MODEL1D), c_size_t, c_size_t, PREAL,
c_size_t, PREAL, REAL, c_bool,
REAL, REAL, REAL, REAL, REAL, REAL, REAL, REAL,
c_bool,
POINTER((PCPLX*CHANNEL_NUM)*SRC_M_NUM),
c_bool,
# uiz
POINTER((PCPLX*CHANNEL_NUM)*SRC_M_NUM),
# uir
POINTER((PCPLX*CHANNEL_NUM)*SRC_M_NUM),
c_char_p,
c_size_t,
POINTER(c_size_t)
]
C_grt_integ_static_grn = libgrt.grt_integ_static_grn
"""计算静态格林函数"""
C_grt_integ_static_grn.restype = None
C_grt_integ_static_grn.argtypes = [
POINTER(c_GRT_MODEL1D), c_size_t, PREAL, REAL, REAL, REAL, REAL,
REAL, REAL, REAL,
POINTER((REAL*CHANNEL_NUM)*SRC_M_NUM),
c_bool,
POINTER((REAL*CHANNEL_NUM)*SRC_M_NUM),
POINTER((REAL*CHANNEL_NUM)*SRC_M_NUM),
c_char_p
]
C_grt_set_num_threads = libgrt.grt_set_num_threads
"""设置多线程数"""
C_grt_set_num_threads.restype = None
C_grt_set_num_threads.argtypes = [c_int]
[文档]
def set_num_threads(n):
r'''
定义计算使用的多线程数
:param n: 线程数
'''
C_grt_set_num_threads(n)
C_grt_compute_travt1d = libgrt.grt_compute_travt1d
"""计算1D层状半空间的初至波走时"""
C_grt_compute_travt1d.restype = REAL
C_grt_compute_travt1d.argtypes = [
PREAL, PREAL, c_int,
c_int, c_int, REAL
]
C_grt_read_mod1d_from_file = libgrt.grt_read_mod1d_from_file
"""读取模型文件并进行预处理"""
C_grt_read_mod1d_from_file.restype = POINTER(c_GRT_MODEL1D)
C_grt_read_mod1d_from_file.argtypes = [c_char_p, c_char_p, c_double, c_double, c_bool]
C_grt_free_mod1d = libgrt.grt_free_mod1d
"""释放C程序中申请的 GRT_MODEL1D 结构体内存"""
C_grt_free_mod1d.restype = None
C_grt_free_mod1d.argtypes = [POINTER(c_GRT_MODEL1D)]
# -------------------------------------------------------------------
# C函数定义的时间函数
# -------------------------------------------------------------------
C_grt_free = libgrt.grt_free1d
"""释放在C中申请的内存"""
C_grt_free.restype = None
C_grt_free.argtypes = [c_void_p]
C_grt_get_trap_wave = libgrt.grt_get_trap_wave
"""梯形波"""
C_grt_get_trap_wave.restype = FPOINTER
C_grt_get_trap_wave.argtypes = [c_float, FPOINTER, FPOINTER, FPOINTER, IPOINTER]
C_grt_get_parabola_wave = libgrt.grt_get_parabola_wave
"""抛物波"""
C_grt_get_parabola_wave.restype = FPOINTER
C_grt_get_parabola_wave.argtypes = [c_float, FPOINTER, IPOINTER]
C_grt_get_ricker_wave = libgrt.grt_get_ricker_wave
"""雷克子波"""
C_grt_get_ricker_wave.restype = FPOINTER
C_grt_get_ricker_wave.argtypes = [c_float, c_float, IPOINTER]
# -------------------------------------------------------------------
# C函数定义的旋转函数
# -------------------------------------------------------------------
C_grt_rot_zxy2zrt_vec = libgrt.grt_rot_zxy2zrt_vec
"""直角坐标zxy到柱坐标zrt的矢量旋转"""
C_grt_rot_zxy2zrt_vec.restype = None
C_grt_rot_zxy2zrt_vec.argtypes = [c_double, DPOINTER] # double, double[3]
C_grt_rot_zxy2zrt_symtensor2odr = libgrt.grt_rot_zxy2zrt_symtensor2odr
"""直角坐标zxy到柱坐标zrt的二阶对称张量旋转"""
C_grt_rot_zxy2zrt_symtensor2odr.restype = None
C_grt_rot_zxy2zrt_symtensor2odr.argtypes = [c_double, DPOINTER] # double, double[6]
C_grt_rot_zrt2zxy_upar = libgrt.grt_rot_zrt2zxy_upar
"""柱坐标下的位移偏导 ∂u(z,r,t)/∂(z,r,t) 转到 直角坐标 ∂u(z,x,y)/∂(z,x,y)"""
C_grt_rot_zrt2zxy_upar.restype = None
C_grt_rot_zrt2zxy_upar.argtypes = [c_double, DPOINTER, DPOINTER, c_double] # double, double[3], double[3][3], double
# -------------------------------------------------------------------
# C函数定义的衰减函数
# -------------------------------------------------------------------
C_grt_py_attenuation_law = libgrt.grt_py_attenuation_law
"""品质因子Q 对 波速的影响"""
C_grt_py_attenuation_law.restype = None
C_grt_py_attenuation_law.argtypes = [REAL, DPOINTER, DPOINTER] # double, double[2], double[2]
# -------------------------------------------------------------------
# 使用 C 函数求解 Lamb 问题
# -------------------------------------------------------------------
C_grt_solve_lamb1 = libgrt.grt_solve_lamb1
"""使用广义闭合解求解第一类 Lamb 问题"""
C_grt_solve_lamb1.restype = None
C_grt_solve_lamb1.argtypes = [
REAL, PREAL, c_int, REAL, PREAL
]