ROOT logo
// @(#)root/table:$Id$
// Author: Valery Fine(fine@bnl.gov)   25/09/99

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TCernLib
#define ROOT_TCernLib

#include "Rtypes.h"
#include <string.h>

// http://wwwinfo.cern.ch/asdoc/shortwrupsdir/f110/top.html

///////////////////////////////////////////////////////////////////////////////////////
//                                                                                   //
// The routines of MXPACK compute the product of two matrices or the product of      //
// their transposed matrices and may add or subtract to the resultant matrix         //
// a third one, add or subtract one matrix from another, or transfer a matrix,       //
// its negative, or a multiple of it, transpose a given matrix, build up a unit      //
// matrix, multiply a matrix by a diagonal (from left or from right) and may         //
// add the result to another matrix, add to square matrix the multiple of a diagonal //
// matrix, compute the products <IMG WIDTH=79 HEIGHT=12 ALIGN=BOTTOM ALT="tex2html_wrap_inline191" SRC="gif/mxpack_ABAt.gif"> (<IMG WIDTH=16 HEIGHT=12 ALIGN=BOTTOM ALT="tex2html_wrap_inline193" SRC="gif/mxpack_At.gif"> denotes the transpose of <IMG WIDTH=1
// It is assumed that matrices are begin_html <B>row-wise without gaps</B> end_html without gaps.                     //
//                                                                                   //
///////////////////////////////////////////////////////////////////////////////////////

class TArrayD;

class TCL  {
public:
   virtual ~TCL() { }

   static int    *ucopy(const int    *a, int    *b, int n);
   static float  *ucopy(const float  *a, float  *b, int n);
   static double *ucopy(const float  *a, double *b, int n);
   static float  *ucopy(const double *a, float  *b, int n);
   static double *ucopy(const double *a, double *b, int n);
   static void  **ucopy(const void **a, void  **b, int n);

   static float  *vzero(float *a,  int n2);
   static double *vzero(double *a, int n2);
   static void  **vzero(void **a,  int n2);

   static float  *vadd(const float *b,  const float  *c,  float *a, int n);
   static double *vadd(const double *b, const double *c, double *a, int n);

   static float  *vadd(const float *b,  const double *c, float *a, int n);
   static double *vadd(const double *b, const float  *c,double *a, int n);

   static float   vdot(const float  *b, const float  *a, int n);
   static double  vdot(const double *b, const double *a, int n);

   static float  *vsub(const float  *a, const float  *b, float  *x, int n);
   static double *vsub(const double *a, const double *b, double *x, int n);
   static float  *vsub(const float  *b, const double *c, float  *a, int n);
   static double *vsub(const double *b, const float  *c, double *a, int n);

   static float  *vcopyn(const float *a,  float *x, int n);
   static double *vcopyn(const double *a, double *x, int n);

   static float  *vscale(const float  *a, float  scale, float  *b, int n);
   static double *vscale(const double *a, double scale, double *b, int n);

   static float  *vlinco(const float  *a, float  fa, const float  *b, float  fb,float  *x, int n);
   static double *vlinco(const double *a, double fa, const double *b, double fb,double *x, int n);

   static float  *vmatl(const float  *g, const float  *c, float  *x, int n=3,int m=3);
   static double *vmatl(const double *g, const double *c, double *x, int n=3,int m=3);

   static float  *vmatr(const float  *c, const float  *g, float  *x, int n=3,int m=3);
   static double *vmatr(const double *c, const double *g, double *x, int n=3,int m=3);

   static float *mxmad_0_(int n, const float *a, const float *b, float *c, int i, int j, int k);

   static float *mxmad( const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmad1(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmad2(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmad3(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmpy( const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmpy1(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmpy2(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmpy3(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmub( const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmub1(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmub2(const float *a, const float *b, float *c, int i, int j, int k);
   static float *mxmub3(const float *a, const float *b, float *c, int i, int j, int k);

   static float *mxmlrt_0_(int n__, const float *a, const float *b, float *c, int ni,int nj);
   static float *mxmlrt(const float *a, const float *b, float *c, int ni, int nj);
   static float *mxmltr(const float *a, const float *b, float *c, int ni, int nj);
   static float *mxtrp(const float *a, float *b, int i, int j);

   static double *mxmad_0_(int n, const double *a, const double *b, double *c, int i, int j, int k);

   static double *mxmad (const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmad1(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmad2(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmad3(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmpy (const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmpy1(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmpy2(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmpy3(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmub (const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmub1(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmub2(const double *a, const double *b, double *c, int i, int j, int k);
   static double *mxmub3(const double *a, const double *b, double *c, int i, int j, int k);

   static double *mxmlrt_0_(int n__, const double *a, const double *b, double *c, int ni,int nj);
   static double *mxmlrt(const double *a, const double *b, double *c, int ni, int nj);
   static double *mxmltr(const double *a, const double *b, double *c, int ni, int nj);
   static double *mxtrp(const double *a, double *b, int i, int j);

// * TR pack

   static float *traat(const float *a, float *s, int m, int n);
   static float *tral(const float *a, const float *u, float *b, int m, int n);
   static float *tralt(const float *a, const float *u, float *b, int m, int n);
   static float *tras(const float *a, const float *s, float *b, int m, int n);
   static float *trasat(const float *a, const float *s, float *r, int m, int n);
   static float *trasat(const double *a, const float *s, float *r, int m, int n);
   static float *trata(const float *a, float *r, int m, int n);
   static float *trats(const float *a, const float *s, float *b, int m, int n);
   static float *tratsa(const float *a, const float *s, float *r, int m, int n);
   static float *trchlu(const float *a, float *b, int n);
   static float *trchul(const float *a, float *b, int n);
   static float *trinv(const float *t, float *s, int n);
   static float *trla(const float *u, const float *a, float *b, int m, int n);
   static float *trlta(const float *u, const float *a, float *b, int m, int n);
   static float *trpck(const float *s, float *u, int n);
   static float *trqsq(const float *q, const float *s, float *r, int m);
   static float *trsa(const float *s, const float *a, float *b, int m, int n);
   static float *trsinv(const float *g, float *gi, int n);
   static float *trsmlu(const float *u, float *s, int n);
   static float *trsmul(const float *g, float *gi, int n);
   static float *trupck(const float *u, float *s, int m);
   static float *trsat(const float *s, const float *a, float *b, int m, int n);

// Victor Perevoztchikov's addition:
   static float *trsequ(float *smx, int m=3, float *b=0, int n=1);

// ---   double version

   static double *traat (const double *a, double *s, int m, int n);
   static double *tral  (const double *a, const double *u, double *b, int m, int n);
   static double *tralt (const double *a, const double *u, double *b, int m, int n);
   static double *tras  (const double *a, const double *s, double *b, int m, int n);
   static double *trasat(const double *a, const double *s, double *r, int m, int n);
   static double *trata (const double *a, double *r, int m, int n);
   static double *trats (const double *a, const double *s, double *b, int m, int n);
   static double *tratsa(const double *a, const double *s, double *r, int m, int n);
   static double *trchlu(const double *a, double *b, int n);
   static double *trchul(const double *a, double *b, int n);
   static double *trinv (const double *t, double *s, int n);
   static double *trla  (const double *u, const double *a, double *b, int m, int n);
   static double *trlta (const double *u, const double *a, double *b, int m, int n);
   static double *trpck (const double *s, double *u, int n);
   static double *trqsq (const double *q, const double *s, double *r, int m);
   static double *trsa  (const double *s, const double *a, double *b, int m, int n);
   static double *trsinv(const double *g, double *gi, int n);
   static double *trsmlu(const double *u, double *s, int n);
   static double *trsmul(const double *g, double *gi, int n);
   static double *trupck(const double *u, double *s, int m);
   static double *trsat (const double *s, const double *a, double *b, int m, int n);

//  Victor Perevoztchikov's addition:
   static double *trsequ(double *smx, int m=3, double *b=0, int n=1);

   ClassDef(TCL,0)  //C++ replacement for CERNLIB matrix / triangle matrix packages: F110 and F112

};

//___________________________________________________________________________
inline float *TCL::mxmad(const float *a, const float *b, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(0, a, b, c, i, j, k);   }

//___________________________________________________________________________
inline float *TCL::mxmad1(const float *a, const float *q, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad1.gif"> </P> End_Html //
   return mxmad_0_(1, a, q, c, i, j, k);  }

//___________________________________________________________________________
inline float *TCL::mxmad2(const float *p, const float *b, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad2.gif"> </P> End_Html //
   return mxmad_0_(2, p, b, c, i, j, k);  }

//___________________________________________________________________________
inline float *TCL::mxmad3(const float *p, const float *q, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad3.gif"> </P> End_Html //
   return mxmad_0_(3, p, q, c, i, j, k);  }

//___________________________________________________________________________
inline float *TCL::mxmpy(const float *a, const float *b, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy.gif"> </P> End_Html //
   return mxmad_0_(4, a, b, c, i, j, k); }

//___________________________________________________________________________
inline float *TCL::mxmpy1(const float *a, const float *q, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy1.gif"> </P> End_Html //
   return mxmad_0_(5, a, q, c, i, j, k);  }

//___________________________________________________________________________
inline float *TCL::mxmpy2(const float *p, const float *b, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy2.gif"> </P> End_Html //
   return mxmad_0_(6, p, b, c, i, j, k); }

//___________________________________________________________________________
inline float *TCL::mxmpy3(const float *p, const float *q, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy3.gif"> </P> End_Html //
   return mxmad_0_(7, p, q, c, i, j, k); }

//___________________________________________________________________________
inline float *TCL::mxmub(const float *a, const float *b, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub.gif"> </P> End_Html //
   return mxmad_0_(8, a, b, c, i, j, k);  }

//___________________________________________________________________________
inline float *TCL::mxmub1(const float *a, const float *q, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub1.gif"> </P> End_Html //
   return mxmad_0_(9, a, q, c, i, j, k); }

//___________________________________________________________________________
inline float *TCL::mxmub2(const float *p, const float *b, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub2.gif"> </P> End_Html //
   return mxmad_0_(10, p, b, c, i, j, k); }

//___________________________________________________________________________
inline float *TCL::mxmub3(const float *p, const float *q, float *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub3.gif"> </P> End_Html //
   return mxmad_0_(11, p, q, c, i, j, k); }

//___________________________________________________________________________
inline float *TCL::mxmlrt(const float *a, const float *b, float *x, int ni, int nj)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmlrt.gif"> </P> End_Html //
   return mxmlrt_0_(0, a, b, x, ni, nj); }

//___________________________________________________________________________
inline float *TCL::mxmltr(const float *a, const float *b, float *x, int ni, int nj)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmltr.gif"> </P> End_Html //
   return mxmlrt_0_(1, a, b, x, ni, nj);   }


//--   double version --

//___________________________________________________________________________
inline double *TCL::mxmad(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(0, a, b, c, i, j, k);   }

//___________________________________________________________________________
inline double *TCL:: mxmad1(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(1, a, b, c, i, j, k);  }

//___________________________________________________________________________
inline double *TCL::mxmad2(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(2, a, b, c, i, j, k);  }

//___________________________________________________________________________
inline double *TCL::mxmad3(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(3, a, b, c, i, j, k);  }

//___________________________________________________________________________
inline double *TCL::mxmpy(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(4, a, b, c, i, j, k); }

//___________________________________________________________________________
inline double *TCL::mxmpy1(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(5, a, b, c, i, j, k);  }

//___________________________________________________________________________
inline double *TCL::mxmpy2(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(6, a, b, c, i, j, k); }

//___________________________________________________________________________
inline double *TCL::mxmpy3(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(7, a, b, c, i, j, k); }

//___________________________________________________________________________
inline double *TCL::mxmub(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(8, a, b, c, i, j, k);  }

//___________________________________________________________________________
inline double *TCL::mxmub1(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(9, a, b, c, i, j, k); }

//___________________________________________________________________________
inline double *TCL::mxmub2(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(10, a, b, c, i, j, k); }

//___________________________________________________________________________
inline double *TCL::mxmub3(const double *a, const double *b, double *c, int i, int j, int k)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmad_0_(11, a, b, c, i, j, k); }

//___________________________________________________________________________
inline double *TCL::mxmlrt(const double *a, const double *b, double *c, int ni, int nj)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return  mxmlrt_0_(0, a, b, c, ni, nj); }

//___________________________________________________________________________
inline double *TCL::mxmltr(const double *a, const double *b, double *c, int ni, int nj)
{
   // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
   return mxmlrt_0_(1, a, b, c, ni, nj);   }

// ----

//________________________________________________________
inline int  *TCL::ucopy(const int  *b, int  *a, int n)
{
   //to be documented
   if (n <= 0) return 0; memcpy(a,b,n*sizeof(int)); return a;
}

//________________________________________________________
inline float *TCL::ucopy(const float *b, float *a, int n)
{
   //to be documented
   if (n <= 0) return 0; memcpy(a,b,n*sizeof(float)); return a;
}

//________________________________________________________
inline float *TCL::ucopy(const double *b, float *a, int n)
{
   //to be documented
   if (n <= 0) return 0;
   for (int i=0;i<n;i++,a++,b++) *a = float(*b);
   return a;
}

//________________________________________________________
inline double *TCL::ucopy(const float *b, double *a, int n)
{
   //to be documented
   if (n <= 0) return 0;
   for (int i=0;i<n;i++,a++,b++) *a = double(*b);
   return a;
}

//________________________________________________________
inline double *TCL::ucopy(const double *b, double *a, int n)
{
   //to be documented
   if (n <= 0) return 0; memcpy(a,b,n*sizeof(double)); return a;
}

//________________________________________________________
inline void **TCL::ucopy(const void **b, void  **a, int n)
{
   //to be documented
   if (n <= 0) return 0; memcpy(a,b,n*sizeof(void *)); return a;
}


//________________________________________________________
inline float *TCL::vadd(const float *b, const float *c,  float *a, int n)
{
   //to be documented
   if (n <= 0)  return 0;
   for (int i=0;i<n;i++) a[i] = b[i] + c[i];
   return a;
}

//________________________________________________________
inline double *TCL::vadd(const double *b, const double *c,  double *a, int n)
{
   //to be documented
   if (n <= 0)  return 0;
   for (int i=0;i<n;i++) a[i] = b[i] + c[i];
   return a;
}

//________________________________________________________
inline float  *TCL::vadd(const float *b, const double *c,  float *a, int n)
{
   //to be documented
   if (n <= 0)  return 0;
   for (int i=0;i<n;i++) a[i] = b[i] + c[i];
   return a;
}

//________________________________________________________
inline double *TCL::vadd(const double *b, const float *c,  double *a, int n)
{
   //to be documented
   if (n <= 0)  return 0;
   for (int i=0;i<n;i++) a[i] = b[i] + c[i];
   return a;
}

//________________________________________________________
inline float  TCL::vdot(const float  *b, const float *a, int n)
{
   //to be documented
   float x=0;
   if (n>0)
      for (int i=0;i<n;i++,a++,b++) x += (*a) * (*b);
   return x;
}
//________________________________________________________
inline double TCL::vdot(const double *b, const double *a, int n)
{
   //to be documented
   double  x=0;
   if (n>0)
      for (int i=0;i<n;i++,a++,b++) x += (*a) * (*b);
   return x;
}
//________________________________________________________
inline float *TCL::vsub(const float *a, const float *b, float *x, int n)
{
   //to be documented
   if (n <= 0) return 0;
   for (int i=0;i<n;i++) x[i] = a[i]-b[i];
   return x;
}

//________________________________________________________
inline double *TCL::vsub(const double *a, const double *b, double *x, int n)
{
  //to be documented
   if (n <= 0) return 0;
   for (int i=0;i<n;i++) x[i] = a[i]-b[i];
   return x;
}
//________________________________________________________
inline float  *TCL::vsub(const float *b, const double *c,  float *a, int n)
{
   //to be documented
   if (n <= 0)  return 0;
   for (int i=0;i<n;i++) a[i] = b[i] - c[i];
   return a;
}

//________________________________________________________
inline double *TCL::vsub(const double *b, const float *c,  double *a, int n)
{
   //to be documented
   if (n <= 0)  return 0;
   for (int i=0;i<n;i++) a[i] = b[i] - c[i];
   return a;
}
//________________________________________________________
inline float *TCL::vcopyn(const float *a, float *x, int n)
{
   //to be documented
   if (n <= 0) return 0;
   for (int i=0;i<n;i++) x[i] = -a[i];
   return x;
}
//________________________________________________________
inline double *TCL::vcopyn(const double *a, double *x, int n)
{
   //to be documented
   if (n <= 0) return 0;
   for (int i=0;i<n;i++) x[i] = -a[i];
   return x;
}

//________________________________________________________
inline float *TCL::vzero(float *a, int n1)
{
   //to be documented
   if (n1 <= 0) return 0;
   return (float *)memset(a,0,n1*sizeof(float));
}

//________________________________________________________
inline double *TCL::vzero(double *a, int n1)
{
   //to be documented
   if (n1 <= 0) return 0;
   return (double *)memset(a,0,n1*sizeof(double));
}

//________________________________________________________
inline void **TCL::vzero(void **a, int n1)
{
   //to be documented
   if (n1 <= 0) return 0;
   return (void **)memset(a,0,n1*sizeof(void *));
}

//________________________________________________________
inline float *TCL::vscale(const float *a, float scale, float *b, int n)
{
   //to be documented
   for (int i=0;i<n;i++) b[i]=scale*a[i];
   return b;
}

//________________________________________________________
inline double *TCL::vscale(const double *a, double scale, double *b, int n)
{
   //to be documented
   for (int i=0;i<n;i++) b[i]=scale*a[i];
   return b;
}

//________________________________________________________
inline float *TCL::vlinco(const float *a, float fa, const float *b, float fb, float *x, int n)
{
   //to be documented
   for (int i=0;i<n;i++){x[i]=a[i]*fa+b[i]*fb;};
   return x;
}

//________________________________________________________
inline double *TCL::vlinco(const double *a, double fa, const double *b, double fb,double *x, int n)
{
   //to be documented
   for (int i=0;i<n;i++) x[i]=a[i]*fa+b[i]*fb;
   return x;
}

//_____________________________________________________________________________
inline float *TCL::vmatl(const float *G, const float *c, float *x, int n,int m)
{
   //  x = G*c
   for (int i=0; i<n; i++) {
      double sum = 0;
      for (int j=0; j<m; j++) sum += G[j + m*i]*c[j];
      x[i] = sum;
   }
   return x;
}

//_____________________________________________________________________________
inline double *TCL::vmatl(const double *G, const double *c, double *x, int n,int m)
{
   //  x = G*c
   for (int i=0; i<n; i++) {
      double sum = 0;
      for (int j=0; j<m; j++) sum += G[j + m*i]*c[j];
      x[i] = sum;
   }
   return x;
}

//_____________________________________________________________________________
inline float *TCL::vmatr(const float *c, const float *G, float *x, int n,int m)
{
   //  x = c*G
   for (int j=0; j<m; j++) {
      double sum = 0;
      for (int i=0; i<n; i++) sum += G[j + n*i]*c[i];
      x[j] = sum;
   }
   return x;
}

//_____________________________________________________________________________
inline double *TCL::vmatr(const double *c, const double *G, double *x, int n,int m)
{
   //  x = c*G
   for (int j=0; j<m; j++) {
      double sum = 0;
      for (int i=0; i<n; i++) sum += G[j + n*i]*c[i];
      x[j] = sum;
   }
   return x;
}

#endif
 TCernLib.h:1
 TCernLib.h:2
 TCernLib.h:3
 TCernLib.h:4
 TCernLib.h:5
 TCernLib.h:6
 TCernLib.h:7
 TCernLib.h:8
 TCernLib.h:9
 TCernLib.h:10
 TCernLib.h:11
 TCernLib.h:12
 TCernLib.h:13
 TCernLib.h:14
 TCernLib.h:15
 TCernLib.h:16
 TCernLib.h:17
 TCernLib.h:18
 TCernLib.h:19
 TCernLib.h:20
 TCernLib.h:21
 TCernLib.h:22
 TCernLib.h:23
 TCernLib.h:24
 TCernLib.h:25
 TCernLib.h:26
 TCernLib.h:27
 TCernLib.h:28
 TCernLib.h:29
 TCernLib.h:30
 TCernLib.h:31
 TCernLib.h:32
 TCernLib.h:33
 TCernLib.h:34
 TCernLib.h:35
 TCernLib.h:36
 TCernLib.h:37
 TCernLib.h:38
 TCernLib.h:39
 TCernLib.h:40
 TCernLib.h:41
 TCernLib.h:42
 TCernLib.h:43
 TCernLib.h:44
 TCernLib.h:45
 TCernLib.h:46
 TCernLib.h:47
 TCernLib.h:48
 TCernLib.h:49
 TCernLib.h:50
 TCernLib.h:51
 TCernLib.h:52
 TCernLib.h:53
 TCernLib.h:54
 TCernLib.h:55
 TCernLib.h:56
 TCernLib.h:57
 TCernLib.h:58
 TCernLib.h:59
 TCernLib.h:60
 TCernLib.h:61
 TCernLib.h:62
 TCernLib.h:63
 TCernLib.h:64
 TCernLib.h:65
 TCernLib.h:66
 TCernLib.h:67
 TCernLib.h:68
 TCernLib.h:69
 TCernLib.h:70
 TCernLib.h:71
 TCernLib.h:72
 TCernLib.h:73
 TCernLib.h:74
 TCernLib.h:75
 TCernLib.h:76
 TCernLib.h:77
 TCernLib.h:78
 TCernLib.h:79
 TCernLib.h:80
 TCernLib.h:81
 TCernLib.h:82
 TCernLib.h:83
 TCernLib.h:84
 TCernLib.h:85
 TCernLib.h:86
 TCernLib.h:87
 TCernLib.h:88
 TCernLib.h:89
 TCernLib.h:90
 TCernLib.h:91
 TCernLib.h:92
 TCernLib.h:93
 TCernLib.h:94
 TCernLib.h:95
 TCernLib.h:96
 TCernLib.h:97
 TCernLib.h:98
 TCernLib.h:99
 TCernLib.h:100
 TCernLib.h:101
 TCernLib.h:102
 TCernLib.h:103
 TCernLib.h:104
 TCernLib.h:105
 TCernLib.h:106
 TCernLib.h:107
 TCernLib.h:108
 TCernLib.h:109
 TCernLib.h:110
 TCernLib.h:111
 TCernLib.h:112
 TCernLib.h:113
 TCernLib.h:114
 TCernLib.h:115
 TCernLib.h:116
 TCernLib.h:117
 TCernLib.h:118
 TCernLib.h:119
 TCernLib.h:120
 TCernLib.h:121
 TCernLib.h:122
 TCernLib.h:123
 TCernLib.h:124
 TCernLib.h:125
 TCernLib.h:126
 TCernLib.h:127
 TCernLib.h:128
 TCernLib.h:129
 TCernLib.h:130
 TCernLib.h:131
 TCernLib.h:132
 TCernLib.h:133
 TCernLib.h:134
 TCernLib.h:135
 TCernLib.h:136
 TCernLib.h:137
 TCernLib.h:138
 TCernLib.h:139
 TCernLib.h:140
 TCernLib.h:141
 TCernLib.h:142
 TCernLib.h:143
 TCernLib.h:144
 TCernLib.h:145
 TCernLib.h:146
 TCernLib.h:147
 TCernLib.h:148
 TCernLib.h:149
 TCernLib.h:150
 TCernLib.h:151
 TCernLib.h:152
 TCernLib.h:153
 TCernLib.h:154
 TCernLib.h:155
 TCernLib.h:156
 TCernLib.h:157
 TCernLib.h:158
 TCernLib.h:159
 TCernLib.h:160
 TCernLib.h:161
 TCernLib.h:162
 TCernLib.h:163
 TCernLib.h:164
 TCernLib.h:165
 TCernLib.h:166
 TCernLib.h:167
 TCernLib.h:168
 TCernLib.h:169
 TCernLib.h:170
 TCernLib.h:171
 TCernLib.h:172
 TCernLib.h:173
 TCernLib.h:174
 TCernLib.h:175
 TCernLib.h:176
 TCernLib.h:177
 TCernLib.h:178
 TCernLib.h:179
 TCernLib.h:180
 TCernLib.h:181
 TCernLib.h:182
 TCernLib.h:183
 TCernLib.h:184
 TCernLib.h:185
 TCernLib.h:186
 TCernLib.h:187
 TCernLib.h:188
 TCernLib.h:189
 TCernLib.h:190
 TCernLib.h:191
 TCernLib.h:192
 TCernLib.h:193
 TCernLib.h:194
 TCernLib.h:195
 TCernLib.h:196
 TCernLib.h:197
 TCernLib.h:198
 TCernLib.h:199
 TCernLib.h:200
 TCernLib.h:201
 TCernLib.h:202
 TCernLib.h:203
 TCernLib.h:204
 TCernLib.h:205
 TCernLib.h:206
 TCernLib.h:207
 TCernLib.h:208
 TCernLib.h:209
 TCernLib.h:210
 TCernLib.h:211
 TCernLib.h:212
 TCernLib.h:213
 TCernLib.h:214
 TCernLib.h:215
 TCernLib.h:216
 TCernLib.h:217
 TCernLib.h:218
 TCernLib.h:219
 TCernLib.h:220
 TCernLib.h:221
 TCernLib.h:222
 TCernLib.h:223
 TCernLib.h:224
 TCernLib.h:225
 TCernLib.h:226
 TCernLib.h:227
 TCernLib.h:228
 TCernLib.h:229
 TCernLib.h:230
 TCernLib.h:231
 TCernLib.h:232
 TCernLib.h:233
 TCernLib.h:234
 TCernLib.h:235
 TCernLib.h:236
 TCernLib.h:237
 TCernLib.h:238
 TCernLib.h:239
 TCernLib.h:240
 TCernLib.h:241
 TCernLib.h:242
 TCernLib.h:243
 TCernLib.h:244
 TCernLib.h:245
 TCernLib.h:246
 TCernLib.h:247
 TCernLib.h:248
 TCernLib.h:249
 TCernLib.h:250
 TCernLib.h:251
 TCernLib.h:252
 TCernLib.h:253
 TCernLib.h:254
 TCernLib.h:255
 TCernLib.h:256
 TCernLib.h:257
 TCernLib.h:258
 TCernLib.h:259
 TCernLib.h:260
 TCernLib.h:261
 TCernLib.h:262
 TCernLib.h:263
 TCernLib.h:264
 TCernLib.h:265
 TCernLib.h:266
 TCernLib.h:267
 TCernLib.h:268
 TCernLib.h:269
 TCernLib.h:270
 TCernLib.h:271
 TCernLib.h:272
 TCernLib.h:273
 TCernLib.h:274
 TCernLib.h:275
 TCernLib.h:276
 TCernLib.h:277
 TCernLib.h:278
 TCernLib.h:279
 TCernLib.h:280
 TCernLib.h:281
 TCernLib.h:282
 TCernLib.h:283
 TCernLib.h:284
 TCernLib.h:285
 TCernLib.h:286
 TCernLib.h:287
 TCernLib.h:288
 TCernLib.h:289
 TCernLib.h:290
 TCernLib.h:291
 TCernLib.h:292
 TCernLib.h:293
 TCernLib.h:294
 TCernLib.h:295
 TCernLib.h:296
 TCernLib.h:297
 TCernLib.h:298
 TCernLib.h:299
 TCernLib.h:300
 TCernLib.h:301
 TCernLib.h:302
 TCernLib.h:303
 TCernLib.h:304
 TCernLib.h:305
 TCernLib.h:306
 TCernLib.h:307
 TCernLib.h:308
 TCernLib.h:309
 TCernLib.h:310
 TCernLib.h:311
 TCernLib.h:312
 TCernLib.h:313
 TCernLib.h:314
 TCernLib.h:315
 TCernLib.h:316
 TCernLib.h:317
 TCernLib.h:318
 TCernLib.h:319
 TCernLib.h:320
 TCernLib.h:321
 TCernLib.h:322
 TCernLib.h:323
 TCernLib.h:324
 TCernLib.h:325
 TCernLib.h:326
 TCernLib.h:327
 TCernLib.h:328
 TCernLib.h:329
 TCernLib.h:330
 TCernLib.h:331
 TCernLib.h:332
 TCernLib.h:333
 TCernLib.h:334
 TCernLib.h:335
 TCernLib.h:336
 TCernLib.h:337
 TCernLib.h:338
 TCernLib.h:339
 TCernLib.h:340
 TCernLib.h:341
 TCernLib.h:342
 TCernLib.h:343
 TCernLib.h:344
 TCernLib.h:345
 TCernLib.h:346
 TCernLib.h:347
 TCernLib.h:348
 TCernLib.h:349
 TCernLib.h:350
 TCernLib.h:351
 TCernLib.h:352
 TCernLib.h:353
 TCernLib.h:354
 TCernLib.h:355
 TCernLib.h:356
 TCernLib.h:357
 TCernLib.h:358
 TCernLib.h:359
 TCernLib.h:360
 TCernLib.h:361
 TCernLib.h:362
 TCernLib.h:363
 TCernLib.h:364
 TCernLib.h:365
 TCernLib.h:366
 TCernLib.h:367
 TCernLib.h:368
 TCernLib.h:369
 TCernLib.h:370
 TCernLib.h:371
 TCernLib.h:372
 TCernLib.h:373
 TCernLib.h:374
 TCernLib.h:375
 TCernLib.h:376
 TCernLib.h:377
 TCernLib.h:378
 TCernLib.h:379
 TCernLib.h:380
 TCernLib.h:381
 TCernLib.h:382
 TCernLib.h:383
 TCernLib.h:384
 TCernLib.h:385
 TCernLib.h:386
 TCernLib.h:387
 TCernLib.h:388
 TCernLib.h:389
 TCernLib.h:390
 TCernLib.h:391
 TCernLib.h:392
 TCernLib.h:393
 TCernLib.h:394
 TCernLib.h:395
 TCernLib.h:396
 TCernLib.h:397
 TCernLib.h:398
 TCernLib.h:399
 TCernLib.h:400
 TCernLib.h:401
 TCernLib.h:402
 TCernLib.h:403
 TCernLib.h:404
 TCernLib.h:405
 TCernLib.h:406
 TCernLib.h:407
 TCernLib.h:408
 TCernLib.h:409
 TCernLib.h:410
 TCernLib.h:411
 TCernLib.h:412
 TCernLib.h:413
 TCernLib.h:414
 TCernLib.h:415
 TCernLib.h:416
 TCernLib.h:417
 TCernLib.h:418
 TCernLib.h:419
 TCernLib.h:420
 TCernLib.h:421
 TCernLib.h:422
 TCernLib.h:423
 TCernLib.h:424
 TCernLib.h:425
 TCernLib.h:426
 TCernLib.h:427
 TCernLib.h:428
 TCernLib.h:429
 TCernLib.h:430
 TCernLib.h:431
 TCernLib.h:432
 TCernLib.h:433
 TCernLib.h:434
 TCernLib.h:435
 TCernLib.h:436
 TCernLib.h:437
 TCernLib.h:438
 TCernLib.h:439
 TCernLib.h:440
 TCernLib.h:441
 TCernLib.h:442
 TCernLib.h:443
 TCernLib.h:444
 TCernLib.h:445
 TCernLib.h:446
 TCernLib.h:447
 TCernLib.h:448
 TCernLib.h:449
 TCernLib.h:450
 TCernLib.h:451
 TCernLib.h:452
 TCernLib.h:453
 TCernLib.h:454
 TCernLib.h:455
 TCernLib.h:456
 TCernLib.h:457
 TCernLib.h:458
 TCernLib.h:459
 TCernLib.h:460
 TCernLib.h:461
 TCernLib.h:462
 TCernLib.h:463
 TCernLib.h:464
 TCernLib.h:465
 TCernLib.h:466
 TCernLib.h:467
 TCernLib.h:468
 TCernLib.h:469
 TCernLib.h:470
 TCernLib.h:471
 TCernLib.h:472
 TCernLib.h:473
 TCernLib.h:474
 TCernLib.h:475
 TCernLib.h:476
 TCernLib.h:477
 TCernLib.h:478
 TCernLib.h:479
 TCernLib.h:480
 TCernLib.h:481
 TCernLib.h:482
 TCernLib.h:483
 TCernLib.h:484
 TCernLib.h:485
 TCernLib.h:486
 TCernLib.h:487
 TCernLib.h:488
 TCernLib.h:489
 TCernLib.h:490
 TCernLib.h:491
 TCernLib.h:492
 TCernLib.h:493
 TCernLib.h:494
 TCernLib.h:495
 TCernLib.h:496
 TCernLib.h:497
 TCernLib.h:498
 TCernLib.h:499
 TCernLib.h:500
 TCernLib.h:501
 TCernLib.h:502
 TCernLib.h:503
 TCernLib.h:504
 TCernLib.h:505
 TCernLib.h:506
 TCernLib.h:507
 TCernLib.h:508
 TCernLib.h:509
 TCernLib.h:510
 TCernLib.h:511
 TCernLib.h:512
 TCernLib.h:513
 TCernLib.h:514
 TCernLib.h:515
 TCernLib.h:516
 TCernLib.h:517
 TCernLib.h:518
 TCernLib.h:519
 TCernLib.h:520
 TCernLib.h:521
 TCernLib.h:522
 TCernLib.h:523
 TCernLib.h:524
 TCernLib.h:525
 TCernLib.h:526
 TCernLib.h:527
 TCernLib.h:528
 TCernLib.h:529
 TCernLib.h:530
 TCernLib.h:531
 TCernLib.h:532
 TCernLib.h:533
 TCernLib.h:534
 TCernLib.h:535
 TCernLib.h:536
 TCernLib.h:537
 TCernLib.h:538
 TCernLib.h:539
 TCernLib.h:540
 TCernLib.h:541
 TCernLib.h:542
 TCernLib.h:543
 TCernLib.h:544
 TCernLib.h:545
 TCernLib.h:546
 TCernLib.h:547
 TCernLib.h:548
 TCernLib.h:549
 TCernLib.h:550
 TCernLib.h:551
 TCernLib.h:552
 TCernLib.h:553
 TCernLib.h:554
 TCernLib.h:555
 TCernLib.h:556
 TCernLib.h:557
 TCernLib.h:558
 TCernLib.h:559
 TCernLib.h:560
 TCernLib.h:561
 TCernLib.h:562
 TCernLib.h:563
 TCernLib.h:564
 TCernLib.h:565
 TCernLib.h:566
 TCernLib.h:567
 TCernLib.h:568
 TCernLib.h:569
 TCernLib.h:570
 TCernLib.h:571
 TCernLib.h:572
 TCernLib.h:573
 TCernLib.h:574
 TCernLib.h:575
 TCernLib.h:576
 TCernLib.h:577
 TCernLib.h:578
 TCernLib.h:579
 TCernLib.h:580
 TCernLib.h:581
 TCernLib.h:582
 TCernLib.h:583
 TCernLib.h:584
 TCernLib.h:585
 TCernLib.h:586
 TCernLib.h:587
 TCernLib.h:588
 TCernLib.h:589
 TCernLib.h:590
 TCernLib.h:591
 TCernLib.h:592
 TCernLib.h:593
 TCernLib.h:594
 TCernLib.h:595
 TCernLib.h:596
 TCernLib.h:597
 TCernLib.h:598
 TCernLib.h:599
 TCernLib.h:600
 TCernLib.h:601
 TCernLib.h:602
 TCernLib.h:603
 TCernLib.h:604
 TCernLib.h:605
 TCernLib.h:606
 TCernLib.h:607