//+------------------------------------------------------------------+  
//| Morlet wavelet function                                          |  
//+------------------------------------------------------------------+  
float Morlet(const float t)
  {
   return exp(-t*t*0.5)*cos(M_2_PI*t);
  }
//+------------------------------------------------------------------+  
//| OpenCL kernel function                                           |  
//+------------------------------------------------------------------+  
__kernel void Wavelet_GPU(__global float *data,int datacount,int x_size,int y_size,__global float *result)
  {
   size_t i = get_global_id(0);
   size_t j = get_global_id(1);
   float a1=(float)10e-10;
   float a2=(float)15.0;
   float da=(a2-a1)/(float)y_size;
   float db=((float)datacount-(float)0.0)/x_size;
   float a=a1+j*da;
   float b=0+i*db;
   uint norm=1;
   float B=(float)1.0; //Morlet                                         
   float B_inv=(float)1.0/B;
   float a_inv=(float)1.0/a;
   float dt=(float)1.0;
   float coef=(float)0.0;
   if(norm==0)
      coef=sqrt(a_inv);
   else
     {
      for(int k=0; k<datacount; k++)
        {
         float arg=(dt*k-b)*a_inv;
         arg=-B_inv*arg*arg;
         coef=coef+exp(arg);
        }
     }
   float sum=(float)0.0;
   for(int k=0; k<datacount; k++)
     {
      float arg=(dt*k-b)*a_inv;
      sum+=data[k]*Morlet(arg);
     }
   sum=sum/coef;
   uint pos=(int)(j*x_size+i);
   result[pos]=sum;
  };
//+------------------------------------------------------------------+
