Index: trunk/psModules/src/Makefile.am
===================================================================
--- trunk/psModules/src/Makefile.am	(revision 1892)
+++ trunk/psModules/src/Makefile.am	(revision 1899)
@@ -1,5 +1,5 @@
 lib_LIBRARIES = libpsmodule.a
 
-libpsmodule_a_SOURCES = pmFlatField.c pmMaskBadPixels.c pmSubtractBias.c psTest.c pmSubtractBias.c
-libpsmodule_a_HEADERS = pmFlatField.h pmMaskBadPixels.h pmSubtractBias.h psTest.h pmSubtractBias.h
+libpsmodule_a_SOURCES = pmFlatField.c pmMaskBadPixels.c pmSubtractBias.c psTest.c pmSubtractBias.c psNonLinear.c
+libpsmodule_a_HEADERS = pmFlatField.h pmMaskBadPixels.h pmSubtractBias.h psTest.h pmSubtractBias.h psNonLinear.h
 libpsmodule_adir = .
Index: trunk/psModules/src/Makefile.in
===================================================================
--- trunk/psModules/src/Makefile.in	(revision 1892)
+++ trunk/psModules/src/Makefile.in	(revision 1899)
@@ -133,6 +133,6 @@
 lib_LIBRARIES = libpsmodule.a
 
-libpsmodule_a_SOURCES = pmFlatField.c pmMaskBadPixels.c pmSubtractBias.c psTest.c pmSubtractBias.c
-libpsmodule_a_HEADERS = pmFlatField.h pmMaskBadPixels.h pmSubtractBias.h psTest.h pmSubtractBias.h
+libpsmodule_a_SOURCES = pmFlatField.c pmMaskBadPixels.c pmSubtractBias.c psTest.c pmSubtractBias.c pmNonLinear.c
+libpsmodule_a_HEADERS = pmFlatField.h pmMaskBadPixels.h pmSubtractBias.h psTest.h pmSubtractBias.h pmNonLinear.h
 libpsmodule_adir = .
 subdir = src
@@ -146,6 +146,6 @@
 libpsmodule_a_LIBADD =
 am_libpsmodule_a_OBJECTS = pmFlatField.$(OBJEXT) \
-	pmMaskBadPixels.$(OBJEXT) pmSubtractBias.$(OBJEXT) \
-	psTest.$(OBJEXT) pmSubtractBias.$(OBJEXT)
+	pmMaskBadPixels.$(OBJEXT) pmSubtractBias.$(OBJEXT) pmNonLinear.$(OBJEXT)\
+	psTest.$(OBJEXT) pmSubtractBias.$(OBJEXT) pmNonLinear.$(OBJEXT)
 libpsmodule_a_OBJECTS = $(am_libpsmodule_a_OBJECTS)
 
@@ -155,5 +155,6 @@
 @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/pmFlatField.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/pmMaskBadPixels.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/pmSubtractBias.Po ./$(DEPDIR)/psTest.Po
+@AMDEP_TRUE@	./$(DEPDIR)/pmNonLinear.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/pmSubtractBias.Po ./$(DEPDIR)/psTest.Po 
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -240,4 +241,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pmFlatField.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pmMaskBadPixels.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pmNonLinear.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pmSubtractBias.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psTest.Po@am__quote@
Index: trunk/psModules/src/pmNonLinear.c
===================================================================
--- trunk/psModules/src/pmNonLinear.c	(revision 1899)
+++ trunk/psModules/src/pmNonLinear.c	(revision 1899)
@@ -0,0 +1,89 @@
+/** @file  pmLinear.c
+ *
+ *  This file will ...
+ *
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-09-25 19:57:52 $
+ *
+ *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pmNonLinear.h"
+
+psReadout *pmNonLinearityPolynomial(psReadout *in,
+                                    const psPolynomial1D *coeff)
+{
+    int i;
+    int j;
+
+    PS_CHECK_NULL_PTR(in);
+    PS_CHECK_NULL_PTR(in->image);
+    PS_CHECK_NULL_PTR(coeff);
+
+    for (i=0;i<(in->image)->numRows;i++) {
+        for (j=0;j<(in->image)->numRows;j++) {
+            (in->image)->data.F32[i][j] = psPolynomial1DEval((in->image)->data.F32[i][j], coeff);
+        }
+    }
+    return(in);
+}
+
+
+psReadout *pmNonLinearityLookup(psReadout *in,
+                                const psVector *inFlux,
+                                const psVector *outFlux)
+{
+    PS_CHECK_NULL_PTR(in);
+    PS_CHECK_NULL_PTR(in->image);
+    PS_CHECK_NULL_PTR(inFlux);
+    PS_CHECK_NULL_PTR(outFlux);
+
+    int i;
+    int j;
+    int tableSize = inFlux->n;
+    int binNum;
+    psScalar x;
+    int numPixels = 0;
+    float slope;
+
+    if (inFlux->n != outFlux->n) {
+        // XXX: psWarning("pmNonLinearityLookup(): input vectors have different size");
+        tableSize = PS_MIN(inFlux->n, outFlux->n);
+    }
+    if (inFlux->n < 2) {
+        // XXX: psWarning("pmNonLinearityLookup(): input vector less than 2 elements");
+        return(in);
+    }
+
+    for (i=0;i<(in->image)->numRows;i++) {
+        for (j=0;j<(in->image)->numCols;j++) {
+            x.data.F32 = (in->image)->data.F32[i][j];
+            binNum = p_psVectorBinDisect((psVector *)inFlux, &x);
+
+            if (binNum == -2) {
+                // We get here if x is below the table lookup range.
+                (in->image)->data.F32[i][j] = outFlux->data.F32[0];
+                numPixels++;
+
+            } else if (binNum == -1) {
+                // We get here if x is above the table lookup range.
+                (in->image)->data.F32[i][j] = outFlux->data.F32[tableSize-1];
+
+                numPixels++;
+            } else {
+                // Perform linear interpolation.
+                slope = (outFlux->data.F32[binNum+1] - outFlux->data.F32[binNum]) /
+                        (inFlux->data.F32[binNum+1]  - inFlux->data.F32[binNum]);
+                (in->image)->data.F32[i][j] = outFlux->data.F32[binNum] +
+                                              ((x.data.F32 - inFlux->data.F32[binNum]) * slope);
+            }
+        }
+    }
+    if (numPixels > 0) {
+        // XXX: psWarning("Warning: pmNonLinearityLookup(): %d pixels outside table.", numPixels);
+    }
+    return(in);
+}
Index: trunk/psModules/src/pmNonLinear.h
===================================================================
--- trunk/psModules/src/pmNonLinear.h	(revision 1899)
+++ trunk/psModules/src/pmNonLinear.h	(revision 1899)
@@ -0,0 +1,34 @@
+/** @file  pmLinear.h
+ *
+ *  This file will ...
+ *
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-09-25 19:57:52 $
+ *
+ *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#if !defined(PM_NON_LINEAR_H)
+#define PM_NON_LINEAR_H
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include<stdio.h>
+#include<math.h>
+#include "pslib.h"
+// XXX: have Desonia do this correctly.
+#include "../../psLib/src/dataManip/psConstants.h"
+
+psReadout *pmNonLinearityPolynomial(psReadout *in,
+                                    const psPolynomial1D *coeff);
+
+psReadout *pmNonLinearityLookup(psReadout *in,
+                                const psVector *inFlux,
+                                const psVector *outFlux);
+
+#endif
