Index: trunk/psLib/src/math/psMinimize.c
===================================================================
--- trunk/psLib/src/math/psMinimize.c	(revision 1982)
+++ trunk/psLib/src/math/psMinimize.c	(revision 1991)
@@ -9,6 +9,6 @@
  *  @author GLF, MHPCC
  *
- *  @version $Revision: 1.55 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-06 21:30:53 $
+ *  @version $Revision: 1.56 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-06 23:29:16 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -1297,4 +1297,6 @@
  
 XXX: Define constants for default dummy number of iterations and tolerance.
+ 
+XXX: Must define behavior on various NULL inputs.
  *****************************************************************************/
 bool psMinimizePowell(psMinimization *min,
@@ -1304,4 +1306,10 @@
                       psMinimizePowellFunc func)
 {
+    PS_CHECK_NULL_VECTOR_RETURN_NULL(params);
+    PS_CHECK_EMPTY_VECTOR_RETURN_NULL(params);
+    PS_CHECK_NULL_PTR_RETURN_NULL(min);
+    PS_CHECK_NULL_PTR_RETURN_NULL(coords);
+    PS_CHECK_NULL_PTR_RETURN_NULL(func);
+
     int numDims = params->n;
     int i = 0;
@@ -1311,4 +1319,5 @@
     psVector *Q = NULL;
     psVector *u = NULL;
+    psVector *myParamMask = NULL;  // XXX: Use a recylced vector here.
     psMinimization dummyMin;
     float mul = 0.0;
@@ -1333,4 +1342,14 @@
     Q = psVectorAlloc(numDims, PS_TYPE_F32);
 
+    if (paramMask == NULL) {
+        myParamMask = psVectorAlloc(params->n, PS_TYPE_U8);
+        for (i=0;i<myParamMask->n;i++) {
+            myParamMask->data.U8[i] = 0;
+        }
+    } else {
+        myParamMask = (psVector *) paramMask;
+    }
+    PS_CHECK_VECTOR_SIZE_EQUAL_RETURN_NULL(params, myParamMask);
+
     // 1: Set v[i] to be the unit vectors for each dimension in params
     v = (psVector **) psAlloc(params->n * sizeof(psVector **));
@@ -1348,5 +1367,5 @@
     // 2: Set Q to be the initial params (P in the ADD)
     for (i=0;i<numDims;i++) {
-        if (paramMask->data.U8[i] == 0) {
+        if (myParamMask->data.U8[i] == 0) {
             Q->data.F32[i] = params->data.F32[i];
         }
@@ -1368,8 +1387,8 @@
         biggestIter = 0;
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 dummyMin.maxIter = 100;
                 dummyMin.tol = 0.01;
-                mul = p_psLineMin(&dummyMin, Q, v[i], paramMask, coords, func);
+                mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func);
                 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) {
                     biggestDiff = fabs(dummyMin.value - currFuncVal);
@@ -1382,5 +1401,5 @@
         // 4: Set the vector u = Q - P
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 u->data.F32[i] = Q->data.F32[i] - params->data.F32[i];
 
@@ -1402,5 +1421,5 @@
         }
 
-        mul = p_psLineMin(min, params, u, paramMask, coords, func);
+        mul = p_psLineMin(min, params, u, myParamMask, coords, func);
 
         // 6:
@@ -1413,4 +1432,7 @@
             psFree(pQP);
             psFree(Q);
+            if (paramMask == NULL) {
+                psFree(myParamMask);
+            }
             psTrace(".psLib.dataManip.psMinimizePowell", 4,
                     "---- psMinimizePowell() end (true) ----\n");
@@ -1419,5 +1441,5 @@
 
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i];
             } else {
@@ -1434,5 +1456,5 @@
         if (term1 < term2) {
             for (i=0;i<numDims;i++) {
-                if (paramMask->data.U8[i] == 0) {
+                if (myParamMask->data.U8[i] == 0) {
                     v[biggestIter]->data.F32[i] = u->data.F32[i];
                 }
@@ -1442,5 +1464,5 @@
         // 7: Set P to Q
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 params->data.F32[i] = Q->data.F32[i];
             }
@@ -1458,8 +1480,14 @@
             psTrace(".psLib.dataManip.psMinimizePowell", 4,
                     "---- psMinimizePowell() end (true) ----\n");
+            if (paramMask == NULL) {
+                psFree(myParamMask);
+            }
             return(true);
         }
     }
 
+    if (paramMask == NULL) {
+        psFree(myParamMask);
+    }
     for (i=0;i<numDims;i++) {
         psFree(v[i]);
