double.cl 956 B

123456789101112131415161718192021222324252627282930
  1. #pragma OPENCL EXTENSION cl_khr_fp64 : enable
  2. __kernel void iterate(__global float* A, const int width, double xl, double yt, double pixelScaleX, double pixelScaleY, int maxIter, int smooth, int julia, double juliaX, double juliaY) {
  3. int index = get_global_id(0);
  4. int x = index % width;
  5. int y = index / width;
  6. double a = x * pixelScaleX + xl;
  7. double b = y * pixelScaleY + yt;
  8. double ca = julia != 0 ? juliaX : a;
  9. double cb = julia != 0 ? juliaY : b;
  10. int n = 0;
  11. while (n < maxIter - 1) {
  12. double aa = a * a;
  13. double bb = b * b;
  14. double ab = a * b;
  15. a = aa - bb + ca;
  16. b = ab + ab + cb;
  17. if (aa + bb > 16) break;
  18. n++;
  19. }
  20. // N + 1 - log (log |Z(N)|) / log 2
  21. if (n >= maxIter - 1)
  22. A[index] = maxIter;
  23. else {
  24. if (smooth != 0)
  25. A[index] = ((float)n) + 1 - log(log((float)(a * a + b * b)) / 2) / log(2.0f);
  26. else
  27. A[index] = ((float)n);
  28. }
  29. }