def EvolvePmesh(pm, pmfinal, timesteps, Q, use_cosmo, smoothing = 0, lptbool = 0, snaps = None, \ laplacian = fourier_lap, derivative = fourier_der, zolamode = 0): boxsize = pm.BoxSize[0] ZA = evolve.ZA(pm, Q) if lptbool: LPT = evolve.LPT2(pm, Q) obj1 = Bunch() obj1.pos = numpy.zeros_like(Q) obj1.vel = numpy.zeros_like(Q) obj1.accel = numpy.zeros_like(Q) ## IC ## cosmo = cosmology.Cosmology(use_cosmo, 100.) a0 = numpy.exp(timesteps[0]) obj1.pos = Q + ZA * cosmo.Dgrow(a0) obj1.vel = ZA * cosmo.Dgrow(a0) * cosmo.Fomega1(a0) * cosmo.Ha(a0) * a0**2 if lptbool: obj1.pos += cosmo.Dgrow(a0)**2 * LPT obj1.vel += cosmo.Dgrow(a0)**2 *LPT \ *cosmo.Fomega2(a0)*cosmo.Ha(a0)* a0**2 obj1.pos[obj1.pos < 0.0] += pm.BoxSize[0] obj1.pos[obj1.pos > pm.BoxSize[0]] -= pm.BoxSize[0] ## Loop it ## for i in range(len(timesteps) - 1): loga1 = timesteps[i] loga2 = timesteps[i + 1] weight = 3 * cosmo.M * cosmo.H0**2 / (8 * math.pi * 43.007) * ( pm.BoxSize[0] / pm.Nmesh)**3 accelerate(obj1.pos, pmfinal, obj1.accel, smoothing, weight, laplacian, derivative) if i > 0: loga0 = timesteps[i - 1] kick(obj1.vel, obj1.accel, 0.5 * (loga1 + loga0), loga1, loga1, zolamode) kick(obj1.vel, obj1.accel, loga1, 0.5 * (loga1 + loga2), loga1, zolamode) drift(obj1.pos, obj1.vel, loga1, loga2, pmfinal, zolamode) pmfinal.clear() pmfinal.paint(obj1.pos) output.append(pmfinal.real.copy()) pmfinal.clear() ## Return evolved position ## pmfinal.paint(obj1.pos) return output
def za_ic(pm, pmfinal, Q, timesteps, use_cosmo, smoothing=0): cosmo = cosmology.Cosmology(use_cosmo, 100.) ZA = evolve.ZA(pm, Q) a0 = numpy.exp(timesteps[0]) pos_ic = Q + ZA * cosmo.Dgrow(a0) pos_ic[pos_ic < 0.0] += pm.BoxSize[0] pos_ic[pos_ic > pm.BoxSize[0]] -= pm.BoxSize[0] pmfinal.clear() pmfinal.paint(pos_ic)
def EvolvePmesh(pm, pmfinal, timesteps, Q, use_cosmo, smoothing = 0, lptbool = 0, snaps = None, \ laplacian = fourier_lap, derivative = fourier_der, zolamode = 0): output = [] boxsize = pm.BoxSize[0] ZA = evolve.ZA(pm, Q) if lptbool: LPT = evolve.LPT2(pm, Q) obj1 = Bunch() obj1.pos = numpy.zeros_like(Q) obj1.vel = numpy.zeros_like(Q) obj1.accel = numpy.zeros_like(Q) ## IC ## cosmo = cosmology.Cosmology(use_cosmo, 100.) a0 = numpy.exp(timesteps[0]) obj1.pos = Q + ZA * cosmo.Dgrow(a0) obj1.vel = ZA * cosmo.Dgrow(a0) * cosmo.Fomega1(a0) * cosmo.Ha(a0) * a0**2 if lptbool: obj1.pos += cosmo.Dgrow(a0)**2 * LPT obj1.vel += cosmo.Dgrow(a0)**2 *LPT \ *cosmo.Fomega2(a0)*cosmo.Ha(a0)* a0**2 obj1.pos[obj1.pos < 0.0] += pm.BoxSize[0] obj1.pos[obj1.pos > pm.BoxSize[0]] -= pm.BoxSize[0] ## Loop it ## for i in range(len(timesteps) - 1): loga1 = timesteps[i] loga2 = timesteps[i + 1] weight = 3 * cosmo.M * cosmo.H0**2 / (8 * math.pi * 43.007) * ( pm.BoxSize[0] / pm.Nmesh)**3 accelerate(obj1.pos, pmfinal, obj1.accel, smoothing, weight, laplacian, derivative) if i > 0: loga0 = timesteps[i - 1] kick(obj1.vel, obj1.accel, 0.5 * (loga1 + loga0), loga1, cosmo) kick(obj1.vel, obj1.accel, loga1, 0.5 * (loga1 + loga2), cosmo) drift(obj1.pos, obj1.vel, loga1, loga2, boxsize, cosmo) pmfinal.clear() # if snaps != None: # postemp = numpy.zeros_like(obj1.pos) # postemp[:] = obj1.pos # # left = snaps.searchsorted(loga1, side = "left") # right = snaps.searchsorted(loga2, side = "right") # # if left != right: # drift(postemp, obj1.vel, loga1, snaps[left], boxsize, cosmo) # pmfinal.clear() # pmfinal.paint(postemp) # output.append(pmfinal.real.copy()) # # for foo in range(left+1, right): # drift(postemp, obj1.vel, snaps[foo -1], snaps[foo], boxsize, cosmo) # pmfinal.clear() # pmfinal.paint(postemp) # output.append(pmfinal.real.copy()) # #drift(postemp, obj1.vel, snaps[right-1], loga2, pmfinal, cosmo) pmfinal.clear() ## Return evolved position ## pmfinal.paint(obj1.pos) return output