Index: trunk/Ohana/src/opihi/cmd.data/Makefile
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 41431)
+++ trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 41432)
@@ -75,4 +75,5 @@
 $(SRC)/imsmooth.generic.$(ARCH).o	\
 $(SRC)/imsmooth.2d.$(ARCH).o	\
+$(SRC)/imconvolve.$(ARCH).o	\
 $(SRC)/integrate.$(ARCH).o	\
 $(SRC)/interpolate.$(ARCH).o	\
Index: trunk/Ohana/src/opihi/cmd.data/imconvolve.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/imconvolve.c	(revision 41432)
+++ trunk/Ohana/src/opihi/cmd.data/imconvolve.c	(revision 41432)
@@ -0,0 +1,59 @@
+# include "data.h"
+
+int imconvolve (int argc, char **argv) {
+  
+  Buffer *in, *ker, *out;
+
+  if (argc != 4) {
+    gprint (GP_ERR, "USAGE: imconvolve (input) (kernel) (output)\n");
+    return (FALSE);
+  }
+  
+  if ((in   = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE);
+  if ((ker  = SelectBuffer (argv[2], OLDBUFFER, TRUE)) == NULL) return (FALSE);
+  if ((out  = SelectBuffer (argv[3], ANYBUFFER, TRUE)) == NULL) return (FALSE);
+
+  // output image will have same size as input1 (not padding the edges
+  int Nx = in[0].matrix.Naxis[0];
+  int Ny = in[0].matrix.Naxis[1];
+
+  int nx = in[0].matrix.Naxis[0];
+  int ny = in[0].matrix.Naxis[1];
+
+  int djx = nx / 2;
+  int djy = ny / 2;
+
+  // ALLOCATE (temp, float, Nx*Ny);
+
+  gfits_free_matrix (&out[0].matrix);
+  gfits_free_header (&out[0].header);
+  if (!CreateBuffer (out, Nx, Ny, -32, 1.0, 0.0)) return FALSE;
+
+  float *inBuf  = (float *)  in[0].matrix.buffer;
+  float *kerBuf = (float *) ker[0].matrix.buffer;
+  float *outBuf = (float *) out[0].matrix.buffer;
+
+  for (int iy = 0; iy < Ny; iy ++) {
+    for (int ix = 0; ix < Nx; ix ++) {
+
+      double outValue = 0.0;
+
+      // loop over all kernel pixels
+      for (int jy = 0; jy < ny; jy++) {
+	int ky = iy + jy - djy;
+	if (ky < 0) continue;
+	if (ky >= Ny) continue;
+	for (int jx = 0; jx < nx; jx++) {
+	  int kx = ix + jx - djx;
+	  if (kx < 0) continue;
+	  if (kx >= Nx) continue;
+	  outValue += inBuf[kx + Nx*ky]*kerBuf[jx + jy*ny];
+	}
+      }
+      outBuf[ix + iy*Nx] = outValue;
+    }
+  }
+
+  return (TRUE);
+}
+
Index: trunk/Ohana/src/opihi/cmd.data/init.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/init.c	(revision 41431)
+++ trunk/Ohana/src/opihi/cmd.data/init.c	(revision 41432)
@@ -64,4 +64,5 @@
 int imsmooth_generic PROTO((int, char **));
 int imsmooth_2d      PROTO((int, char **));
+int imconvolve       PROTO((int, char **));
 int integrate        PROTO((int, char **));
 int interpolate      PROTO((int, char **));
@@ -264,4 +265,5 @@
   {1, "imsmooth.generic", imsmooth_generic, "circular non-gaussian smoothing"},
   {1, "imsmooth.2d",  imsmooth_2d,      "circular non-gaussian smoothing"},
+  {1, "imconvolve",   imconvolve,       "full 2D real-space convolution"},
   {1, "imstats",      imstats,          "statistics on a portion of an image"},
   {1, "integrate",    integrate,        "integrate a vector"},
Index: trunk/Ohana/src/opihi/cmd.data/read_vectors.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 41431)
+++ trunk/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 41432)
@@ -711,5 +711,5 @@
       if (!gfits_get_bintable_column_raw (outheader, outtable, argv[i], &data, IsCompressed)) ESCAPE ("error reading data from specified field\n");
     } else {
-      if (!gfits_get_table_column_type (outheader, argv[i], type)) ESCAPE ("requested field not found\n");
+      if (!gfits_get_table_column_type (outheader, argv[i], type, &Nval)) ESCAPE ("requested field not found\n");
       if (!gfits_get_table_column (outheader, outtable, argv[i], &data)) ESCAPE ("error reading data from specified field\n");
     }
