mccormick.h

00001 #ifndef MCCORMICK_H
00002 #define MCCORMICK_H
00003 #include <iostream>
00004 #include <vector>
00005 #include <cmath>
00006 
00007 using namespace std;
00008 
00009 extern double mid( const double, const double, const double, int& );
00010 extern double mid( const double*, const double*, const int, const int );
00011 extern double arh( const double, const double );
00012 extern double xlog( const double );
00013 
00016 class MC_Excp
00018 {
00019 public:
00020 
00022   enum MC_Err{
00023     SIZE=1, 
00024     DIV, 
00025     INV, 
00026     LOG, 
00027     SQRT,   
00028     ARH  
00029   };
00030 
00032   MC_Excp( MC_Err ierr ) : _ierr( ierr ){}
00033 
00035   int ierr(){ return _ierr; }
00036 
00037 private:
00038 
00039   MC_Err _ierr;
00040 };
00041 
00042 
00050 class McCormick
00052 {
00053   // friends of class McCormick for operator overloading
00054   friend McCormick operator+ ( const McCormick& );
00055   friend McCormick operator+ ( const McCormick&, const McCormick& );
00056   friend McCormick operator+ ( const double, const McCormick& );
00057   friend McCormick operator+ ( const McCormick&, const double );
00058   friend McCormick operator- ( const McCormick& );
00059   friend McCormick operator- ( const McCormick&, const McCormick& );
00060   friend McCormick operator- ( const double, const McCormick& );
00061   friend McCormick operator- ( const McCormick&, const double );
00062   friend McCormick operator* ( const McCormick&, const McCormick& );
00063   friend McCormick operator* ( const McCormick&, const double );
00064   friend McCormick operator* ( const double, const McCormick& );
00065   friend McCormick operator/ ( const McCormick&, const McCormick& );
00066   friend McCormick operator/ ( const McCormick&, const double );
00067   friend McCormick operator/ ( const double, const McCormick& );
00068   friend ostream& operator<< ( ostream&, const McCormick& );
00069 
00070   // friends of class McCormick for function overloading
00071   friend McCormick inv  ( const McCormick& );
00072   friend McCormick exp  ( const McCormick& );
00073   friend McCormick log  ( const McCormick& );
00074   friend McCormick fabs ( const McCormick& );
00075   friend McCormick sqrt ( const McCormick& );
00076   friend McCormick xlog ( const McCormick& );
00077   friend McCormick arh  ( const McCormick&, const double );
00078   friend McCormick pow  ( const McCormick&, const int );
00079   friend McCormick pow  ( const McCormick&, const double );
00080   friend McCormick pow  ( const McCormick&, const McCormick& );
00081   friend double mid( const double, const double, const double, int& );
00082   friend double mid( const double*, const double*, const int, const int );
00083   
00084 public:
00085 
00086   // other operator overloadings
00087   McCormick& operator=
00088     ( const McCormick& );
00089   McCormick& operator=
00090     ( const double );
00091 
00095 
00096   McCormick
00097     ( const double c )
00098     { Init_McCormick( c, c, c, c ); };
00100   McCormick
00101     ( const double l, const double u, const double c, const int ip=-1 )
00102     { Init_McCormick( l, u, c, c, ip, ip ); };
00104   McCormick
00105     ( const double l, const double u, const double cv, const double cc,
00106       const int icv=-1, const int icc=-1 )
00107     { Init_McCormick( l, u, cv, cc, icv, icc ); };
00109   McCormick
00110     ( const McCormick& );
00111 
00113   ~McCormick();
00114   // private constructor
00115   McCormick();
00116 
00118   int np() const
00119     { return _np; };
00121   double l() const
00122     { return _l;  };
00124   double u() const
00125     { return _u;  };
00127   double cv() const
00128     { return _cv; };
00130   double cc() const
00131     { return _cc; };
00133   const double* dcvdp() const
00134     { return _dcvdp; };
00136   const double* dccdp() const
00137     { return _dccdp; };
00139   double dcvdp( const int ip ) const
00140     { return _dcvdp[ip]; };
00142   double dccdp( const int ip ) const
00143     { return _dccdp[ip]; };
00144 
00146   void l ( double l )  { _l = l; };
00148   void u ( double u )  { _u = u; };
00150   void cv( double cv ) { _cv = cv; };
00152   void cc( double cc ) { _cc = cc; };
00153 
00155   static void np( int npar ) { _np = npar; };
00158 private:
00159 
00160   static int _ITINY;
00161   static double _RTINY;
00162 
00164   static int _np;
00166   int _sizep;
00168   double _l;
00170   double _u;
00172   double _cv;
00174   double _cc;
00176   double *_dcvdp;
00178   double *_dccdp;
00179 
00181   void Init_McCormick
00182    ( const double, const double, const double, const double,
00183      const int=-1, const int=-1 );
00184 
00186   static double _machprec();
00188   static bool _isequal
00189     ( const double real1, const double real2, const double atol,
00190       const double rtol );
00192   static bool _isequal
00193     ( const double real1, const double real2 );
00194 };
00195 
00197 inline McCormick::McCormick()
00198 : _l( 0. ), _u( 0. ), _cv( 0. ), _cc( 0. )
00200 {
00201   _sizep = _np;
00202 
00203   // simply allocate the arrays without initializing the values
00204   if( _sizep > 0 ){
00205     _dcvdp = new double[ _sizep ];
00206     _dccdp = new double[ _sizep ];
00207   }
00208   else{
00209     _dcvdp = _dccdp = NULL;
00210   }
00211 }
00212 
00214 inline McCormick::~McCormick()
00216 {
00217   delete [] _dcvdp;
00218   delete [] _dccdp;
00219 }
00220 
00221 #endif

Generated on Sat Sep 8 20:04:36 2007 for libMC by  doxygen 1.4.6