valeur.h

00001 /*
00002  *  Definition of Lorene class Valeur
00003  *
00004  */
00005 
00006 /*
00007  *   Copyright (c) 1999-2000 Jean-Alain Marck
00008  *   Copyright (c) 1999-2003 Eric Gourgoulhon
00009  *   Copyright (c) 1999-2001 Philippe Grandclement
00010  *   Copyright (c) 1999-2001 Jerome Novak
00011  *   Copyright (c) 2001 Keisuke Taniguchi
00012  *
00013  *   This file is part of LORENE.
00014  *
00015  *   LORENE is free software; you can redistribute it and/or modify
00016  *   it under the terms of the GNU General Public License as published by
00017  *   the Free Software Foundation; either version 2 of the License, or
00018  *   (at your option) any later version.
00019  *
00020  *   LORENE is distributed in the hope that it will be useful,
00021  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  *   GNU General Public License for more details.
00024  *
00025  *   You should have received a copy of the GNU General Public License
00026  *   along with LORENE; if not, write to the Free Software
00027  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00028  *
00029  */
00030 
00031 
00032 #ifndef __VALEUR_H_ 
00033 #define __VALEUR_H_ 
00034 
00035 /*
00036  * $Id: valeur.h,v 1.16 2012/01/18 14:43:42 j_penner Exp $
00037  * $Log: valeur.h,v $
00038  * Revision 1.16  2012/01/18 14:43:42  j_penner
00039  * added a routine to return the computational coordinate xi as a Valeur
00040  *
00041  * Revision 1.15  2012/01/17 10:17:23  j_penner
00042  * functions added: Heaviside
00043  *
00044  * Revision 1.14  2005/11/17 15:18:46  e_gourgoulhon
00045  * Added Valeur + Mtbl and Valeur - Mtbl.
00046  *
00047  * Revision 1.13  2005/10/25 08:56:34  p_grandclement
00048  * addition of std_spectral_base in the case of odd functions near the origin
00049  *
00050  * Revision 1.12  2004/11/23 12:46:04  f_limousin
00051  * Add functiun filtre_tp(int nn, int nz1, int nz2).
00052  *
00053  * Revision 1.11  2004/08/24 09:14:40  p_grandclement
00054  * Addition of some new operators, like Poisson in 2d... It now requieres the
00055  * GSL library to work.
00056  *
00057  * Also, the way a variable change is stored by a Param_elliptic is changed and
00058  * no longer uses Change_var but rather 2 Scalars. The codes using that feature
00059  * will requiere some modification. (It should concern only the ones about monopoles)
00060  *
00061  * Revision 1.10  2004/07/06 13:36:27  j_novak
00062  * Added methods for desaliased product (operator |) only in r direction.
00063  *
00064  * Revision 1.9  2004/03/22 13:12:44  j_novak
00065  * Modification of comments to use doxygen instead of doc++
00066  *
00067  * Revision 1.8  2003/11/06 14:43:37  e_gourgoulhon
00068  * Gave a name to const arguments in certain method prototypes (e.g.
00069  * constructors) to correct a bug of DOC++.
00070  *
00071  * Revision 1.7  2003/10/19 19:48:31  e_gourgoulhon
00072  * Introduced new method display_coef.
00073  *
00074  * Revision 1.6  2003/10/13 20:48:52  e_gourgoulhon
00075  * Added new method get_base() (to prepare the encapsulation of the member
00076  * base).
00077  *
00078  * Revision 1.5  2003/09/23 08:52:53  e_gourgoulhon
00079  * Added Scalar as a friend class.
00080  *
00081  * Revision 1.4  2002/10/16 14:36:30  j_novak
00082  * Reorganization of #include instructions of standard C++, in order to
00083  * use experimental version 3 of gcc.
00084  *
00085  * Revision 1.3  2002/09/13 09:17:33  j_novak
00086  * Modif. commentaires
00087  *
00088  * Revision 1.2  2002/06/17 14:05:17  j_novak
00089  * friend functions are now also declared outside the class definition
00090  *
00091  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00092  * LORENE
00093  *
00094  * Revision 2.51  2001/05/29  16:11:58  eric
00095  * Modif commentaires (mise en conformite Doc++ 3.4.7).
00096  *
00097  * Revision 2.50  2001/05/26  14:49:37  eric
00098  * Ajout de l'operator% : produit de deux Valeur avec desaliasage.
00099  *
00100  * Revision 2.49  2001/01/16  15:09:13  keisuke
00101  * Change the argument of the function smooth.
00102  *
00103  * Revision 2.48  2001/01/16  14:54:01  keisuke
00104  * Ajout de la fonction smooth.
00105  *
00106  * Revision 2.47  2000/11/10  13:31:53  eric
00107  * Ajout de la fonction equipot_outward.
00108  *
00109  * Revision 2.46  2000/09/11  13:52:39  eric
00110  * Ajout des methodes mult_cp() et mult_sp() ainsi que des membres associes
00111  *  p_mult_cp et p_mult_sp
00112  *
00113  * Revision 2.45  2000/09/08  11:43:26  eric
00114  * Modif commentaires.
00115  *
00116  * Revision 2.44  2000/09/08  10:07:02  eric
00117  * Ajout des methodes set_base_r, etc...
00118  *
00119  * Revision 2.43  2000/08/04  11:53:59  eric
00120  * Ajout de l'operateur (int l) et de la fonction set(int l) pour l'acces
00121  * individuel aux Tbl.
00122  *
00123  * Revision 2.42  1999/12/29  13:19:51  eric
00124  * Modif commentaires.
00125  *
00126  * Revision 2.41  1999/12/29  13:11:08  eric
00127  * Ajout de la fonction val_point_jk.
00128  *
00129  * Revision 2.40  1999/12/20  16:35:47  eric
00130  * Ajout de la fonction set_base.
00131  *
00132  * Revision 2.39  1999/12/10  16:19:40  eric
00133  * Modif commentaires.
00134  *
00135  * Revision 2.38  1999/12/10  16:11:13  eric
00136  * Fonction set: suppression de l'appel a set_etat_c_qcq() pour
00137  *  augmenter l'efficacite.
00138  *
00139  * Revision 2.37  1999/12/07  14:52:43  eric
00140  * Changement ordre des arguments (phi,theta,xi) --> (xi,theta,phi)
00141  *  dans la routine val_point.
00142  *
00143  * Revision 2.36  1999/12/06  16:46:46  eric
00144  * Ajout de la fonction val_point.
00145  *
00146  * Revision 2.35  1999/11/30  12:41:21  eric
00147  * Le membre base est desormais un objet de type Base_val et non plus
00148  *  un pointeur vers une Base_val.
00149  *
00150  * Revision 2.34  1999/11/29  10:25:32  eric
00151  * Ajout de Valeur/Mtbl et Mtbl / Valeur dans l'arithmetique.
00152  *
00153  * Revision 2.33  1999/11/29  10:05:47  eric
00154  * Ajout de Valeur*Mtbl dans l'arithmetique.
00155  *
00156  * Revision 2.32  1999/11/23  16:15:24  eric
00157  * Suppression du membre statique Valeur_Zero.
00158  * Suppression du constructeur par defaut.
00159  *
00160  * Revision 2.31  1999/11/23  14:30:47  novak
00161  * Ajout des membres mult_ct et mult_st
00162  *
00163  * Revision 2.30  1999/11/22  15:40:48  eric
00164  * Ajout des operateurs set(l,k,j,i) et (l,k,j,i).
00165  * Ajout de la fonction annule(int l).
00166  *
00167  * Revision 2.29  1999/11/19  11:21:48  eric
00168  * Ajout du membre p_stdsdp et de la fonction correspondante stdsdp().
00169  *
00170  * Revision 2.28  1999/11/19  09:28:38  eric
00171  * Les valeurs de retour des operateurs differentiels sont desormais
00172  *   const Valeur &
00173  * et non plus Valeur.
00174  * Le laplacien angulaire (lapang) a desormais le meme statut que les
00175  * autres operateurs differentiels.
00176  *
00177  * Revision 2.27  1999/11/16  13:09:48  novak
00178  * Ajout de mult_x et scost
00179  *
00180  * Revision 2.26  1999/11/09  15:24:08  phil
00181  * ajout de la fonction mathematique calculant la racine cubique
00182  *
00183  * Revision 2.25  1999/10/29  15:14:33  eric
00184  * Ajout de fonctions mathematiques (abs, norme, etc...).
00185  *
00186  * Revision 2.24  1999/10/27  08:48:46  eric
00187  * La classe Cmp est desormais amie (pour que Cmp::del_t() puisse appeler
00188  * Valeur::del_t()).
00189  *
00190  * Revision 2.23  1999/10/21  14:21:06  eric
00191  * Constructeur par lecture de fichier.
00192  *
00193  * Revision 2.22  1999/10/20  15:38:52  eric
00194  * *** empty log message ***
00195  *
00196  * Revision 2.21  1999/10/20  15:31:04  eric
00197  * Ajout de l'arithmetique.
00198  *
00199  * Revision 2.20  1999/10/19  15:30:24  eric
00200  * Ajout de la fonction affiche_seuil.
00201  *
00202  * Revision 2.19  1999/10/18  15:07:02  eric
00203  *  La fonction membre annule() est rebaptisee annule_hard().
00204  * Introduction de la fonction membre annule(int, int).
00205  *
00206  * Revision 2.18  1999/10/18  13:39:38  eric
00207  * Routines de derivation --> const
00208  * Suppression de sxdsdx (non implemente).
00209  *
00210  * Revision 2.17  1999/10/13  15:49:57  eric
00211  * Depoussierage.
00212  * Documentation.
00213  *
00214  * Revision 2.16  1999/09/14  17:17:47  phil
00215  * *** empty log message ***
00216  *
00217  * Revision 2.15  1999/09/14  17:15:38  phil
00218  * ajout de Valeur operator* (double, const Valeur&)
00219  *
00220  * Revision 2.14  1999/09/13  14:53:26  phil
00221  * *** empty log message ***
00222  *
00223  * Revision 2.13  1999/09/13  14:17:52  phil
00224  * ajout de Valeur friend operator+ (Valeur, Valeur)
00225  *
00226  * Revision 2.12  1999/04/26  16:24:23  phil
00227  * ajout de mult2_xm1_zec()
00228  *
00229  * Revision 2.11  1999/04/26  16:12:45  phil
00230  * ajout de mult_xm1_zec()
00231  *
00232  * Revision 2.10  1999/04/26  15:48:11  phil
00233  * ajout de sxm1_zec()
00234  *
00235  * Revision 2.9  1999/04/26  12:57:24  phil
00236  * ajout de lapang()
00237  *
00238  * Revision 2.8  1999/04/13  16:44:55  phil
00239  * ajout de ylm_i()
00240  *
00241  * Revision 2.7  1999/04/13  16:31:46  phil
00242  * *** empty log message ***
00243  *
00244  * Revision 2.6  1999/04/13  16:26:08  phil
00245  * ajout ylm
00246  *
00247  * Revision 2.5  1999/02/24  15:24:34  hyc
00248  * *** empty log message ***
00249  *
00250  * Revision 2.4  1999/02/23  15:55:46  hyc
00251  * *** empty log message ***
00252  *
00253  *
00254  * $Header: /cvsroot/Lorene/C++/Include/valeur.h,v 1.16 2012/01/18 14:43:42 j_penner Exp $
00255  *
00256  */
00257 
00258 // Fichier includes
00259 #include <stdio.h>
00260 
00261 #include "mtbl.h"
00262 #include "mtbl_cf.h"
00263 
00264 class Coord ;
00265 class Itbl ; 
00266 
00273 class Valeur {
00274 
00275     // Data : 
00276     // -----
00277     private:
00278     const Mg3d* mg ;  
00279 
00281     int etat ;  
00282 
00283     public:
00285     mutable Mtbl* c ;       
00286 
00288     mutable Mtbl_cf* c_cf ;     
00289 
00291     Base_val base ;    
00292 
00293     // Derived data : 
00294     // ------------
00295     private:
00296     mutable Valeur* p_dsdx ;    
00297     mutable Valeur* p_d2sdx2 ;  
00298     mutable Valeur* p_sx ;      
00299     mutable Valeur* p_sx2 ;     
00300     mutable Valeur* p_mult_x ;  
00301 
00302     mutable Valeur* p_dsdt ;    
00303     mutable Valeur* p_d2sdt2 ;  
00304     mutable Valeur* p_ssint ;   
00305         mutable Valeur* p_scost ;   
00306     mutable Valeur* p_mult_ct ; 
00307     mutable Valeur* p_mult_st ; 
00308 
00309     mutable Valeur* p_dsdp ;    
00310     mutable Valeur* p_stdsdp ;  
00311     mutable Valeur* p_d2sdp2 ;  
00312     mutable Valeur* p_mult_cp ; 
00313     mutable Valeur* p_mult_sp ; 
00314 
00315     mutable Valeur* p_lapang ;  
00316 
00317     // Constructors - Destructor
00318     // -------------------------
00319     
00320     public:
00321     explicit Valeur(const Mg3d& mgrid) ;        
00322     explicit Valeur(const Mg3d* p_mgrid) ;      
00323 
00325     Valeur(const Mg3d&, FILE* ) ;           
00326 
00327     Valeur(const Valeur& ) ;    
00328     ~Valeur() ;         
00329 
00330     // Assignement
00331     // -----------
00332     public: 
00333     void operator=(const Valeur& a) ; 
00334     void operator=(const Mtbl& mt) ;     
00335     void operator=(const Mtbl_cf& mtcf) ; 
00336     void operator=(double ) ;   
00337 
00338     // Access to individual elements
00339     // -----------------------------
00340     public:
00349     Tbl& set(int l) {
00350         assert(l < mg->get_nzone()) ;
00351         assert(etat == ETATQCQ) ;
00352         if (c == 0x0) {
00353         coef_i() ;
00354         }
00355         if (c_cf != 0x0) {
00356         delete c_cf ; 
00357         c_cf = 0 ; 
00358         }
00359         return c->set(l) ;
00360     };
00361     
00362     
00367     const Tbl& operator()(int l) const {
00368         assert(l < mg->get_nzone()) ;
00369         assert(etat == ETATQCQ) ;
00370         if (c == 0x0) {
00371         coef_i() ;
00372         }
00373         return (*c)(l) ;
00374     };
00375 
00376 
00387     double& set(int l, int k, int j, int i) {
00388         assert(l < mg->get_nzone()) ;
00389         assert(etat == ETATQCQ) ;
00390         if (c == 0x0) {
00391         coef_i() ;
00392         }
00393         if (c_cf != 0x0) {
00394         delete c_cf ; 
00395         c_cf = 0 ; 
00396         }
00397         return c->set(l, k, j, i) ;
00398     };
00399     
00400     
00407     double operator()(int l, int k, int j, int i) const {
00408         assert(etat != ETATNONDEF) ;
00409         assert(l < mg->get_nzone()) ;
00410         if (etat == ETATZERO) {
00411         double zero = 0. ;
00412         return zero ; 
00413         }
00414         else{       
00415         if (c == 0x0) {
00416             coef_i() ;
00417         }
00418             return (*c)(l, k, j, i) ;
00419         }
00420     };
00421 
00431     double val_point(int l, double x, double theta, double phi) const ; 
00432 
00444     double val_point_jk(int l, double x, int j, int k) const ; 
00445 
00446    
00447     // Operations on coefficients
00448     // --------------------------
00449     public:
00450     void coef() const ; 
00451     void coef_i() const ;   
00452     void ylm() ;        
00453     void ylm_i() ;      
00454 
00459     void val_propre_1d() ;
00463     void val_propre_1d_i() ;
00464     
00466     const Base_val& get_base() const {return base; } ; 
00467 
00469     void set_base(const Base_val& ) ; 
00470 
00474     void std_base_scal() ;   
00475     
00479     void std_base_scal_odd() ;   
00480     
00490     void set_base_r(int l, int base_r) ; 
00491 
00500     void set_base_t(int base_t) ; 
00501 
00510     void set_base_p(int base_p) ; 
00511 
00516     void filtre_tp(int nn, int nz1, int nz2) ;
00517 
00518 
00519 
00520     // Differential operators
00521     // ----------------------
00522     public:
00524     const Valeur& dsdx() const ;        
00526     const Valeur& d2sdx2() const ;     
00527 
00529     const Valeur& dsdt() const ;    
00531     const Valeur& d2sdt2() const ;  
00533     const Valeur& ssint() const ;   
00535         const Valeur& scost() const ;  
00537     const Valeur& mult_ct() const ;
00539     const Valeur& mult_st() const ;
00540 
00542     const Valeur& dsdp() const ;    
00544     const Valeur& stdsdp() const ;  
00546     const Valeur& d2sdp2() const ;  
00548     const Valeur& mult_cp() const ;
00550     const Valeur& mult_sp() const ;
00551     
00553     const Valeur& lapang() const ;      
00554 
00559     const Valeur& sx() const ;
00560             
00565     const Valeur& sx2() const ;     
00566     
00571     const Valeur& mult_x() const ;
00572     
00577     void sxm1_zec() ;
00578 
00583     void mult_xm1_zec() ;   
00584 
00589     void mult2_xm1_zec() ;  
00590     
00595     void va_x() ;
00596             
00597     
00598     // Outputs
00599     // -------
00600     public:
00601     void sauve(FILE *) const ;      
00602     
00611     void display_coef(double threshold = 1.e-7, int precision = 4, 
00612                ostream& ostr = cout) const ;
00613 
00623     void affiche_seuil(ostream& ostr, int type = 0, int precision = 4, 
00624                double threshold = 1.e-7) const ;
00625 
00627     friend ostream& operator<<(ostream& , const Valeur& ) ;   
00628 
00629     // Memory management
00630     // -----------------
00631     private:
00632     void nouveau() ;        
00633     void del_t() ;          
00634     void del_deriv() ;      
00635     void set_der_0x0() ;        
00636 
00637     // State manipulations
00638     public:
00639 
00645     void set_etat_nondef() ;  
00646 
00652     void set_etat_zero() ;      
00653 
00664     void set_etat_c_qcq() ;     
00665 
00676     void set_etat_cf_qcq() ;    
00677 
00686     void annule_hard() ;            
00687 
00693     void annule(int l) ; 
00694 
00705     void annule(int l_min, int l_max) ; 
00706 
00707 
00708     // Extraction of information
00709     // -------------------------
00710     public:
00712     int get_etat() const {return etat ; };   
00713 
00715     const Mg3d* get_mg() const { return mg ; }; 
00716     
00717     // Member arithmetics
00718     // ------------------
00719     public:
00720     void operator+=(const Valeur& ) ;   
00721     void operator-=(const Valeur& ) ;   
00722     void operator*=(const Valeur& ) ;   
00723 
00724     // Miscellaneous
00725     // -------------
00726     public:
00761     void equipot(double uu0, int nz_search, double precis, int nitermax,
00762              int& niter, Itbl& l_iso, Tbl& xi_iso) const ; 
00763     
00797     void equipot_outward(double uu0, int nz_search, double precis, 
00798                  int nitermax, int& niter, Itbl& l_iso, 
00799                  Tbl& xi_iso) const ; 
00800 
00809     void smooth(int nzet, Valeur& uuva) const ;
00810 
00811     friend class Cmp ;      
00812     friend class Scalar ;       
00813     friend void rotate_propre_pair (Valeur&, bool) ; 
00814     friend void rotate_propre_impair (Valeur&, bool) ; 
00815 };
00816 ostream& operator<<(ostream& , const Valeur& ) ;   
00817 
00823 Valeur operator+(const Valeur& ) ;  
00824 Valeur operator-(const Valeur& ) ;  
00825 Valeur operator+(const Valeur&, const Valeur& ) ; 
00826 Valeur operator+(const Valeur&, const Mtbl& ) ; 
00827 Valeur operator+(const Mtbl&, const Valeur& ) ; 
00828 Valeur operator+(const Valeur&, double ) ;    
00829 Valeur operator+(double, const Valeur& ) ;    
00830 Valeur operator+(const Valeur&, int ) ;       
00831 Valeur operator+(int, const Valeur& ) ;       
00832 Valeur operator-(const Valeur&, const Valeur& ) ; 
00833 Valeur operator-(const Valeur&, const Mtbl& ) ; 
00834 Valeur operator-(const Mtbl&, const Valeur& ) ; 
00835 Valeur operator-(const Valeur&, double ) ;    
00836 Valeur operator-(double, const Valeur& ) ;    
00837 Valeur operator-(const Valeur&, int ) ;       
00838 Valeur operator-(int, const Valeur& ) ;       
00839 Valeur operator*(const Valeur&, const Valeur& ) ; 
00840 
00842 Valeur operator%(const Valeur&, const Valeur& ) ; 
00843 
00845 Valeur operator|(const Valeur&, const Valeur& ) ; 
00846 
00847 Valeur operator*(const Valeur&, double ) ;    
00848 Valeur operator*(double, const Valeur& ) ;    
00849 Valeur operator*(const Valeur&, int ) ;       
00850 Valeur operator*(int, const Valeur& ) ;       
00851 Valeur operator*(const Valeur& a, const Mtbl& b) ;    
00852 Valeur operator*(const Mtbl& b, const Valeur& a) ;    
00853 Valeur operator*(const Valeur& a, const Coord& c) ;  
00854 Valeur operator*(const Coord& c, const Valeur& a) ;  
00855 Valeur operator/(const Valeur& a, const Valeur& b) ; 
00856 Valeur operator/(const Valeur&, double ) ;    
00857 Valeur operator/(double, const Valeur& ) ;    
00858 Valeur operator/(const Valeur&, int ) ;       
00859 Valeur operator/(int, const Valeur& ) ;       
00860 Valeur operator/(const Valeur& a, const Mtbl& b) ;    
00861 Valeur operator/(const Mtbl& b, const Valeur& a) ;    
00862 
00863 Valeur sin(const Valeur& ) ;        
00864 Valeur cos(const Valeur& ) ;        
00865 Valeur tan(const Valeur& ) ;        
00866 Valeur asin(const Valeur& ) ;       
00867 Valeur acos(const Valeur& ) ;       
00868 Valeur atan(const Valeur& ) ;       
00869 Valeur exp(const Valeur& ) ;        
00870 Valeur Heaviside(const Valeur& ) ;      
00871 Valeur log(const Valeur& ) ;        
00872 Valeur log10(const Valeur& ) ;      
00873 Valeur sqrt(const Valeur& ) ;       
00874 Valeur pow(const Valeur& , int ) ;  
00875 Valeur pow(const Valeur& , double ) ; 
00876 Valeur abs(const Valeur& ) ;        
00877 Valeur racine_cubique (const Valeur&) ; 
00878 
00884 double totalmax(const Valeur& ) ;   
00885 
00891 double totalmin(const Valeur& ) ;   
00892 
00899 Tbl max(const Valeur& ) ;   
00900 
00907 Tbl min(const Valeur& ) ;   
00908 
00915 Tbl norme(const Valeur& ) ;   
00916 
00926 Tbl diffrel(const Valeur& a, const Valeur& b) ; 
00927 
00937 Tbl diffrelmax(const Valeur& a, const Valeur& b) ; 
00938 
00939 
00942 #endif

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