# 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

    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 profile info
    induced_voltage_list : object list
        List of objects for which induced voltages have to be calculated
    induced_voltage : float array
        Array to store the computed induced voltage [V]
    time_array : float array
        Time array corresponding to induced_voltage [s]
    """

    def __init__(self, Beam, Profile, induced_voltage_list):
        """
        Constructor.
        """
        # Copy of the Beam object in order to access the beam info.
        self.beam = Beam

        # Copy of the Profile object in order to access the profile info.
        self.profile = Profile

        # Induced voltage list.
        self.induced_voltage_list = induced_voltage_list

        # Induced voltage from the sum of the wake sources in V
        self.induced_voltage = np.zeros(

# 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


    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 profile info
    induced_voltage_list : object list
        List of objects for which induced voltages have to be calculated
    induced_voltage : float array
        Array to store the computed induced voltage [V]
    time_array : float array
        Time array corresponding to induced_voltage [s]
    """

    def __init__(self, Beam, Profile, induced_voltage_list):
        """
        Constructor.
        """
        # Copy of the Beam object in order to access the beam info.
        self.beam = Beam

        # Copy of the Profile object in order to access the profile info.
        self.profile = Profile

        # Induced voltage list.
        self.induced_voltage_list = induced_voltage_list

        # Induced voltage from the sum of the wake sources in V
        self.induced_voltage = np.zeros(

            int(self.profile.n_slices), dtype=bm.precision.real_t, order='C')