#include "LH.h"

void init_fftstruct(int M, int N, fftstruct **x){
  /*lwork=2*(N+M)+30;
   work=(doublecomplex *) malloc(lwork*sizeof(doublecomplex));
   zfft2i_64(M,N,work); */
  *x=(fftstruct *) malloc(sizeof(fftstruct));
  /* printf("size %d size %d size %d\n",sizeof(fftstruct),sizeof(fftw_plan),sizeof(doublecomplex *)); */

  (**x).x=(doublecomplex *) malloc(sizeof(fftw_complex)*N*M);

  (**x).pf=fftw_plan_dft_2d(M,N,(**x).x,(**x).x,FFTW_FORWARD,FFTW_MEASURE);
  (**x).pb=fftw_plan_dft_2d(M,N,(**x).x,(**x).x,FFTW_BACKWARD,FFTW_MEASURE);
}

void freework(){
  /* free(work); 
  fftw_destroy_plan(pzf);
  fftw_destroy_plan(pzb);
  fftw_destroy_plan(pgradzf);
  fftw_destroy_plan(pgradzb);
  fftw_destroy_plan(pyf);
  fftw_destroy_plan(pyb);
  fftw_destroy_plan(pSf);
  fftw_destroy_plan(pSb); */
}

void transform(int M, int N, fftstruct *x, fftstruct *S)
{ 
  int j;

  /* zfft2b_64(M,N,z,M,work,lwork); inverse transform = fourn(z-1,nn-1,2,1); */
  fftw_execute((*x).pb);

  for (j=0; j<NM; j++){
    (*x).x[j][0]/=(*S).x[j][0];
    (*x).x[j][1]/=(*S).x[j][0];
  }

  /* zfft2f_64(M,N,z,M,work,lwork);  fourier transform = fourn(z-1,nn-1,2,-1); */ 

  fftw_execute((*x).pf);

  for (j=0; j<NM; j++)
    (*x).x[j][0]/=divNM;

}

void transformstar(int M, int N, fftstruct *x, fftstruct *S)
{ 
  int j;

  /* zfft2b_64(M,N,z,M,work,lwork); inverse transform = fourn(z-1,nn-1,2,1); */
  fftw_execute((*x).pf);

  for (j=0; j<NM; j++){
    (*x).x[j][0]*=(*S).x[j][0];
    (*x).x[j][1]*=(*S).x[j][0];
  }

  /* zfft2f_64(M,N,z,M,work,lwork);  fourier transform = fourn(z-1,nn-1,2,-1); */ 

  fftw_execute((*x).pb);

  for (j=0; j<NM; j++)
    (*x).x[j][0]/=divNM;

}

void transformb(int M, int N, fftstruct *x){

  fftw_execute((*x).pb);

  /*  zfft2b_64(M,N,S,M,work,lwork); */
}



