Gems3k
3.1
GEMS3K standalone solver for geochemical equilibria
|
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