valeur_math.C

00001 /*
00002  *  Mathematical functions for class Valeur
00003  *
00004  */
00005 
00006 /*
00007  *   Copyright (c) 1999-2000 Jean-Alain Marck
00008  *   Copyright (c) 1999-2001 Eric Gourgoulhon
00009  *   Copyright (c) 1999-2001 Philippe Grandclement
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 valeur_math_C[] = "$Header: /cvsroot/Lorene/C++/Source/Valeur/valeur_math.C,v 1.3 2012/01/17 10:39:27 j_penner Exp $" ;
00031 
00032 /*
00033  * $Id: valeur_math.C,v 1.3 2012/01/17 10:39:27 j_penner Exp $
00034  * $Log: valeur_math.C,v $
00035  * Revision 1.3  2012/01/17 10:39:27  j_penner
00036  * added a Heaviside function
00037  *
00038  * Revision 1.2  2002/10/16 14:37:15  j_novak
00039  * Reorganization of #include instructions of standard C++, in order to
00040  * use experimental version 3 of gcc.
00041  *
00042  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00043  * LORENE
00044  *
00045  * Revision 2.4  1999/12/02  17:57:42  phil
00046  * *** empty log message ***
00047  *
00048  * Revision 2.3  1999/11/09  16:18:02  phil
00049  * ajout de racine_cubique
00050  *
00051  * Revision 2.2  1999/10/29  15:14:50  eric
00052  * Ajout de fonctions mathematiques (abs, norme, etc...).
00053  *
00054  * Revision 2.1  1999/03/01  15:11:03  eric
00055  * *** empty log message ***
00056  *
00057  * Revision 2.0  1999/02/24  15:40:32  hyc
00058  * *** empty log message ***
00059  *
00060  *
00061  * $Header: /cvsroot/Lorene/C++/Source/Valeur/valeur_math.C,v 1.3 2012/01/17 10:39:27 j_penner Exp $
00062  *
00063  */
00064 
00065 // Fichiers include
00066 // ----------------
00067 #include <math.h>
00068 #include <stdlib.h>
00069 
00070 #include "valeur.h"
00071 
00072 
00073                 //-------//
00074                 // Sinus //
00075                 //-------//
00076 
00077 Valeur sin(const Valeur& ti)
00078 {
00079     // Protection
00080     assert(ti.get_etat() != ETATNONDEF) ;
00081     
00082     // Cas ETATZERO
00083     if (ti.get_etat() == ETATZERO) {
00084     return ti ;
00085     }
00086     
00087     // Cas general
00088     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00089     if (ti.c == 0x0) {          // Il faut la valeur physique
00090     ti.coef_i() ;
00091     }
00092     Valeur to(ti.get_mg()) ;        // Valeur resultat
00093     to.set_etat_c_qcq() ;
00094     *(to.c) = sin( *(ti.c) ) ;
00095     return to ;
00096 }
00097 
00098                 //---------//
00099                 // Cosinus //
00100                 //---------//
00101 
00102 Valeur cos(const Valeur& ti)
00103 {
00104     // Protection
00105     assert(ti.get_etat() != ETATNONDEF) ;
00106     
00107     Valeur to(ti.get_mg()) ;        // Valeur resultat
00108     to.set_etat_c_qcq() ;
00109 
00110     // Cas ETATZERO
00111     if (ti.get_etat() == ETATZERO) {
00112     *(to.c) = 1. ;
00113     return to ;
00114     }
00115     
00116     // Cas general
00117     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00118     if (ti.c == 0x0) {          // Il faut la valeur physique
00119     ti.coef_i() ;
00120     }
00121     *(to.c) = cos( *(ti.c) ) ;
00122     return to ;
00123 }
00124 
00125                 //----------//
00126                 // Tangente //
00127                 //----------//
00128 
00129 Valeur tan(const Valeur& ti)
00130 {
00131     // Protection
00132     assert(ti.get_etat() != ETATNONDEF) ;
00133     
00134     // Cas ETATZERO
00135     if (ti.get_etat() == ETATZERO) {
00136     return ti ;
00137     }
00138     
00139     // Cas general
00140     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00141     if (ti.c == 0x0) {          // Il faut la valeur physique
00142     ti.coef_i() ;
00143     }
00144     Valeur to(ti.get_mg()) ;        // Valeur resultat
00145     to.set_etat_c_qcq() ;
00146     *(to.c) = tan( *(ti.c) ) ;
00147     return to ;
00148 }
00149 
00150                 //----------//
00151                 // ArcSinus //
00152                 //----------//
00153 
00154 Valeur asin(const Valeur& ti)
00155 {
00156     // Protection
00157     assert(ti.get_etat() != ETATNONDEF) ;
00158     
00159     // Cas ETATZERO
00160     if (ti.get_etat() == ETATZERO) {
00161     return ti ;
00162     }
00163     
00164     // Cas general
00165     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00166     if (ti.c == 0x0) {          // Il faut la valeur physique
00167     ti.coef_i() ;
00168     }
00169     Valeur to(ti.get_mg()) ;        // Valeur resultat
00170     to.set_etat_c_qcq() ;
00171     *(to.c) = asin( *(ti.c) ) ;
00172     return to ;
00173 }
00174 
00175                 //------------//
00176                 // ArcCosinus //
00177                 //------------//
00178 
00179 Valeur acos(const Valeur& ti)
00180 {
00181    // Protection
00182     assert(ti.get_etat() != ETATNONDEF) ;
00183     
00184     Valeur to(ti.get_mg()) ;            // Valeur resultat
00185     to.set_etat_c_qcq() ;
00186 
00187     // Cas ETATZERO
00188     if (ti.get_etat() == ETATZERO) {
00189     *(to.c) = M_PI * .5 ;
00190     return to ;
00191     }
00192     
00193     // Cas general
00194     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00195     if (ti.c == 0x0) {          // Il faut la valeur physique
00196     ti.coef_i() ;
00197     }
00198     *(to.c) = acos( *(ti.c) ) ;
00199     return to ;
00200 }
00201 
00202                 //-------------//
00203                 // ArcTangente //
00204                 //-------------//
00205 
00206 Valeur atan(const Valeur& ti)
00207 {
00208     // Protection
00209     assert(ti.get_etat() != ETATNONDEF) ;
00210     
00211     // Cas ETATZERO
00212     if (ti.get_etat() == ETATZERO) {
00213     return ti ;
00214     }
00215     
00216     // Cas general
00217     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00218     if (ti.c == 0x0) {          // Il faut la valeur physique
00219     ti.coef_i() ;
00220     }
00221     Valeur to(ti.get_mg()) ;        // Valeur resultat
00222     to.set_etat_c_qcq() ;
00223     *(to.c) = atan( *(ti.c) ) ;
00224     return to ;
00225 }
00226 
00227                 //------//
00228                 // Sqrt //
00229                 //------//
00230 
00231 Valeur sqrt(const Valeur& ti)
00232 {
00233     // Protection
00234     assert(ti.get_etat() != ETATNONDEF) ;
00235     
00236     // Cas ETATZERO
00237     if (ti.get_etat() == ETATZERO) {
00238     return ti ;
00239     }
00240     
00241     // Cas general
00242     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00243     if (ti.c == 0x0) {          // Il faut la valeur physique
00244     ti.coef_i() ;
00245     }
00246     Valeur to(ti.get_mg()) ;        // Valeur resultat
00247     to.set_etat_c_qcq() ;
00248     *(to.c) = sqrt( *(ti.c) ) ;
00249     return to ;
00250 }
00251 
00252                 //---------------//
00253                 // Exponantielle //
00254                 //---------------//
00255 
00256 Valeur exp(const Valeur& ti)
00257 {
00258     // Protection
00259     assert(ti.get_etat() != ETATNONDEF) ;
00260     
00261     Valeur to(ti.get_mg()) ;            // Valeur resultat
00262     to.set_etat_c_qcq() ;
00263 
00264     // Cas ETATZERO
00265     if (ti.get_etat() == ETATZERO) {
00266     *(to.c) = 1. ;
00267     return to ;
00268     }
00269     
00270     // Cas general
00271     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00272     if (ti.c == 0x0) {          // Il faut la valeur physique
00273     ti.coef_i() ;
00274     }
00275     *(to.c) = exp( *(ti.c) ) ;
00276     return to ;
00277 }
00278 
00279                 //--------------------//
00280                 // Heaviside Function //
00281                 //--------------------//
00282 
00283 Valeur Heaviside(const Valeur& ti)
00284 {
00285     // Protection
00286     assert(ti.get_etat() != ETATNONDEF) ;
00287     
00288     Valeur to(ti.get_mg()) ;            // Valeur resultat
00289     to.set_etat_c_qcq() ;
00290 
00291     // Cas ETATZERO
00292     if (ti.get_etat() == ETATZERO) {
00293     *(to.c) = 0. ;
00294     return to ;
00295     }
00296     
00297     // Cas general
00298     assert(ti.get_etat() == ETATQCQ) ;  // otherwise
00299     if (ti.c == 0x0) {          // Use the physical value << What?? (used Google translate)
00300     ti.coef_i() ;
00301     }
00302 
00303     *(to.c) = Heaviside( *(ti.c) ) ;
00304 
00305     return to ;
00306 }
00307 
00308                 //-------------//
00309                 // Log naturel //
00310                 //-------------//
00311 
00312 Valeur log(const Valeur& ti)
00313 {
00314     // Protection
00315     assert(ti.get_etat() != ETATNONDEF) ;
00316     
00317     // Cas ETATZERO
00318     if (ti.get_etat() == ETATZERO) {
00319     cout << "Valeur log: log(ETATZERO) !" << endl  ;
00320     abort () ;
00321     }
00322     
00323     // Cas general
00324     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00325     if (ti.c == 0x0) {          // Il faut la valeur physique
00326     ti.coef_i() ;
00327     }
00328     Valeur to(ti.get_mg()) ;        // Valeur resultat
00329     to.set_etat_c_qcq() ;
00330     *(to.c) = log( *(ti.c) ) ;
00331     return to ;
00332 }
00333 
00334                 //-------------//
00335                 // Log decimal //
00336                 //-------------//
00337 
00338 Valeur log10(const Valeur& ti)
00339 {
00340     // Protection
00341     assert(ti.get_etat() != ETATNONDEF) ;
00342     
00343     // Cas ETATZERO
00344     if (ti.get_etat() == ETATZERO) {
00345     cout << "Valeur log10: log10(ETATZERO) !" << endl ;
00346     abort () ;
00347     }
00348     
00349     // Cas general
00350     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00351     if (ti.c == 0x0) {          // Il faut la valeur physique
00352     ti.coef_i() ;
00353     }
00354     Valeur to(ti.get_mg()) ;        // Valeur resultat
00355     to.set_etat_c_qcq() ;
00356     *(to.c) = log10( *(ti.c) ) ;
00357     return to ;
00358 }
00359 
00360                 //--------------//
00361                 // Power entier //
00362                 //--------------//
00363 
00364 Valeur pow(const Valeur& ti, int n)
00365 {
00366     // Protection
00367     assert(ti.get_etat() != ETATNONDEF) ;
00368     
00369     // Cas ETATZERO
00370     if (ti.get_etat() == ETATZERO) {
00371     if (n > 0) {
00372         return ti ;
00373     }
00374     else {
00375         cout << "Valeur pow: ETATZERO^n with n<=0 ! "<< endl  ;
00376         abort () ;
00377     }
00378     }
00379     
00380     // Cas general
00381     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00382     if (ti.c == 0x0) {          // Il faut la valeur physique
00383     ti.coef_i() ;
00384     }
00385     Valeur to(ti.get_mg()) ;        // Valeur resultat
00386     to.set_etat_c_qcq() ;
00387     double x = n ;
00388     *(to.c) = pow( *(ti.c), x ) ;
00389     return to ;
00390 }
00391 
00392                 //--------------//
00393                 // Power double //
00394                 //--------------//
00395 
00396 Valeur pow(const Valeur& ti, double x)
00397 {
00398     // Protection
00399     assert(ti.get_etat() != ETATNONDEF) ;
00400     
00401     // Cas ETATZERO
00402     if (ti.get_etat() == ETATZERO) {
00403     if (x > 0) {
00404         return ti ;
00405     }
00406     else {
00407         cout << "Valeur pow: ETATZERO^x with x<=0 !" << endl ;
00408         abort () ;
00409     }
00410     }
00411     
00412     // Cas general
00413     assert(ti.get_etat() == ETATQCQ) ;  // sinon...
00414     if (ti.c == 0x0) {          // Il faut la valeur physique
00415     ti.coef_i() ;
00416     }
00417     Valeur to(ti.get_mg()) ;            // Valeur resultat
00418     to.set_etat_c_qcq() ;
00419     *(to.c) = pow( *(ti.c), x ) ;
00420     return to ;
00421 }
00422 
00423                 //----------------//
00424                 // Absolute value //
00425                 //----------------//
00426 
00427 Valeur abs(const Valeur& vi)
00428 {
00429     // Protection
00430     assert(vi.get_etat() != ETATNONDEF) ;
00431     
00432     // Cas ETATZERO
00433     if (vi.get_etat() == ETATZERO) {
00434     return vi ;
00435     }
00436     
00437     // Cas general
00438 
00439     assert(vi.get_etat() == ETATQCQ) ;  // sinon...
00440     if (vi.c == 0x0) {          // Il faut la valeur physique
00441     vi.coef_i() ;
00442     }
00443 
00444     Valeur vo(vi.get_mg()) ;            // Valeur resultat
00445 
00446     vo.set_etat_c_qcq() ;
00447 
00448     *(vo.c) = abs( *(vi.c) ) ;      // abs(Mtbl)
00449 
00450     return vo ;
00451 }
00452                  //----------------//
00453                 //    Cube root   //
00454                 //----------------//
00455 
00456 Valeur racine_cubique(const Valeur& vi)
00457 {   
00458 // Protection
00459     assert(vi.get_etat() != ETATNONDEF) ;
00460     
00461     // Cas ETATZERO
00462     if (vi.get_etat() == ETATZERO) {
00463     return vi ;
00464     }
00465     
00466     // Cas general
00467     assert(vi.get_etat() == ETATQCQ) ;  // sinon...
00468     if (vi.c == 0x0) {          // Il faut la valeur physique
00469     vi.coef_i() ;
00470     }
00471     Valeur vo(vi.get_mg()) ;        // Valeur resultat
00472     vo.set_etat_c_qcq() ;
00473     *(vo.c) = racine_cubique( *(vi.c) ) ;
00474     return vo ;
00475 }
00476             //-------------------------------//
00477                     //            totalmax           //
00478             //-------------------------------//
00479 
00480 double totalmax(const Valeur& vi) {
00481 
00482     // Protection
00483     assert(vi.get_etat() != ETATNONDEF) ;
00484     
00485 //    Tbl resu(vi.get_mg()->get_nzone()) ; 
00486     double resu ; 
00487     
00488     if (vi.get_etat() == ETATZERO) {
00489     resu = 0 ; 
00490     }
00491     else {
00492 
00493     assert(vi.get_etat() == ETATQCQ) ;  
00494     if (vi.c == 0x0) {          // Il faut la valeur physique
00495         vi.coef_i() ;
00496     }
00497 
00498     resu = totalmax( *(vi.c) ) ;        // max(Mtbl) 
00499     
00500     }
00501 
00502     return resu ;
00503 }
00504 
00505             //-------------------------------//
00506                     //           totalmin            //
00507             //-------------------------------//
00508 
00509 double totalmin(const Valeur& vi) {
00510 
00511     // Protection
00512     assert(vi.get_etat() != ETATNONDEF) ;
00513     
00514     double resu ; 
00515 
00516     if (vi.get_etat() == ETATZERO) {
00517     resu = 0 ; 
00518     }
00519     else {
00520 
00521     assert(vi.get_etat() == ETATQCQ) ;  
00522     if (vi.c == 0x0) {          // Il faut la valeur physique
00523         vi.coef_i() ;
00524     }
00525 
00526     resu = totalmin( *(vi.c) ) ;        // min(Mtbl) 
00527     
00528     }
00529 
00530     return resu ; 
00531 }
00532 
00533             //-------------------------------//
00534                     //            max                //
00535             //-------------------------------//
00536 
00537 Tbl max(const Valeur& vi) {
00538 
00539     // Protection
00540     assert(vi.get_etat() != ETATNONDEF) ;
00541     
00542     Tbl resu(vi.get_mg()->get_nzone()) ; 
00543     
00544     if (vi.get_etat() == ETATZERO) {
00545     resu.annule_hard() ; 
00546     }
00547     else {
00548 
00549     assert(vi.get_etat() == ETATQCQ) ;  
00550     if (vi.c == 0x0) {          // Il faut la valeur physique
00551         vi.coef_i() ;
00552     }
00553 
00554     resu = max( *(vi.c) ) ;     // max(Mtbl) 
00555     
00556     }
00557           
00558     return resu ; 
00559 }
00560 
00561             //-------------------------------//
00562                     //            min                //
00563             //-------------------------------//
00564 
00565 Tbl min(const Valeur& vi) {
00566 
00567     // Protection
00568     assert(vi.get_etat() != ETATNONDEF) ;
00569     
00570     Tbl resu(vi.get_mg()->get_nzone()) ; 
00571     
00572     if (vi.get_etat() == ETATZERO) {
00573     resu.annule_hard() ; 
00574     }
00575     else {
00576 
00577     assert(vi.get_etat() == ETATQCQ) ;  
00578     if (vi.c == 0x0) {          // Il faut la valeur physique
00579         vi.coef_i() ;
00580     }
00581 
00582     resu = min( *(vi.c) ) ;     // min(Mtbl) 
00583     
00584     }
00585           
00586     return resu ; 
00587 }
00588 
00589             //-------------------------------//
00590                     //            norme              //
00591             //-------------------------------//
00592 
00593 Tbl norme(const Valeur& vi) {
00594 
00595     // Protection
00596     assert(vi.get_etat() != ETATNONDEF) ;
00597     
00598     Tbl resu(vi.get_mg()->get_nzone()) ; 
00599     
00600     if (vi.get_etat() == ETATZERO) {
00601     resu.annule_hard() ; 
00602     }
00603     else {
00604 
00605     assert(vi.get_etat() == ETATQCQ) ;  
00606     if (vi.c == 0x0) {          // Il faut la valeur physique
00607         vi.coef_i() ;
00608     }
00609 
00610     resu = norme( *(vi.c) ) ;       // norme(Mtbl) 
00611     
00612     }
00613           
00614     return resu ; 
00615 }
00616 
00617             //-------------------------------//
00618                     //          diffrel              //
00619             //-------------------------------//
00620 
00621 Tbl diffrel(const Valeur& v1, const Valeur& v2) {
00622     
00623     // Protections
00624     assert(v1.get_etat() != ETATNONDEF) ;
00625     assert(v2.get_etat() != ETATNONDEF) ;
00626 
00627     int nz = v1.get_mg()->get_nzone() ;
00628     Tbl resu(nz) ; 
00629     
00630     Valeur diff = v1 - v2 ; 
00631     Tbl normdiff = norme(diff) ; 
00632     Tbl norme2 = norme(v2) ;
00633     
00634     assert(normdiff.get_etat() == ETATQCQ) ;     
00635     assert(norme2.get_etat() == ETATQCQ) ; 
00636 
00637     resu.set_etat_qcq() ; 
00638     for (int l=0; l<nz; l++) {
00639     if ( norme2(l) == double(0) ) {
00640         resu.set(l) = normdiff(l) ; 
00641     }
00642     else{
00643         resu.set(l) = normdiff(l) / norme2(l) ;             
00644     }
00645     }
00646     
00647     return resu ; 
00648     
00649 }
00650 
00651             //-------------------------------//
00652                     //          diffrelmax           //
00653             //-------------------------------//
00654 
00655 Tbl diffrelmax(const Valeur& v1, const Valeur& v2) {
00656     
00657     // Protections
00658     assert(v1.get_etat() != ETATNONDEF) ;
00659     assert(v2.get_etat() != ETATNONDEF) ;
00660     
00661     int nz = v1.get_mg()->get_nzone() ;
00662     Tbl resu(nz) ; 
00663     
00664     Tbl max2 = max(abs(v2)) ;
00665     Valeur diff = v1 - v2 ;
00666     Tbl maxdiff = max(abs(diff)) ; 
00667     
00668     assert(maxdiff.get_etat() == ETATQCQ) ;     
00669     assert(max2.get_etat() == ETATQCQ) ; 
00670 
00671     resu.set_etat_qcq() ; 
00672     for (int l=0; l<nz; l++) {
00673     if ( max2(l) == double(0) ) {
00674         resu.set(l) = maxdiff(l) ; 
00675     }
00676     else{
00677         resu.set(l) = maxdiff(l) / max2(l) ;            
00678     }
00679     }
00680     
00681     return resu ; 
00682     
00683 }
00684 

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