tbl_val_math.C

00001 /*
00002  * Methods for making calculations with Godunov-type arrays.
00003  *
00004  * See the file tbl_val.h for documentation
00005  *
00006  */
00007 
00008 /*
00009  *   Copyright (c) 2001 Jerome Novak
00010  *
00011  *   This file is part of LORENE.
00012  *
00013  *   LORENE is free software; you can redistribute it and/or modify
00014  *   it under the terms of the GNU General Public License as published by
00015  *   the Free Software Foundation; either version 2 of the License, or
00016  *   (at your option) any later version.
00017  *
00018  *   LORENE 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 General Public License for more details.
00022  *
00023  *   You should have received a copy of the GNU General Public License
00024  *   along with LORENE; if not, write to the Free Software
00025  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00026  *
00027  */
00028 
00029 
00030 char TBL_VAL_MATH_C[] = "$Header: /cvsroot/Lorene/C++/Source/Valencia/tbl_val_math.C,v 1.2 2002/11/12 10:03:54 j_novak Exp $" ;
00031 
00032 /*
00033  * $Id: tbl_val_math.C,v 1.2 2002/11/12 10:03:54 j_novak Exp $
00034  * $Log: tbl_val_math.C,v $
00035  * Revision 1.2  2002/11/12 10:03:54  j_novak
00036  * The method "Tbl_val::get_gval" has been changed to "get_grid".
00037  *
00038  * Revision 1.1  2001/11/22 13:41:54  j_novak
00039  * Added all source files for manipulating Valencia type objects and making
00040  * interpolations to and from Meudon grids.
00041  *
00042  *
00043  * $Header: /cvsroot/Lorene/C++/Source/Valencia/tbl_val_math.C,v 1.2 2002/11/12 10:03:54 j_novak Exp $
00044  *
00045  */
00046 
00047 // Headers C
00048 // ---------
00049 #include <math.h>
00050 #include <stdlib.h>
00051 
00052 // Headers Lorene
00053 // --------------
00054 #include "tbl_val.h"
00055 
00056 //-------//
00057 // Sinus //
00058 //-------//
00059 
00060 Tbl_val sin(const Tbl_val& ti)
00061 {
00062   // Protection
00063   assert(ti.get_etat() != ETATNONDEF) ;
00064     
00065     // Cas ETATZERO
00066   if (ti.get_etat() == ETATZERO) {
00067     return ti ;
00068   }
00069     
00070   // Cas general
00071   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00072   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00073   to.set_etat_qcq() ;
00074   int taille = ti.get_taille() ;
00075   for (int i=0 ; i<taille ; i++) {
00076     to.t[i] = sin(ti.t[i]) ;
00077   }
00078   for (int i=0; i<ti.get_taille_i(0); i++)
00079     to.tzri[i] = sin(ti.tzri[i]) ;
00080   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00081     to.txti[i] = sin(ti.txti[i]) ;
00082   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00083     to.typi[i] = sin(ti.typi[i]) ;
00084   return to ;
00085 }
00086 
00087 //---------//
00088 // Cosinus //
00089 //---------//
00090 
00091 Tbl_val cos(const Tbl_val& ti)
00092 {
00093   // Protection
00094   assert(ti.get_etat() != ETATNONDEF) ;
00095     
00096   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00097   to.set_etat_qcq() ;
00098 
00099     // Cas ETATZERO
00100   if (ti.get_etat() == ETATZERO) {
00101     to = 1 ;
00102     return to ;
00103   }
00104     
00105   // Cas general
00106   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00107   int taille = ti.get_taille() ;
00108   for (int i=0 ; i<taille ; i++) {
00109     to.t[i] = cos(ti.t[i]) ;
00110   }
00111   for (int i=0; i<ti.get_taille_i(0); i++)
00112     to.tzri[i] = cos(ti.tzri[i]) ;
00113   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00114     to.txti[i] = cos(ti.txti[i]) ;
00115   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00116     to.typi[i] = cos(ti.typi[i]) ;
00117   return to ;
00118 }
00119 
00120 //----------//
00121 // Tangente //
00122 //----------//
00123 
00124 Tbl_val tan(const Tbl_val& ti)
00125 {
00126   // Protection
00127   assert(ti.get_etat() != ETATNONDEF) ;
00128     
00129     // Cas ETATZERO
00130   if (ti.get_etat() == ETATZERO) {
00131     return ti ;
00132   }
00133     
00134   // Cas general
00135   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00136   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00137   to.set_etat_qcq() ;
00138   int taille = ti.get_taille() ;
00139   for (int i=0 ; i<taille ; i++) {
00140     to.t[i] = tan(ti.t[i]) ;
00141   }
00142   for (int i=0; i<ti.get_taille_i(0); i++)
00143     to.tzri[i] = tan(ti.tzri[i]) ;
00144   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00145     to.txti[i] = tan(ti.txti[i]) ;
00146   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00147     to.typi[i] = tan(ti.typi[i]) ;
00148   return to ;
00149 }
00150 
00151 //----------//
00152 // ArcSinus //
00153 //----------//
00154 
00155 Tbl_val asin(const Tbl_val& ti)
00156 {
00157   // Protection
00158   assert(ti.get_etat() != ETATNONDEF) ;
00159     
00160     // Cas ETATZERO
00161   if (ti.get_etat() == ETATZERO) {
00162     return ti ;
00163   }
00164     
00165   // Cas general
00166   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00167   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00168   to.set_etat_qcq() ;
00169   int taille = ti.get_taille() ;
00170   for (int i=0 ; i<taille ; i++) {
00171     to.t[i] = asin(ti.t[i]) ;
00172   }
00173   for (int i=0; i<ti.get_taille_i(0); i++)
00174     to.tzri[i] = asin(ti.tzri[i]) ;
00175   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00176     to.txti[i] = asin(ti.txti[i]) ;
00177   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00178     to.typi[i] = asin(ti.typi[i]) ;
00179 
00180   return to ;
00181 }
00182 
00183 //------------//
00184 // ArcCosinus //
00185 //------------//
00186 
00187 Tbl_val acos(const Tbl_val& ti)
00188 {
00189   // Protection
00190   assert(ti.get_etat() != ETATNONDEF) ;
00191     
00192   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00193   to.set_etat_qcq() ;
00194 
00195     // Cas ETATZERO
00196   if (ti.get_etat() == ETATZERO) {
00197     to = M_PI * .5 ;
00198     return to ;
00199   }
00200     
00201   // Cas general
00202   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00203   int taille = ti.get_taille() ;
00204   for (int i=0 ; i<taille ; i++) {
00205     to.t[i] = acos(ti.t[i]) ;
00206   }
00207   for (int i=0; i<ti.get_taille_i(0); i++)
00208     to.tzri[i] = acos(ti.tzri[i]) ;
00209   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00210     to.txti[i] = acos(ti.txti[i]) ;
00211   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00212     to.typi[i] = acos(ti.typi[i]) ;
00213   return to ;
00214 }
00215 
00216 //-------------//
00217 // ArcTangente //
00218 //-------------//
00219 
00220 Tbl_val atan(const Tbl_val& ti)
00221 {
00222   // Protection
00223   assert(ti.get_etat() != ETATNONDEF) ;
00224     
00225     // Cas ETATZERO
00226   if (ti.get_etat() == ETATZERO) {
00227     return ti ;
00228   }
00229     
00230   // Cas general
00231   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00232   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00233   to.set_etat_qcq() ;
00234   int taille = ti.get_taille() ;
00235   for (int i=0 ; i<taille ; i++) {
00236     to.t[i] = atan(ti.t[i]) ;
00237   }
00238   for (int i=0; i<ti.get_taille_i(0); i++)
00239     to.tzri[i] = atan(ti.tzri[i]) ;
00240   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00241     to.txti[i] = atan(ti.txti[i]) ;
00242   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00243     to.typi[i] = atan(ti.typi[i]) ;
00244   return to ;
00245 }
00246 
00247 //------//
00248 // Sqrt //
00249 //------//
00250 
00251 Tbl_val sqrt(const Tbl_val& ti)
00252 {
00253   // Protection
00254   assert(ti.get_etat() != ETATNONDEF) ;
00255     
00256     // Cas ETATZERO
00257   if (ti.get_etat() == ETATZERO) {
00258     return ti ;
00259   }
00260     
00261   // Cas general
00262   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00263   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00264   to.set_etat_qcq() ;
00265   int taille = ti.get_taille() ;
00266   for (int i=0 ; i<taille ; i++) {
00267     to.t[i] = sqrt(ti.t[i]) ;
00268   }
00269   for (int i=0; i<ti.get_taille_i(0); i++)
00270     to.tzri[i] = sqrt(ti.tzri[i]) ;
00271   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00272     to.txti[i] = sqrt(ti.txti[i]) ;
00273   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00274     to.typi[i] = sqrt(ti.typi[i]) ;
00275   return to ;
00276 }
00277 
00278 //---------------//
00279 // Exponentielle //
00280 //---------------//
00281 
00282 Tbl_val exp(const Tbl_val& ti)
00283 {
00284   // Protection
00285   assert(ti.get_etat() != ETATNONDEF) ;
00286     
00287   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00288   to.set_etat_qcq() ;
00289 
00290     // Cas ETATZERO
00291   if (ti.get_etat() == ETATZERO) {
00292     to = 1 ;
00293     return to ;
00294   }
00295     
00296   // Cas general
00297   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00298   int taille = ti.get_taille() ;
00299   for (int i=0 ; i<taille ; i++) {
00300     to.t[i] = exp(ti.t[i]) ;
00301   }
00302   for (int i=0; i<ti.get_taille_i(0); i++)
00303     to.tzri[i] = exp(ti.tzri[i]) ;
00304   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00305     to.txti[i] = exp(ti.txti[i]) ;
00306   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00307     to.typi[i] = exp(ti.typi[i]) ;
00308   return to ;
00309 }
00310 
00311 //-------------//
00312 // Log naturel //
00313 //-------------//
00314 
00315 Tbl_val log(const Tbl_val& ti)
00316 {
00317   // Protection
00318   assert(ti.get_etat() != ETATNONDEF) ;
00319     
00320     // Cas ETATZERO
00321   if (ti.get_etat() == ETATZERO) {
00322     cout << "Tbl_val log: log(ETATZERO) !" << endl  ;
00323     abort () ;
00324   }
00325     
00326   // Cas general
00327   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00328   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00329   to.set_etat_qcq() ;
00330   int taille = ti.get_taille() ;
00331   for (int i=0 ; i<taille ; i++) {
00332     to.t[i] = log(ti.t[i]) ;
00333   }
00334   for (int i=0; i<ti.get_taille_i(0); i++)
00335     to.tzri[i] = log(ti.tzri[i]) ;
00336   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00337     to.txti[i] = log(ti.txti[i]) ;
00338   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00339     to.typi[i] = log(ti.typi[i]) ;
00340   return to ;
00341 }
00342 
00343 //-------------//
00344 // Log decimal //
00345 //-------------//
00346 
00347 Tbl_val log10(const Tbl_val& ti)
00348 {
00349   // Protection
00350   assert(ti.get_etat() != ETATNONDEF) ;
00351     
00352     // Cas ETATZERO
00353   if (ti.get_etat() == ETATZERO) {
00354     cout << "Tbl_val log10: log10(ETATZERO) !" << endl ;
00355     abort () ;
00356   }
00357     
00358   // Cas general
00359   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00360   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00361   to.set_etat_qcq() ;
00362   int taille = ti.get_taille() ;
00363   for (int i=0 ; i<taille ; i++) {
00364     to.t[i] = log10(ti.t[i]) ;
00365   }
00366   for (int i=0; i<ti.get_taille_i(0); i++)
00367     to.tzri[i] = log(ti.tzri[i]) ;
00368   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00369     to.txti[i] = log(ti.txti[i]) ;
00370   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00371     to.typi[i] = log(ti.typi[i]) ;
00372   return to ;
00373 }
00374 
00375 //--------------//
00376 // Power entier //
00377 //--------------//
00378 
00379 Tbl_val pow(const Tbl_val& ti, int n)
00380 {
00381   // Protection
00382   assert(ti.get_etat() != ETATNONDEF) ;
00383     
00384     // Cas ETATZERO
00385   if (ti.get_etat() == ETATZERO) {
00386     if (n > 0) {
00387       return ti ;
00388     }
00389     else {
00390       cout << "Tbl_val pow: ETATZERO^n avec n<=0 ! "<< endl  ;
00391       abort () ;
00392     }
00393   }
00394     
00395   // Cas general
00396   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00397   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00398   to.set_etat_qcq() ;
00399   double x = n ;
00400   int taille = ti.get_taille() ;
00401   for (int i=0 ; i<taille ; i++) {
00402     to.t[i] = pow(ti.t[i], x) ;     
00403   }
00404   for (int i=0; i<ti.get_taille_i(0); i++)
00405     to.tzri[i] = pow(ti.tzri[i], x) ;
00406   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00407     to.txti[i] = pow(ti.txti[i], x) ;
00408   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00409     to.typi[i] = pow(ti.typi[i], x) ;
00410   return to ;
00411 }
00412 
00413 //--------------//
00414 // Power double //
00415 //--------------//
00416 
00417 Tbl_val pow(const Tbl_val& ti, double x)
00418 {
00419   // Protection
00420   assert(ti.get_etat() != ETATNONDEF) ;
00421     
00422     // Cas ETATZERO
00423   if (ti.get_etat() == ETATZERO) {
00424     if (x > 0) {
00425       return ti ;
00426     }
00427     else {
00428       cout << "Tbl_val pow: ETATZERO^x avec x<=0 !" << endl ;
00429       abort () ;
00430     }
00431   }
00432     
00433   // Cas general
00434   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00435   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00436   to.set_etat_qcq() ;
00437   int taille = ti.get_taille() ;
00438   for (int i=0 ; i<taille ; i++) {
00439     to.t[i] = pow(ti.t[i], x) ;
00440   }
00441   for (int i=0; i<ti.get_taille_i(0); i++)
00442     to.tzri[i] = pow(ti.tzri[i], x) ;
00443   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00444     to.txti[i] = pow(ti.txti[i], x) ;
00445   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00446     to.typi[i] = pow(ti.typi[i], x) ;
00447   return to ;
00448 }
00449 
00450 //----------------//
00451 // Absolute value //
00452 //----------------//
00453 
00454 Tbl_val abs(const Tbl_val& ti)
00455 {
00456   // Protection
00457   assert(ti.get_etat() != ETATNONDEF) ;
00458     
00459     // Cas ETATZERO
00460   if (ti.get_etat() == ETATZERO) {
00461     return ti ;
00462   }
00463     
00464   // Cas general
00465   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00466 
00467   Tbl_val to(ti.get_grille()) ;         // Tbl_val resultat
00468   to.set_etat_qcq() ;
00469 
00470   const double* xi = ti.t ; 
00471   double* xo = to.t ; 
00472   int taille = ti.get_taille() ;
00473 
00474   for (int i=0 ; i<taille ; i++) {
00475     xo[i] = fabs( xi[i] ) ;
00476   }
00477   for (int i=0; i<ti.get_taille_i(0); i++)
00478     to.tzri[i] = fabs(ti.tzri[i]) ;
00479   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00480     to.txti[i] = fabs(ti.txti[i]) ;
00481   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00482     to.typi[i] = fabs(ti.typi[i]) ;
00483     
00484   return to ;
00485 }
00486 //----------------//
00487 //      Cubic     //
00488 //----------------//
00489 
00490 Tbl_val racine_cubique(const Tbl_val& ti)
00491 {
00492   // Protection
00493   assert(ti.get_etat() != ETATNONDEF) ;
00494     
00495     // Cas ETATZERO
00496   if (ti.get_etat() == ETATZERO) {
00497     return ti ;
00498   }
00499     
00500   // Cas general
00501   assert(ti.get_etat() == ETATQCQ) ;    // sinon...
00502 
00503   Tbl_val absolute(abs(ti)) ;
00504   Tbl_val res (pow(absolute, 1./3.)) ;
00505     
00506   for (int i=0 ; i<ti.get_taille() ; i++)
00507     if (ti.t[i] < 0)
00508       res.t[i] *= -1 ;
00509   for (int i=0; i<ti.get_taille_i(0); i++)
00510     if (ti.tzri[i] < 0) res.tzri[i] *= -1 ;
00511   if (ti.txti != 0x0) for (int i=0; i<ti.get_taille_i(1); i++)
00512     if (ti.txti[i] < 0) res.txti[i] *= -1 ;
00513   if (ti.typi != 0x0) for (int i=0; i<ti.get_taille_i(2); i++)
00514     if (ti.typi[i] < 0) res.typi[i] *= -1 ;
00515     
00516   return res ;
00517 }
00518 
00519 //-------------------------------//
00520 //            max                //
00521 //-------------------------------//
00522 
00523 double max(const Tbl_val& ti) {
00524     
00525   // Protection
00526   assert(ti.get_etat() != ETATNONDEF) ;
00527     
00528   // Cas particulier
00529   if (ti.get_etat() == ETATZERO) {
00530     return double(0) ;
00531   }
00532     
00533   // Cas general
00534   assert(ti.get_etat() == ETATQCQ) ;     // sinon....
00535     
00536   const double* x = ti.t ; 
00537   double resu = x[0] ;
00538   for (int i=1; i<ti.get_taille(); i++) {
00539     if ( x[i] > resu ) resu = x[i] ;
00540   }
00541     
00542   return resu ; 
00543 }
00544 
00545 //-------------------------------//
00546 //            min                //
00547 //-------------------------------//
00548 
00549 double min(const Tbl_val& ti) {
00550     
00551   // Protection
00552   assert(ti.get_etat() != ETATNONDEF) ;
00553     
00554   // Cas particulier
00555   if (ti.get_etat() == ETATZERO) {
00556     return double(0) ;
00557   }
00558     
00559   // Cas general
00560   assert(ti.get_etat() == ETATQCQ) ;     // sinon....
00561     
00562   const double* x = ti.t ; 
00563   double resu = x[0] ;
00564   for (int i=1; i<ti.get_taille(); i++) {
00565     if ( x[i] < resu ) resu = x[i] ;
00566   }
00567     
00568   return resu ; 
00569 }
00570 
00571 //-------------------------------//
00572 //            norme              //
00573 //-------------------------------//
00574 
00575 double norme(const Tbl_val& ti) {
00576 
00577   // Protection
00578   assert(ti.get_etat() != ETATNONDEF) ;
00579     
00580   double resu = 0 ; 
00581     
00582   if (ti.get_etat() != ETATZERO) {  // on n'effectue la somme que si necessaire
00583 
00584     assert(ti.get_etat() == ETATQCQ) ;     // sinon....
00585     const double* x = ti.t ; 
00586     for (int i=0; i<ti.get_taille(); i++) {
00587       resu += fabs( x[i] ) ;
00588     }
00589 
00590   }
00591 
00592   return resu ;
00593 }
00594 
00595 //-------------------------------//
00596 //          diffrel              //
00597 //-------------------------------//
00598 
00599 double diffrel(const Tbl_val& t1, const Tbl_val& t2) {
00600     
00601   // Protections
00602   assert(t1.get_etat() != ETATNONDEF) ;
00603   assert(t2.get_etat() != ETATNONDEF) ;
00604     
00605   double norm2 = norme(t2) ;
00606   double normdiff = norme(t1-t2) ;
00607   double resu ;  
00608   if ( norm2 == double(0) ) {
00609     resu = normdiff ; 
00610   }
00611   else {
00612     resu =  normdiff / norm2 ; 
00613   }
00614     
00615   return resu ; 
00616     
00617 }
00618 
00619 //-------------------------------//
00620 //       diffrelmax              //
00621 //-------------------------------//
00622 
00623 double diffrelmax(const Tbl_val& t1, const Tbl_val& t2) {
00624     
00625   // Protections
00626   assert(t1.get_etat() != ETATNONDEF) ;
00627   assert(t2.get_etat() != ETATNONDEF) ;
00628     
00629   double max2 = max(abs(t2)) ;
00630   double maxdiff = max(abs(t1-t2)) ;
00631   double resu ;  
00632   if ( max2 == double(0) ) {
00633     resu = maxdiff ; 
00634   }
00635   else {
00636     resu =  maxdiff / max2 ; 
00637   }
00638     
00639   return resu ; 
00640     
00641 }

Generated on Tue Feb 7 01:35:20 2012 for LORENE by  doxygen 1.4.6