Skip Navigation Links
Numerical Libraries
Linear Algebra
Differential Equations
Optimization
Samples
Skip Navigation Links
Linear Algebra
CSLapack
CSBlas
   1:  #region Translated by Jose Antonio De Santiago-Castillo.
   2:   
   3:  //Translated by Jose Antonio De Santiago-Castillo. 
   4:  //E-mail:JAntonioDeSantiago@gmail.com
   5:  //Web: www.DotNumerics.com
   6:  //
   7:  //Fortran to C# Translation.
   8:  //Translated by:
   9:  //F2CSharp Version 0.71 (November 10, 2009)
  10:  //Code Optimizations: None
  11:  //
  12:  #endregion
  13:   
  14:  using System;
  15:  using DotNumerics.FortranLibrary;
  16:   
  17:  namespace DotNumerics.CSLapack
  18:  {
  19:      /// <summary>
  20:      /// -- LAPACK auxiliary routine (version 3.1) --
  21:      /// Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  22:      /// November 2006
  23:      /// Purpose
  24:      /// =======
  25:      /// 
  26:      /// DLASSQ  returns the values  scl  and  smsq  such that
  27:      /// 
  28:      /// ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
  29:      /// 
  30:      /// where  x( i ) = X( 1 + ( i - 1 )*INCX ). The value of  sumsq  is
  31:      /// assumed to be non-negative and  scl  returns the value
  32:      /// 
  33:      /// scl = max( scale, abs( x( i ) ) ).
  34:      /// 
  35:      /// scale and sumsq must be supplied in SCALE and SUMSQ and
  36:      /// scl and smsq are overwritten on SCALE and SUMSQ respectively.
  37:      /// 
  38:      /// The routine makes only one pass through the vector x.
  39:      /// 
  40:      ///</summary>
  41:      public class DLASSQ
  42:      {
  43:      
  44:   
  45:          #region Fields
  46:          
  47:          const double ZERO = 0.0E+0; int IX = 0; double ABSXI = 0; 
  48:   
  49:          #endregion
  50:   
  51:          public DLASSQ()
  52:          {
  53:      
  54:          }
  55:      
  56:          /// <summary>
  57:          /// Purpose
  58:          /// =======
  59:          /// 
  60:          /// DLASSQ  returns the values  scl  and  smsq  such that
  61:          /// 
  62:          /// ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
  63:          /// 
  64:          /// where  x( i ) = X( 1 + ( i - 1 )*INCX ). The value of  sumsq  is
  65:          /// assumed to be non-negative and  scl  returns the value
  66:          /// 
  67:          /// scl = max( scale, abs( x( i ) ) ).
  68:          /// 
  69:          /// scale and sumsq must be supplied in SCALE and SUMSQ and
  70:          /// scl and smsq are overwritten on SCALE and SUMSQ respectively.
  71:          /// 
  72:          /// The routine makes only one pass through the vector x.
  73:          /// 
  74:          ///</summary>
  75:          /// <param name="N">
  76:          /// (input) INTEGER
  77:          /// The number of elements to be used from the vector X.
  78:          ///</param>
  79:          /// <param name="X">
  80:          /// (input) DOUBLE PRECISION array, dimension (N)
  81:          /// The vector for which a scaled sum of squares is computed.
  82:          /// x( i )  = X( 1 + ( i - 1 )*INCX ), 1 .LE. i .LE. n.
  83:          ///</param>
  84:          /// <param name="INCX">
  85:          /// (input) INTEGER
  86:          /// The increment between successive values of the vector X.
  87:          /// INCX .GT. 0.
  88:          ///</param>
  89:          /// <param name="SCALE">
  90:          /// and sumsq must be supplied in SCALE and SUMSQ and
  91:          ///</param>
  92:          /// <param name="SUMSQ">
  93:          /// (input/output) DOUBLE PRECISION
  94:          /// On entry, the value  sumsq  in the equation above.
  95:          /// On exit, SUMSQ is overwritten with  smsq , the basic sum of
  96:          /// squares from which  scl  has been factored out.
  97:          ///</param>
  98:          public void Run(int N, double[] X, int offset_x, int INCX, ref double SCALE, ref double SUMSQ)
  99:          {
 100:   
 101:              #region Array Index Correction
 102:              
 103:               int o_x = -1 + offset_x; 
 104:   
 105:              #endregion
 106:   
 107:   
 108:              #region Prolog
 109:              
 110:              // *
 111:              // *  -- LAPACK auxiliary routine (version 3.1) --
 112:              // *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
 113:              // *     November 2006
 114:              // *
 115:              // *     .. Scalar Arguments ..
 116:              // *     ..
 117:              // *     .. Array Arguments ..
 118:              // *     ..
 119:              // *
 120:              // *  Purpose
 121:              // *  =======
 122:              // *
 123:              // *  DLASSQ  returns the values  scl  and  smsq  such that
 124:              // *
 125:              // *     ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
 126:              // *
 127:              // *  where  x( i ) = X( 1 + ( i - 1 )*INCX ). The value of  sumsq  is
 128:              // *  assumed to be non-negative and  scl  returns the value
 129:              // *
 130:              // *     scl = max( scale, abs( x( i ) ) ).
 131:              // *
 132:              // *  scale and sumsq must be supplied in SCALE and SUMSQ and
 133:              // *  scl and smsq are overwritten on SCALE and SUMSQ respectively.
 134:              // *
 135:              // *  The routine makes only one pass through the vector x.
 136:              // *
 137:              // *  Arguments
 138:              // *  =========
 139:              // *
 140:              // *  N       (input) INTEGER
 141:              // *          The number of elements to be used from the vector X.
 142:              // *
 143:              // *  X       (input) DOUBLE PRECISION array, dimension (N)
 144:              // *          The vector for which a scaled sum of squares is computed.
 145:              // *             x( i )  = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n.
 146:              // *
 147:              // *  INCX    (input) INTEGER
 148:              // *          The increment between successive values of the vector X.
 149:              // *          INCX > 0.
 150:              // *
 151:              // *  SCALE   (input/output) DOUBLE PRECISION
 152:              // *          On entry, the value  scale  in the equation above.
 153:              // *          On exit, SCALE is overwritten with  scl , the scaling factor
 154:              // *          for the sum of squares.
 155:              // *
 156:              // *  SUMSQ   (input/output) DOUBLE PRECISION
 157:              // *          On entry, the value  sumsq  in the equation above.
 158:              // *          On exit, SUMSQ is overwritten with  smsq , the basic sum of
 159:              // *          squares from which  scl  has been factored out.
 160:              // *
 161:              // * =====================================================================
 162:              // *
 163:              // *     .. Parameters ..
 164:              // *     ..
 165:              // *     .. Local Scalars ..
 166:              // *     ..
 167:              // *     .. Intrinsic Functions ..
 168:              //      INTRINSIC          ABS;
 169:              // *     ..
 170:              // *     .. Executable Statements ..
 171:              // *
 172:   
 173:              #endregion
 174:   
 175:   
 176:              #region Body
 177:              
 178:              if (N > 0)
 179:              {
 180:                  for (IX = 1; (INCX >= 0) ? (IX <= 1 + (N - 1) * INCX) : (IX >= 1 + (N - 1) * INCX); IX += INCX)
 181:                  {
 182:                      if (X[IX + o_x] != ZERO)
 183:                      {
 184:                          ABSXI = Math.Abs(X[IX + o_x]);
 185:                          if (SCALE < ABSXI)
 186:                          {
 187:                              SUMSQ = 1 + SUMSQ * Math.Pow(SCALE / ABSXI,2);
 188:                              SCALE = ABSXI;
 189:                          }
 190:                          else
 191:                          {
 192:                              SUMSQ = SUMSQ + Math.Pow(ABSXI / SCALE,2);
 193:                          }
 194:                      }
 195:                  }
 196:              }
 197:              return;
 198:              // *
 199:              // *     End of DLASSQ
 200:              // *
 201:   
 202:              #endregion
 203:   
 204:          }
 205:      }
 206:  }