Source code for pychangcooper.scenarios.generic_cooling_acceleration

import numpy as np

from pychangcooper.chang_cooper import ChangCooper


[docs]class GenericCoolingAccelerationComponent(object): def __init__(self, C0=1.0, t_acc=1, cooling_index=-2, acceleration_index=2): """ Generic cooling and acceleration component that must be co-inherited with ChangCooper to form a complete solution. This is to reduce code duplication for similar problems :param C0: the cooling constant :param t_acc: the acceleration time :param cooling_index: the cooling index :param acceleration_index: the acceleeration index """ self._C0 = C0 self._t_acc = t_acc self._cooling_index = cooling_index self._acceleration_index = acceleration_index def _define_terms(self): self._dispersion_term = ( 0.5 * np.power(self._half_grid, self._acceleration_index) / self._t_acc ) self._heating_term = ( self._C0 * np.power(self._half_grid, self._cooling_index) - 2 * self._dispersion_term / self._half_grid ) def _t_cool(self, gamma): """ calculate the cooling time of a particle with energy gamma :param gamma: the energy of the particle :return: """ return 1.0 / (self._C0 * gamma) def _get_min_timescale(self): RuntimeWarning("This must be subclassed") return self._t_acc @property def equilbrium_energy(self): """ The equilibrium energy of the electrons """ return 1.0 / (self._C0 * self._t_acc)
[docs]class CoolingAcceleration(GenericCoolingAccelerationComponent, ChangCooper): def __init__( self, n_grid_points=300, C0=1.0, t_acc=1, cooling_index=-2, acceleration_index=2, max_grid=1e7, store_progress=False, initial_distribution=None, ): """ Cooling and acceleration of an unspecified form. :param n_grid_points: number of grid points :param C0: the cooling constant :param t_acc: the acceleration time :param cooling_index: the index of the cooling term :param acceleration_index: the index of the acceleration term :param max_grid: the maximum grid energy :param store_progress: to store the progress of the evolution :param initial_distribution: the initial distribution of the electrons """ # first call the cool-accel component constructor to setup the terms and special # properties GenericCoolingAccelerationComponent.__init__( self, C0, t_acc, cooling_index, acceleration_index ) # figure out the delta t delta_t = self._get_min_timescale() ChangCooper.__init__( self, n_grid_points, max_grid, delta_t, initial_distribution, store_progress )