# Path: blond/toolbox/next_regular.py
# def next_regular(target):
#     """
#     Find the next regular number greater than or equal to target.
#     Regular numbers are composites of the prime factors 2, 3, and 5.
#     Also known as 5-smooth numbers or Hamming numbers, these are the optimal
#     size for inputs to FFTPACK.
# 
#     Target must be a positive integer.
#     """
#     if target <= 6:
#         return target
# 
#     # Quickly check if it's already a power of 2
#     if not (target & (target-1)):
#         return target
#     
#     target = -(-target // 2)
#     
#     match = float('inf') # Anything found will be smaller
#     p5 = 1
#     while p5 < target:
#         p35 = p5
#         while p35 < target:
#             # Ceiling integer division, avoiding conversion to float
#             # (quotient = ceil(target / p35))
#             quotient = -(-target // p35)
# 
#             # Quickly find next power of 2 >= quotient
#             try:
#                 p2 = 2**((quotient - 1).bit_length())
#             except AttributeError:
#                 # Fallback for Python <2.7
#                 p2 = 2**(len(bin(quotient - 1)) - 2)
# 
#             N = p2 * p35
#             if N == target:
#                 return N * 2
#             elif N < match:
#                 match = N
#             p35 *= 3
#             if p35 == target:
#                 return p35 * 2
#         if p35 < match:
#             match = p35
#         p5 *= 5
#         if p5 == target:
#             return p5 * 2
#     if p5 < match:
#         match = p5
#     
#     return match * 2
# 
# Path: blond/utils/bmath.py
# def use_mpi():
# def mpiMode():
# def use_fftw():
# def use_precision(_precision='double'):
# def update_active_dict(new_dict):


from builtins import range, object
from ctypes import c_uint, c_double, c_void_p
from scipy.constants import e
from ..toolbox.next_regular import next_regular
from ..utils import bmath as bm
import numpy as np
    r"""
    *Calculates the induced voltage of several resonators for arbitrary 
    line density. It does so by linearily interpolating the line density and 
    solving the convolution integral with the resonator impedance analytically.
    The line density need NOT be sampled at equidistant points. The times where
    the induced voltage is calculated need to be the same where the line 
    density is sampled. If no timeArray is passed, the induced voltage is 
    evaluated at the points of the line density. This is nececassry of 
    compatability with other functions that calculate the induced voltage.
    Currently, it requires the all quality factors :math:`Q>0.5`
    Currently, only works for single turn.*

    Parameters
    ----------
    Beam : object
        Beam object
    Profile : object
        Profile object
    Resonators : object
        Resonators object
    timeArray : float array, optional
        Array of time values where the induced voltage is calculated. 
        If left out, the induced voltage is calculated at the times of the line
        density.

    Attributes
    ----------
    beam : object
        Copy of the Beam object in order to access the beam info.
    profile : object

# Path: blond/toolbox/next_regular.py
# def next_regular(target):
#     """
#     Find the next regular number greater than or equal to target.
#     Regular numbers are composites of the prime factors 2, 3, and 5.
#     Also known as 5-smooth numbers or Hamming numbers, these are the optimal
#     size for inputs to FFTPACK.
# 
#     Target must be a positive integer.
#     """
#     if target <= 6:
#         return target
# 
#     # Quickly check if it's already a power of 2
#     if not (target & (target-1)):
#         return target
#     
#     target = -(-target // 2)
#     
#     match = float('inf') # Anything found will be smaller
#     p5 = 1
#     while p5 < target:
#         p35 = p5
#         while p35 < target:
#             # Ceiling integer division, avoiding conversion to float
#             # (quotient = ceil(target / p35))
#             quotient = -(-target // p35)
# 
#             # Quickly find next power of 2 >= quotient
#             try:
#                 p2 = 2**((quotient - 1).bit_length())
#             except AttributeError:
#                 # Fallback for Python <2.7
#                 p2 = 2**(len(bin(quotient - 1)) - 2)
# 
#             N = p2 * p35
#             if N == target:
#                 return N * 2
#             elif N < match:
#                 match = N
#             p35 *= 3
#             if p35 == target:
#                 return p35 * 2
#         if p35 < match:
#             match = p35
#         p5 *= 5
#         if p5 == target:
#             return p5 * 2
#     if p5 < match:
#         match = p5
#     
#     return match * 2
# 
# Path: blond/utils/bmath.py
# def use_mpi():
# def mpiMode():
# def use_fftw():
# def use_precision(_precision='double'):
# def update_active_dict(new_dict):


# Path: blond/impedances/impedance.py
from builtins import range, object
from ctypes import c_uint, c_double, c_void_p
from scipy.constants import e
from ..toolbox.next_regular import next_regular
from ..utils import bmath as bm
import numpy as np

    r"""
    *Calculates the induced voltage of several resonators for arbitrary 
    line density. It does so by linearily interpolating the line density and 
    solving the convolution integral with the resonator impedance analytically.
    The line density need NOT be sampled at equidistant points. The times where
    the induced voltage is calculated need to be the same where the line 
    density is sampled. If no timeArray is passed, the induced voltage is 
    evaluated at the points of the line density. This is nececassry of 
    compatability with other functions that calculate the induced voltage.
    Currently, it requires the all quality factors :math:`Q>0.5`
    Currently, only works for single turn.*

    Parameters
    ----------
    Beam : object
        Beam object
    Profile : object
        Profile object
    Resonators : object
        Resonators object
    timeArray : float array, optional
        Array of time values where the induced voltage is calculated. 
        If left out, the induced voltage is calculated at the times of the line
        density.

    Attributes
    ----------
    beam : object
        Copy of the Beam object in order to access the beam info.
    profile : object

        Copy of the Profile object in order to access the line density.