Gems3k  3.1
GEMS3K standalone solver for geochemical equilibria
 All Classes Files Functions Variables Enumerations Enumerator
/Users/kulik/DevGEMS/trunk/standalone/GEMS3K/num_methods.h
Go to the documentation of this file.
00001 //-------------------------------------------------------------------
00002 // $Id: num_methods.h 725 2012-10-02 15:43:37Z kulik $
00003 //
00006 //
00007 // Copyright (C) 2006-2012 S.Dmytriyeva, D.Kulik
00008 // <GEMS Development Team, mailto:gems2.support@psi.ch>
00009 //
00010 // This file is part of the GEMS3K code for thermodynamic modelling
00011 // by Gibbs energy minimization <http://gems.web.psi.ch/GEMS3K/>
00012 //
00013 // GEMS3K is free software: you can redistribute it and/or modify
00014 // it under the terms of the GNU Lesser General Public License as
00015 // published by the Free Software Foundation, either version 3 of
00016 // the License, or (at your option) any later version.
00017 
00018 // GEMS3K is distributed in the hope that it will be useful,
00019 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00020 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021 // GNU Lesser General Public License for more details.
00022 
00023 // You should have received a copy of the GNU General Public License
00024 // along with GEMS3K code. If not, see <http://www.gnu.org/licenses/>.
00025 //-------------------------------------------------------------------
00026 
00027 #ifndef _num_methods_h_
00028 #define _num_methods_h_
00029 
00030 #include <cmath>
00031 
00032 // Calculate number of points from iterators
00033 long int  getNpoints( double Tai[4] );
00034 double    getStep( double *Tai, int nPoints );
00035 
00036 
00037 // Lagrangian interpolation functions
00038 double LagranInterp(float *y, float *x, double *d, float yoi,
00039                 float xoi, int M, int N, int pp );
00040 double LagranInterp(float *y, float *x, float *d, float yoi,
00041                 float xoi, int M, int N, int pp );
00042 double LagranInterp(double *y, double *x, double *d, double yoi,
00043                 double xoi, long int M, long int N, long int pp );
00044 
00045 
00046 // generic functions for calculating partial derivatives
00047 double quot( double u, double v, double du, double dv );
00048 
00049 double quot( double u, double v, double du, double dv, double d2u, double d2v );
00050 
00051 
00052 double prod2( double u, double v, double du, double dv );
00053 
00054 double prod2 ( double u, double v, double du, double dv, double d2u, double d2v );
00055 
00056 
00057 double prod3 ( double u, double v, double w, double du, double dv, double dw );
00058 
00059 double prod3 ( double u, double v, double w, double du, double dv, double dw,
00060                 double d2u, double d2v, double d2w );
00061 
00062 
00063 typedef double (*minFunction)(double x, double y );
00064 
00066 struct GoldenSectionData
00067 {
00068     double Fa;
00069     double Fb;
00070     double Fx1;
00071     double Fx2;
00072     double a;
00073     double b;
00074     double x1;
00075     double x2;
00076     double Xtol;
00077 
00078 
00079     GoldenSectionData( double xstart, double xend, double Xtol_)
00080     {
00081       Xtol = Xtol_;
00082       x1 = xstart;
00083       x2 = xend;
00084       a = min( x1, x2 );
00085       b = max( x1, x2 );
00086    }
00087 
00088  };
00089 
00090 
00093 class GoldenSection
00094 {
00095 protected:
00096 
00097   GoldenSectionData dat1;
00098   double Ftol;
00099   minFunction minF;
00100 
00101 public:
00102 
00105   GoldenSection( double x1, double x2, double xtol, double ftol,
00106                    double (f_proc)(double val, double val2 )):
00107    dat1(x1,x2,xtol),Ftol(ftol)
00108   {
00109     minF = f_proc;
00110   }
00111 
00112   virtual double calcFunction( double x, double y )
00113   {
00114       return minF( x, y );
00115   }
00116 
00117   virtual double getMinimum( double val2=0 )
00118   {
00119      return getMinimumDat( dat1, val2 );
00120   }
00121 
00122   virtual double getMinimumDat( GoldenSectionData dat, double val2 );
00123 
00124 };
00125 
00128 class GoldenSectionTwo : public GoldenSection
00129 {
00130   GoldenSectionData dat2;
00131   int nOperand;   // minimization for first or second parameter
00132   double minX;
00133   double minY;
00134 
00135 public:
00136 
00139   GoldenSectionTwo( double x1, double x2, double xtol,
00140                       double y1, double y2, double ytol,
00141                       double ftol, double (f_proc)(double val, double val2 )):
00142   GoldenSection( x1, x2, xtol, ftol, f_proc),  dat2(y1,y2,ytol)
00143   {}
00144 
00145   double calcFunction( double x, double y );
00146   double getMinimum( double val2=0 );
00147 
00148   double getMinX()
00149   { return minX; }
00150   double getMinY()
00151   { return minY; }
00152 
00153 };
00154 
00155 
00156 // Golden Selection in interval x1 to x2, to minimize function f_proc
00157 //double GoldenSection( double x1, double x2, double xtol, double ftol,
00158 //                        double val2, double (f_proc)(double val, double val2 ));
00159 // Method of Gold Selection for two parameters
00160 //   ystart, yend, ytol,  parameter y    - start, end, tolerance
00161 //   xstart, xend, xtol,  parameter x    - start, end, tolerance
00162 //   ftol  function tolerance
00163 //   ymin and xmin return values
00164 //   f_proc function to minimize ( f( y, x)=>0 )
00165 //void GoldenSection2( double ystart, double yend, double Ytol,
00166 //                       double xstart, double xend, double Xtol,
00167 //                       double Ftol, double& ymin, double& xmin,
00168 //                       double (f_proc)(double valy, double valx ));
00169 
00170 
00171 
00172 #endif   // _num_methods_h_
00173 
00174 //-----------------------End of num_methods.h--------------------------
00175