mnteigen.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: mnteigen.cxx 20880 2007-11-19 11:23:41Z rdm $
00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  
00003 
00004 /**********************************************************************
00005  *                                                                    *
00006  * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
00007  *                                                                    *
00008  **********************************************************************/
00009 
00010 /* mneig.F -- translated by f2c (version 20010320).
00011    You must link the resulting object file with the libraries:
00012         -lf2c -lm   (in that order)
00013 */
00014 
00015 #include <math.h>
00016 
00017 namespace ROOT {
00018 
00019    namespace Minuit2 {
00020 
00021 
00022 int mneigen(double* a, unsigned int ndima, unsigned int n, unsigned int mits, 
00023             double* work, double precis) {
00024    // compute matrix eignevalues (transaltion from mneig.F of Minuit)
00025    
00026    /* System generated locals */
00027    unsigned int a_dim1, a_offset, i__1, i__2, i__3;
00028    double r__1, r__2;
00029    
00030    /* Local variables */
00031    double b, c__, f, h__;
00032    unsigned int i__, j, k, l, m = 0;
00033    double r__, s;
00034    unsigned int i0, i1, j1, m1, n1;
00035    double hh, gl, pr, pt;
00036    
00037    
00038    /*          PRECIS is the machine precision EPSMAC */
00039    /* Parameter adjustments */
00040    a_dim1 = ndima;
00041    a_offset = 1 + a_dim1 * 1;
00042    a -= a_offset;
00043    --work;
00044    
00045    /* Function Body */
00046    int ifault = 1;
00047    
00048    i__ = n;
00049    i__1 = n;
00050    for (i1 = 2; i1 <= i__1; ++i1) {
00051       l = i__ - 2;
00052       f = a[i__ + (i__ - 1) * a_dim1];
00053       gl = (double)0.;
00054       
00055       if (l < 1) {
00056          goto L25;
00057       }
00058       
00059       i__2 = l;
00060       for (k = 1; k <= i__2; ++k) {
00061          /* Computing 2nd power */
00062          r__1 = a[i__ + k * a_dim1];
00063          gl += r__1 * r__1;
00064       }
00065 L25:
00066          /* Computing 2nd power */
00067          r__1 = f;
00068       h__ = gl + r__1 * r__1;
00069       
00070       if (gl > (double)1e-35) {
00071          goto L30;
00072       }
00073       
00074       work[i__] = (double)0.;
00075       work[n + i__] = f;
00076       goto L65;
00077 L30:
00078          ++l;
00079       
00080       gl = sqrt(h__);
00081       
00082       if (f >= (double)0.) {
00083          gl = -gl;
00084       }
00085       
00086       work[n + i__] = gl;
00087       h__ -= f * gl;
00088       a[i__ + (i__ - 1) * a_dim1] = f - gl;
00089       f = (double)0.;
00090       i__2 = l;
00091       for (j = 1; j <= i__2; ++j) {
00092          a[j + i__ * a_dim1] = a[i__ + j * a_dim1] / h__;
00093          gl = (double)0.;
00094          i__3 = j;
00095          for (k = 1; k <= i__3; ++k) {
00096             gl += a[j + k * a_dim1] * a[i__ + k * a_dim1];
00097          }
00098          
00099          if (j >= l) {
00100             goto L47;
00101          }
00102          
00103          j1 = j + 1;
00104          i__3 = l;
00105          for (k = j1; k <= i__3; ++k) {
00106             gl += a[k + j * a_dim1] * a[i__ + k * a_dim1];
00107          }
00108 L47:
00109             work[n + j] = gl / h__;
00110          f += gl * a[j + i__ * a_dim1];
00111       }
00112       hh = f / (h__ + h__);
00113       i__2 = l;
00114       for (j = 1; j <= i__2; ++j) {
00115          f = a[i__ + j * a_dim1];
00116          gl = work[n + j] - hh * f;
00117          work[n + j] = gl;
00118          i__3 = j;
00119          for (k = 1; k <= i__3; ++k) {
00120             a[j + k * a_dim1] = a[j + k * a_dim1] - f * work[n + k] - gl 
00121             * a[i__ + k * a_dim1];
00122          }
00123       }
00124       work[i__] = h__;
00125 L65:
00126          --i__;
00127    }
00128    work[1] = (double)0.;
00129    work[n + 1] = (double)0.;
00130    i__1 = n;
00131    for (i__ = 1; i__ <= i__1; ++i__) {
00132       l = i__ - 1;
00133       
00134       if (work[i__] == (double)0. || l == 0) {
00135          goto L100;
00136       }
00137       
00138       i__3 = l;
00139       for (j = 1; j <= i__3; ++j) {
00140          gl = (double)0.;
00141          i__2 = l;
00142          for (k = 1; k <= i__2; ++k) {
00143             gl += a[i__ + k * a_dim1] * a[k + j * a_dim1];
00144          }
00145          i__2 = l;
00146          for (k = 1; k <= i__2; ++k) {
00147             a[k + j * a_dim1] -= gl * a[k + i__ * a_dim1];
00148          }
00149       }
00150 L100:
00151          work[i__] = a[i__ + i__ * a_dim1];
00152       a[i__ + i__ * a_dim1] = (double)1.;
00153       
00154       if (l == 0) {
00155          goto L110;
00156       }
00157       
00158       i__2 = l;
00159       for (j = 1; j <= i__2; ++j) {
00160          a[i__ + j * a_dim1] = (double)0.;
00161          a[j + i__ * a_dim1] = (double)0.;
00162       }
00163 L110:
00164          ;
00165    }
00166    
00167    
00168    n1 = n - 1;
00169    i__1 = n;
00170    for (i__ = 2; i__ <= i__1; ++i__) {
00171       i0 = n + i__ - 1;
00172       work[i0] = work[i0 + 1];
00173    }
00174    work[n + n] = (double)0.;
00175    b = (double)0.;
00176    f = (double)0.;
00177    i__1 = n;
00178    for (l = 1; l <= i__1; ++l) {
00179       j = 0;
00180       h__ = precis * ((r__1 = work[l], fabs(r__1)) + (r__2 = work[n + l], 
00181                                                       fabs(r__2)));
00182       
00183       if (b < h__) {
00184          b = h__;
00185       }
00186       
00187       i__2 = n;
00188       for (m1 = l; m1 <= i__2; ++m1) {
00189          m = m1;
00190          
00191          if ((r__1 = work[n + m], fabs(r__1)) <= b) {
00192             goto L150;
00193          }
00194          
00195       }
00196       
00197 L150:
00198          if (m == l) {
00199             goto L205;
00200          }
00201       
00202 L160:
00203          if (j == mits) {
00204             return ifault;
00205          }
00206       
00207       ++j;
00208       pt = (work[l + 1] - work[l]) / (work[n + l] * (double)2.);
00209       r__ = sqrt(pt * pt + (double)1.);
00210       pr = pt + r__;
00211       
00212       if (pt < (double)0.) {
00213          pr = pt - r__;
00214       }
00215       
00216       h__ = work[l] - work[n + l] / pr;
00217       i__2 = n;
00218       for (i__ = l; i__ <= i__2; ++i__) {
00219          work[i__] -= h__;
00220       }
00221       f += h__;
00222       pt = work[m];
00223       c__ = (double)1.;
00224       s = (double)0.;
00225       m1 = m - 1;
00226       i__ = m;
00227       i__2 = m1;
00228       for (i1 = l; i1 <= i__2; ++i1) {
00229          j = i__;
00230          --i__;
00231          gl = c__ * work[n + i__];
00232          h__ = c__ * pt;
00233          
00234          if (fabs(pt) >= (r__1 = work[n + i__], fabs(r__1))) {
00235             goto L180;
00236          }
00237          
00238          c__ = pt / work[n + i__];
00239          r__ = sqrt(c__ * c__ + (double)1.);
00240          work[n + j] = s * work[n + i__] * r__;
00241          s = (double)1. / r__;
00242          c__ /= r__;
00243          goto L190;
00244 L180:
00245             c__ = work[n + i__] / pt;
00246          r__ = sqrt(c__ * c__ + (double)1.);
00247          work[n + j] = s * pt * r__;
00248          s = c__ / r__;
00249          c__ = (double)1. / r__;
00250 L190:
00251             pt = c__ * work[i__] - s * gl;
00252          work[j] = h__ + s * (c__ * gl + s * work[i__]);
00253          i__3 = n;
00254          for (k = 1; k <= i__3; ++k) {
00255             h__ = a[k + j * a_dim1];
00256             a[k + j * a_dim1] = s * a[k + i__ * a_dim1] + c__ * h__;
00257             a[k + i__ * a_dim1] = c__ * a[k + i__ * a_dim1] - s * h__;
00258          }
00259       }
00260       work[n + l] = s * pt;
00261       work[l] = c__ * pt;
00262       
00263       if ((r__1 = work[n + l], fabs(r__1)) > b) {
00264          goto L160;
00265       }
00266       
00267 L205:
00268          work[l] += f;
00269    }
00270    i__1 = n1;
00271    for (i__ = 1; i__ <= i__1; ++i__) {
00272       k = i__;
00273       pt = work[i__];
00274       i1 = i__ + 1;
00275       i__3 = n;
00276       for (j = i1; j <= i__3; ++j) {
00277          
00278          if (work[j] >= pt) {
00279             goto L220;
00280          }
00281          
00282          k = j;
00283          pt = work[j];
00284 L220:
00285             ;
00286       }
00287       
00288       if (k == i__) {
00289          goto L240;
00290       }
00291       
00292       work[k] = work[i__];
00293       work[i__] = pt;
00294       i__3 = n;
00295       for (j = 1; j <= i__3; ++j) {
00296          pt = a[j + i__ * a_dim1];
00297          a[j + i__ * a_dim1] = a[j + k * a_dim1];
00298          a[j + k * a_dim1] = pt;
00299       }
00300 L240:
00301          ;
00302    }
00303    ifault = 0;
00304    
00305    return ifault;
00306 } /* mneig_ */
00307 
00308 
00309    }  // namespace Minuit2
00310 
00311 }  // namespace ROOT

Generated on Tue Jul 5 14:37:10 2011 for ROOT_528-00b_version by  doxygen 1.5.1