Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCM_MinimizeChisq.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCM_MinimizeChisq.c	(revision 28907)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCM_MinimizeChisq.c	(revision 28908)
@@ -43,4 +43,7 @@
 # define FACILITY "psModules.objects"
 
+# define USE_FFT 1
+# define PRE_CONVOLVE 1
+
 bool pmPCM_MinimizeChisq (
     psMinimization *min,
@@ -86,4 +89,11 @@
     psF32 dLinear = 0.0;
 
+# if (USE_FFT && PRE_CONVOLVE)
+    if (pcm->psfFFT) {
+	psFree (pcm->psfFFT);
+    }
+    pcm->psfFFT = psImageConvolveKernelInit(pcm->modelFlux, pcm->psf);
+# endif    
+
     // calculate initial alpha and beta, set chisq (min->value)
     min->value = pmPCM_SetABX(alpha, beta, params, paramMask, pcm, source);
@@ -293,4 +303,29 @@
     // XXX speed this up by saving the FFTed psf (for each source, obviously)
 
+    // XXX save the FFT'ed psf
+    // XXX create an alternative function which takes a pre-FFTed kernel
+
+# if (USE_FFT)
+# if (PRE_CONVOLVE)
+    // convolve model image and derivative images with pre-convolved kernel
+    psImageConvolveKernel (pcm->modelConvFlux, pcm->modelFlux, NULL, 0, pcm->psfFFT);
+    for (int n = 0; n < pcm->dmodelsFlux->n; n++) {
+        if (pcm->dmodelsFlux->data[n] == NULL) continue;
+        psImage *dmodel = pcm->dmodelsFlux->data[n];
+        psImage *dmodelConv = pcm->dmodelsConvFlux->data[n];
+        psImageConvolveKernel (dmodelConv, dmodel, NULL, 0, pcm->psfFFT);
+    }
+# else
+    // convolve model image and derivative images with psf via FFT
+    psImageConvolveFFT (pcm->modelConvFlux, pcm->modelFlux, NULL, 0, pcm->psf);
+    for (int n = 0; n < pcm->dmodelsFlux->n; n++) {
+        if (pcm->dmodelsFlux->data[n] == NULL) continue;
+        psImage *dmodel = pcm->dmodelsFlux->data[n];
+        psImage *dmodelConv = pcm->dmodelsConvFlux->data[n];
+        psImageConvolveFFT (dmodelConv, dmodel, NULL, 0, pcm->psf);
+    }
+# endif // PRE-CONVOLVE
+# else
+    // convolve model image and derivative images with psf direct
     psImageConvolveDirect (pcm->modelConvFlux, pcm->modelFlux, pcm->psf);
     for (int n = 0; n < pcm->dmodelsFlux->n; n++) {
@@ -300,4 +335,5 @@
         psImageConvolveDirect (dmodelConv, dmodel, pcm->psf);
     }
+# endif // USE_FFT
 
     // XXX TEST : SAVE IMAGES
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCMdata.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCMdata.c	(revision 28907)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCMdata.c	(revision 28908)
@@ -52,4 +52,5 @@
     psFree (pcm->modelConv);
     psFree (pcm->psf);
+    psFree (pcm->psfFFT);
     psFree (pcm->constraint);
     return;
@@ -84,4 +85,5 @@
     pcm->modelConv = NULL;
     pcm->psf = NULL;
+    pcm->psfFFT = NULL;
     pcm->constraint = NULL;
     pcm->nDOF = 0;
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCMdata.h
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCMdata.h	(revision 28907)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmPCMdata.h	(revision 28908)
@@ -29,4 +29,6 @@
     pmModel *modelConv;
     psKernel *psf;
+    psKernelFFT *psfFFT;
+
     psMinConstraint *constraint;
     int nPix;
