Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,4 +1,5 @@
|
|||
import numba
|
||||
import numba.cuda as cuda
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
|
@ -12,10 +13,10 @@ n, r = 80000, 100000.0 # number of iterations and escape radius (r > 2)
|
|||
a = dc.Decimal("-1.256827152259138864846434197797294538253477389787308085590211144291")
|
||||
b = dc.Decimal(".37933802890364143684096784819544060002129071484943239316486643285025")
|
||||
|
||||
S = np.zeros(n+1, dtype=np.complex128)
|
||||
S = np.zeros(n + 2, dtype=np.complex128) # 2 iterations are chained
|
||||
u, v = dc.Decimal(0), dc.Decimal(0)
|
||||
|
||||
for i in range(n+1):
|
||||
for i in range(n + 2):
|
||||
S[i] = float(u) + float(v) * 1j
|
||||
if u * u + v * v < r * r:
|
||||
u, v = u * u - v * v + a, 2 * u * v + b
|
||||
|
|
@ -41,25 +42,70 @@ def iteration_numba(S, C):
|
|||
def abs2(z):
|
||||
return z.real * z.real + z.imag * z.imag
|
||||
|
||||
def iterate(C, I, E, Z, dZ):
|
||||
I, E = I + 1, (2 * S[I] + E) * E + C
|
||||
Z, dZ = S[I] + E, 2 * Z * dZ + 1
|
||||
return I, E, Z, dZ
|
||||
def iterate2(delta, index, epsilon, z, dz):
|
||||
index, epsilon = index + 1, (2 * S[index] + epsilon) * epsilon + delta
|
||||
z, dz = S[index] + epsilon, 2 * z * dz + 1
|
||||
index, epsilon = index + 1, (2 * S[index] + epsilon) * epsilon + delta
|
||||
z, dz = S[index] + epsilon, 2 * z * dz + 1
|
||||
return index, epsilon, z, dz
|
||||
|
||||
for i in range(n):
|
||||
M = abs2(Z) < abs2(E) # rebase when z is closer to zero
|
||||
I[M], E[M] = 0, Z[M] # reset the reference orbit
|
||||
M = abs2(Z) < abs2(r)
|
||||
I[M], E[M], Z[M], dZ[M] = iterate(C[M], I[M], E[M], Z[M], dZ[M])
|
||||
for k in range(len(C)):
|
||||
delta, index, epsilon, z, dz = C[k], I[k], E[k], Z[k], dZ[k]
|
||||
|
||||
for i in range(0, n, 2):
|
||||
if abs2(z) < abs2(r):
|
||||
if abs2(z) < abs2(epsilon):
|
||||
index, epsilon = 0, z # reset the reference orbit
|
||||
index, epsilon, z, dz = iterate2(delta, index, epsilon, z, dz)
|
||||
else:
|
||||
break
|
||||
|
||||
I[k], E[k], Z[k], dZ[k] = index, epsilon, z, dz
|
||||
|
||||
return I, E, Z, dZ
|
||||
|
||||
for j in numba.prange(d+1):
|
||||
for j in numba.prange(C.shape[1]):
|
||||
I[:, j], E[:, j], Z[:, j], dZ[:, j] = iteration(S, C[:, j])
|
||||
|
||||
return I, E, Z, dZ
|
||||
|
||||
I, E, Z, dZ = iteration_numba(S, C)
|
||||
def iteration_numba_cuda(S, C):
|
||||
I = np.zeros(C.shape, dtype=np.intp)
|
||||
E, Z, dZ = np.zeros_like(C), np.zeros_like(C), np.zeros_like(C)
|
||||
|
||||
@cuda.jit()
|
||||
def iteration(S, C, I, E, Z, dZ):
|
||||
|
||||
def abs2(z):
|
||||
return z.real * z.real + z.imag * z.imag
|
||||
|
||||
def iterate2(delta, index, epsilon, z, dz):
|
||||
index, epsilon = index + 1, (2 * S[index] + epsilon) * epsilon + delta
|
||||
z, dz = S[index] + epsilon, 2 * z * dz + 1
|
||||
index, epsilon = index + 1, (2 * S[index] + epsilon) * epsilon + delta
|
||||
z, dz = S[index] + epsilon, 2 * z * dz + 1
|
||||
return index, epsilon, z, dz
|
||||
|
||||
x, y = cuda.grid(2)
|
||||
if x < C.shape[0] and y < C.shape[1]:
|
||||
delta, index, epsilon, z, dz = C[x, y], I[x, y], E[x, y], Z[x, y], dZ[x, y]
|
||||
|
||||
for i in range(0, n, 2):
|
||||
if abs2(z) < abs2(r):
|
||||
if abs2(z) < abs2(epsilon):
|
||||
index, epsilon = 0, z # reset the reference orbit
|
||||
index, epsilon, z, dz = iterate2(delta, index, epsilon, z, dz)
|
||||
else:
|
||||
break
|
||||
|
||||
I[x, y], E[x, y], Z[x, y], dZ[x, y] = index, epsilon, z, dz
|
||||
|
||||
griddim, blockdim = ((C.shape[0] - 1) // 32 + 1, (C.shape[1] - 1) // 32 + 1), (32, 32)
|
||||
I, E, Z, dZ = cuda.to_device(I), cuda.to_device(E), cuda.to_device(Z), cuda.to_device(dZ)
|
||||
iteration[griddim, blockdim](cuda.to_device(S), cuda.to_device(C), I, E, Z, dZ)
|
||||
return I.copy_to_host(), E.copy_to_host(), Z.copy_to_host(), dZ.copy_to_host()
|
||||
|
||||
I, E, Z, dZ = iteration_numba(S, C) # use iteration_numba or iteration_numba_cuda
|
||||
D = np.zeros(C.shape, dtype=np.float64)
|
||||
|
||||
N = abs(Z) > 2 # exterior distance estimation
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue