Index: trunk/psLib/src/dataManip/psMinimize.c
===================================================================
--- trunk/psLib/src/dataManip/psMinimize.c	(revision 2238)
+++ trunk/psLib/src/dataManip/psMinimize.c	(revision 2239)
@@ -9,6 +9,6 @@
  *  @author GLG, MHPCC
  *
- *  @version $Revision: 1.76 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-29 21:19:49 $
+ *  @version $Revision: 1.77 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-29 21:37:09 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -1206,4 +1206,6 @@
     psVector *tmp = NULL;
     psBool boolLineIsNull = true;
+    float prevMin = 0.0;
+    int countMin = 0;
 
     psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
@@ -1224,6 +1226,4 @@
 
 
-    determineINitialBracket(params, paramMask, line, coords, func, &a, &b, &fa, &fb);
-
     a = -1.0;
     b = 0.0;
@@ -1244,4 +1244,7 @@
         fc = func(tmp, coords);
     } while (fabs(fc - fb) < FLT_EPSILON);
+
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+            "initial (fa, Fb, Fc) is (%f, %f, %f)\n", fa, fb, fc);
 
     if ((fb < fa) && (fb < fc)) {
@@ -1257,5 +1260,5 @@
     // The object of this code is to set the initial point a to 0.0, and
     // ensure that (fb < fa).
-    if (fc < fb) {
+    if (!(fc < fb)) {
         a = b;
         b = c;
@@ -1301,4 +1304,23 @@
             fb = fc;
         }
+
+        // This code maintains a count of how many times the minimum fc has
+        // statyed the same.  If it gets too high, we exit this loop.
+        if (fc == prevMin) {
+            countMin++;
+        } else {
+            countMin = 0;
+        }
+        prevMin = fc;
+        if (countMin == 10) {
+            bracket->data.F32[0] = a;
+            bracket->data.F32[1] = b;
+            bracket->data.F32[2] = c;
+            psFree(tmp);
+            psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                    "---- p_psDetermineBracket() end ----\n");
+            return(bracket);
+        }
+
         iter++;
     }
@@ -1401,4 +1423,5 @@
         psFree(tmpn);
         psError(__func__, "(1) Could not bracket minimum.");
+        return(NAN);
     }
 
@@ -1612,4 +1635,18 @@
                 dummyMin.tol = 0.01;
                 mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func);
+                if (isnan(mul)) {
+                    psError(__func__, "Could not perform line minimization (1).\n");
+                    psFree(pQP);
+                    psFree(u);
+                    psFree(Q);
+                    if (paramMask == NULL) {
+                        psFree(myParamMask);
+                    }
+                    for (i=0;i<numDims;i++) {
+                        psFree(v[i]);
+                    }
+                    psFree(v);
+                    return(false);
+                }
                 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) {
                     biggestDiff = fabs(dummyMin.value - currFuncVal);
@@ -1643,4 +1680,18 @@
 
         mul = p_psLineMin(min, params, u, myParamMask, coords, func);
+        if (isnan(mul)) {
+            psError(__func__, "Could not perform line minimization. (2)\n");
+            psFree(pQP);
+            psFree(u);
+            psFree(Q);
+            if (paramMask == NULL) {
+                psFree(myParamMask);
+            }
+            for (i=0;i<numDims;i++) {
+                psFree(v[i]);
+            }
+            psFree(v);
+            return(false);
+        }
 
         // 6:
