def __init__(self, setup): self.setup = setup sigma2 = pow(setup.sigma, 2) dx_opt = abs(setup.C_opt / (.5 * sigma2 - setup.r) * setup.l2_opt * sigma2) dt_opt = pow(dx_opt, 2) / sigma2 / setup.l2_opt # adjusting dt so that nt is integer self.dt = setup.T self.nt = 0 while self.dt > dt_opt: self.nt += 1 self.dt = setup.T / self.nt # adjusting dx to match requested l^2 dx = np.sqrt(setup.l2_opt * self.dt) * setup.sigma # calculating actual u number and lambda self.C = - (.5 * sigma2 - setup.r) * (-self.dt) / dx self.l2 = dx * dx / sigma2 / self.dt # adjusting nx and setting S_beg, S_end S_beg = setup.S_match self.nx = 1 while S_beg > setup.S_min: self.nx += 1 S_beg = np.exp(np.log(setup.S_match) - self.nx * dx) self.ix_match = self.nx S_end = setup.S_match while S_end < setup.S_max: self.nx += 1 S_end = np.exp(np.log(S_beg) + (self.nx-1) * dx) # asset price self.S = np.exp(np.log(S_beg) + np.arange(self.nx) * dx) self.mu_coeff = (0.5 / self.l2,) self.solvers = {} self.solvers[1] = Factories.advection_diffusion_1d( advectee=setup.payoff(self.S), advector=self.C, options=Options(n_iters=1, non_zero_mu_coeff=True), boundary_conditions=(ExtrapolatedBoundaryCondition(),) ) self.solvers[2] = Factories.advection_diffusion_1d( advectee=setup.payoff(self.S), advector=self.C, options=Options(**OPTIONS), boundary_conditions=(ExtrapolatedBoundaryCondition(),) )
def __init__(self, setup: Setup, options: Options): x, y, z = from_pdf_2d(setup.pdf, xrange=setup.xrange, yrange=setup.yrange, gridsize=setup.grid) self.mpdata = Factories.stream_function_2d_basic( setup.grid, setup.size, setup.dt, setup.stream_function, z, options) self.nt = setup.nt
def __init__(self, setup, grid_layout, psi_coord, opts, GC_max): self.setup = setup self.psi_coord = psi_coord # units of calculation self.__t_unit = self.setup.si.seconds self.__r_unit = self.setup.si.micrometre self.__n_unit = self.setup.si.centimetres**-3 / self.setup.si.micrometre self.solver, self.__r, self.__rh, self.dx, dt = Factories.condensational_growth( self.setup.nr, self.__mgn(self.setup.r_min, self.__r_unit), self.__mgn(self.setup.r_max, self.__r_unit), GC_max, grid_layout, psi_coord, lambda r: self.__mgn( self.setup.pdf(r * self.__r_unit), self.__n_unit), lambda r: self.__mgn(self.setup.drdt(r * self.__r_unit), self. __r_unit / self.__t_unit), opts) self.out_steps = Simulation.find_out_steps(setup=self.setup, dt=dt) self.dt = dt * self.__t_unit