// Author: Aime' Fournier
// E-mail: fournier@ucar.edu

#include "qf.h"			// for pqf ...

// See 2009/8/4 e-mail from john@michalakes.us
#ifndef CRAY
#   ifdef NOUNDERSCORE
#      define DWTAI2_W dwtai2_w
#   else
#      ifdef F2CSTYLE
#         define DWTAI2_W dwtai2_w__
#      else
#         define DWTAI2_W dwtai2_w_
#      endif
#   endif
#endif

void DWTAI2_W (char *nam,	// in: filter name
           int *ran,		// in: filter length
           real *u,		// in/out: data & transform
           real *s,		// scratch space
           int *iv,		// v-space lengths
           int *ia,		// w-space starts
           int *lm) {		// maximum level
  extern real l2norm();		// l2 norm
  int *ja[2],*jv[2];		// reshapes of ia & iv
  pqf *g,*h;			// wavelet hpf & lpf
//real r;			// only for printf(l2norm())

//printf("dwtai2_w::dwtai2_w(%s,%2d,{",nam,*ran);
//for( int i=0; i<4*ia[*lm+1]; i+=ia[*lm+1] ) {
//   printf("{");
//   for( int j=i; j<i+4; j++ ) printf("%11.4e,",u[j]);
//   printf("\b...},");
//}
//printf("\b...},{%6.3f,...},{%2d,...},{%2d,...},%2d)\n",*s,*iv,*ia,*lm);

  for( int i=0; i<2; i++ ) {
     ja[i]=ia+(*lm+1)*i;
     jv[i]=iv+(*lm+1)*i;
//   for( int j=0; j<=*lm; j++ )
//      printf("dwtai2_w: {ia,iv}[%d][%d]={%d,%d}\n",i,j,ja[i][j],jv[i][j]);
  }

  h=qf(nam,*ran,0);		// assign h
  g=qf(nam,*ran,1);		// assign g
//PrintFilter(nam,*ran,0,h);
//PrintFilter(nam,*ran,1,g);

//r=l2norm(u,ja[1][0],jv[0][0],jv[1][0]);
//printf("dwtai2_w:          ||u||=%15.9E\n",r);
  dwtai2(u,s,jv,ja,*lm,h,g);
//printf("dwtai2_w: 1-||Wu||/||u||=%15.9E\n",1.-l2norm(u,ja[1][0],ja[0][0],ja[1][0])/r);

  free(g->fp);free(g);free(h->fp);free(h);
}