def test_plan1d(self): from pyculib.fft.binding import Plan, CUFFT_C2C n = 10 data = np.arange(n, dtype=np.complex64) orig = data.copy() d_data = cuda.to_device(data) fftplan = Plan.one(CUFFT_C2C, n) fftplan.forward(d_data, d_data) fftplan.inverse(d_data, d_data) d_data.copy_to_host(data) result = data / n self.assertTrue(np.allclose(orig, result.real))
arg3 = clip(max((-z + r1 + r2)*(z + r1 - r2)*(z - r1 + r2)*(z + r1 + r2), 0.),-1,1) if (r1 <= r2 - z) : return math.pi*r1*r1 # planet completely overlaps stellar circle elif (r1 >= r2 + z) : return math.pi*r2*r2 # stellar circle completely overlaps planet else : return r1*r1*math.acos(arg1) + r2*r2*math.acos(arg2) - 0.5*math.sqrt(arg3) # partial overlap #################### # GPU functions ################## if numba.cuda.is_available(): # FFT plan from pyculib.fft.binding import Plan, CUFFT_C2C fftplan17 = Plan.one(CUFFT_C2C, 2**17) fftplan18 = Plan.one(CUFFT_C2C, 2**18) @numba.cuda.jit('float64(float64,float64,float64)', device=True, inline=True) def d_clip(a, b, c): if (a < b) : return b elif (a > c) : return c else : return a @numba.cuda.jit('float64(float64,float64,float64)', device=True, inline=True) def d_area(z, r1, r2): arg1 = d_clip((z*z + r1*r1 - r2*r2)/(2.*z*r1),-1,1) arg2 = d_clip((z*z + r2*r2 - r1*r1)/(2.*z*r2),-1,1) arg3 = d_clip(max((-z + r1 + r2)*(z + r1 - r2)*(z - r1 + r2)*(z + r1 + r2), 0.),-1,1)