Index: trunk/psModules/src/objects/pmSource.c
===================================================================
--- trunk/psModules/src/objects/pmSource.c	(revision 13898)
+++ trunk/psModules/src/objects/pmSource.c	(revision 13982)
@@ -6,6 +6,6 @@
  *  @author EAM, IfA: significant modifications.
  *
- *  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-06-20 02:22:26 $
+ *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-06-26 19:27:37 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -42,7 +42,9 @@
     psFree(tmp->maskView);
     psFree(tmp->modelFlux);
+    psFree(tmp->psfFlux);
     psFree(tmp->moments);
     psFree(tmp->modelPSF);
     psFree(tmp->modelEXT);
+    psFree(tmp->modelConv);
     psFree(tmp->blends);
     psTrace("psModules.objects", 5, "---- end ----\n");
@@ -61,4 +63,5 @@
     psFree (source->maskView);
     psFree (source->modelFlux);
+    psFree (source->psfFlux);
 
     source->pixels = NULL;
@@ -67,4 +70,5 @@
     source->maskView = NULL;
     source->modelFlux = NULL;
+    source->psfFlux = NULL;
     return;
 }
@@ -86,8 +90,10 @@
     source->maskView = NULL;
     source->modelFlux = NULL;
+    source->psfFlux = NULL;
     source->moments = NULL;
     source->blends = NULL;
     source->modelPSF = NULL;
     source->modelEXT = NULL;
+    source->modelConv = NULL;
     source->type = PM_SOURCE_TYPE_UNKNOWN;
     source->mode = PM_SOURCE_MODE_DEFAULT;
@@ -223,4 +229,8 @@
         psFree (mySource->modelFlux);
         mySource->modelFlux = NULL;
+
+        // drop the old psfFlux pixels and force the user to re-create
+        psFree (mySource->psfFlux);
+        mySource->psfFlux = NULL;
     }
     return extend;
@@ -765,4 +775,22 @@
 }
 
+// construct a realization of the source model
+// XXX this function should optionally save an existing psf image from modelFlux
+bool pmSourceCachePSF (pmSource *source, psMaskType maskVal) {
+
+    // select appropriate model
+    if (source->modelPSF == NULL) return false;  // model must be defined
+
+    // if we already have a cached image, re-use that memory
+    source->psfFlux = psImageCopy (source->psfFlux, source->pixels, PS_TYPE_F32);
+    psImageInit (source->psfFlux, 0.0);
+
+    // in some places (psphotEnsemble), we need a normalized version
+    // in others, we just want the model.  which is more commonly used?
+    // psfFlux always has unity normalization (I0 = 1.0)
+    pmModelAdd (source->psfFlux, source->maskObj, source->modelPSF, PM_MODEL_OP_FULL | PM_MODEL_OP_NORM, maskVal);
+    return true;
+}
+
 // should we call pmSourceCacheModel if it does not exist?
 bool pmSourceOp (pmSource *source, pmModelOpMode mode, bool add, psMaskType maskVal) {
@@ -864,4 +892,5 @@
         return model;
 
+// XXX when should I return the modelConv ??
     case PM_SOURCE_TYPE_EXTENDED:
         model = source->modelEXT;
