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

#include <stdio.h>	// for printf() ...
#include "qf.h"

void dwtai2(		// 2D version of dwtai()
  real *u,		// input/output array of size ia[0][0]*ia[1][0]
  real *s,		// scratch array of size max(ia[0][0],ia[1][0])
  int *iv[2],		// v-space lengths from DWTAPartition()
  int *ia[2],		// w-space starts from DWTAPartition()
  int lm,		// maximum level
  const pqf *h,		//  low-pass filter
  const pqf *g) {	// high-pass filter
  extern real l2norm();	// l2 norm
  int k,lx,ly;

  lx=ia[1][0];		// padded x-length (nu. columns)
  ly=ia[0][0];		// padded y-length (nu. rows)
//printf("dwtai2: norm=%9.2e\n",l2norm(u,lx,iv[0][0],iv[1][0]));
  for( k=0; k<iv[0][0]*lx; k+=lx ) {
//   printf("dwtai2: norm[%d,0:%d]=%9.2e\n",k/lx,iv[1][0]-1,l2norm(u+k,lx,1,iv[1][0]));
     dwtai(u+k,s,iv[1],ia[1],lm,h,g);
//   printf("dwtai2: norm[%d,0:%d]=%9.2e\n",k/lx,      lx-1,l2norm(u+k,lx,1,      lx));
  }
  xpi2(u,ly,lx,sizeof(real));
  for( k=0; k<      ly*lx; k+=ly ) {
//   printf("dwtai2: norm[0:%d,%d]=%9.2e\n",iv[0][0]-1,k/ly,l2norm(u+k,ly,1,iv[0][0]));
     dwtai(u+k,s,iv[0],ia[0],lm,h,g);
//   printf("dwtai2: norm[0:%d,%d]=%9.2e\n",      ly-1,k/ly,l2norm(u+k,ly,1,      ly));
  }
  xpi2(u,lx,ly,sizeof(real));
//printf("dwtai2: norm=%9.2e\n",l2norm(u,lx,ly,lx));
}