Source code for jetset.jet_kernel_tools

__author__ = "Andrea Tramacere"

import os
import numpy as np
import ctypes

on_rtd = os.environ.get('READTHEDOCS', None) == 'True'

if on_rtd:
    from .mock import jetkernel as BlazarSED
else:
    from .jetkernel import jetkernel as BlazarSED


from .jet_paramters import *


__all__=[ 'get_spectral_c_array_read_only','get_emitters_c_array1d','get_emitters_c_array1d_fast','set_emitters_c_array1d','set_emitters_c_array1d_fast']



[docs] def get_spectral_c_array_read_only(x_ptr, y_ptr, size): """Return spectral c array read only. Parameters ---------- x_ptr : object Parameter controlling x ptr. y_ptr : object Parameter controlling y ptr. size : object Parameter controlling size. Returns ------- object Requested value. """ x_ctype = (ctypes.c_double * size).from_address(int(x_ptr)) y_ctype = (ctypes.c_double * size).from_address(int(y_ptr)) x = np.ctypeslib.as_array(x_ctype) y = np.ctypeslib.as_array(y_ctype) return x.copy(),y.copy()
#x = np.zeros(size) #y = np.zeros(size) #for i in range(size): # x[i] = BlazarSED.get_spectral_array(x_ptr, blob_object, i) # y[i] = BlazarSED.get_spectral_array(y_ptr, blob_object, i) #if deep_copy is True: # x = (ctypes.c_double * size).from_address(int(x_ptr)) # y = (ctypes.c_double * size).from_address(int(y_ptr)) #x=copy.deepcopy(np.asarray(x)) #y=copy.deepcopy(np.asarray(y)) #x = BlazarSED.get_spectral_array_np(x_ptr, blob_object) #y = BlazarSED.get_spectral_array_np(y_ptr, blob_object) #return np.array(x_ptr),np.array(y_ptr)
[docs] def get_emitters_c_array1d(gamma_prt, n_ptr, blob_object, size): """Return emitters c array1d. Parameters ---------- gamma_prt : object Frequency/energy control value for gamma prt. n_ptr : object Parameter controlling n ptr. blob_object : object Parameter controlling blob object. size : object Parameter controlling size. Returns ------- object Requested value. """ x = np.zeros(size) y = np.zeros(size) if size != int(blob_object.emitters.gamma_grid_size): raise RuntimeError("mismatch between expected and actual c-array size") for ID in range(size): x[ID] = BlazarSED.get_elec_array(gamma_prt, blob_object, ID) y[ID] = BlazarSED.get_elec_array(n_ptr, blob_object, ID) return x,y
[docs] def get_emitters_c_array1d_fast(gamma_ptr, n_ptr, blob_object, size): """Return emitters c array1d fast. Parameters ---------- gamma_ptr : object Frequency/energy control value for gamma ptr. n_ptr : object Parameter controlling n ptr. blob_object : object Parameter controlling blob object. size : object Parameter controlling size. Returns ------- object Requested value. """ if size != int(blob_object.emitters.gamma_grid_size): raise RuntimeError("mismatch between expected and actual c-array size") # hard guard: NULL pointers if int(gamma_ptr) == 0 or int(n_ptr) == 0: raise RuntimeError("emitters arrays not allocated yet") gamma_ct = (ctypes.c_double * size).from_address(int(gamma_ptr)) n_ct = (ctypes.c_double * size).from_address(int(n_ptr)) gamma = np.ctypeslib.as_array(gamma_ct).copy() n = np.ctypeslib.as_array(n_ct).copy() return gamma, n
[docs] def set_emitters_c_array1d(n_ptr, blob_object, size, values): """Set emitters c array1d. Parameters ---------- n_ptr : object Parameter controlling n ptr. blob_object : object Parameter controlling blob object. size : object Parameter controlling size. values : object Parameter controlling values. """ if size != int(blob_object.emitters.gamma_grid_size): raise RuntimeError("mismatch between expected and actual c-array size") for idx in range(size): BlazarSED.set_elec_array(n_ptr,blob_object,values[idx], idx)
[docs] def set_emitters_c_array1d_fast(n_ptr, blob_object, size, values): """Set emitters c array1d fast. Parameters ---------- n_ptr : object Parameter controlling n ptr. blob_object : object Parameter controlling blob object. size : object Parameter controlling size. values : object Parameter controlling values. """ if size != int(blob_object.emitters.gamma_grid_size): raise RuntimeError("mismatch between expected and actual c-array size") if int(n_ptr) == 0: raise RuntimeError("emitters array not allocated yet") arr = np.ascontiguousarray(values, dtype=np.float64) if arr.size != size: raise ValueError("size mismatch") dest = (ctypes.c_double * size).from_address(int(n_ptr)) ctypes.memmove(dest, arr.ctypes.data, arr.nbytes)