map_et_radius.C

00001 /*
00002  *  Methods of the class Map_et relative to the function
00003  *      r = R_l(xi, theta', phi')
00004  */
00005 
00006 /*
00007  *   Copyright (c) 1999-2001 Eric Gourgoulhon
00008  *
00009  *   This file is part of LORENE.
00010  *
00011  *   LORENE is free software; you can redistribute it and/or modify
00012  *   it under the terms of the GNU General Public License as published by
00013  *   the Free Software Foundation; either version 2 of the License, or
00014  *   (at your option) any later version.
00015  *
00016  *   LORENE is distributed in the hope that it will be useful,
00017  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  *   GNU General Public License for more details.
00020  *
00021  *   You should have received a copy of the GNU General Public License
00022  *   along with LORENE; if not, write to the Free Software
00023  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00024  *
00025  */
00026 
00027 
00028 char map_et_radius_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_radius.C,v 1.4 2008/08/27 08:49:16 jl_cornou Exp $" ;
00029 
00030 /*
00031  * $Id: map_et_radius.C,v 1.4 2008/08/27 08:49:16 jl_cornou Exp $
00032  * $Log: map_et_radius.C,v $
00033  * Revision 1.4  2008/08/27 08:49:16  jl_cornou
00034  * Added R_JACO02 case
00035  *
00036  * Revision 1.3  2004/01/26 16:58:35  j_novak
00037  * Added initialization to avoid compiler warning.
00038  *
00039  * Revision 1.2  2003/12/19 16:21:43  j_novak
00040  * Shadow hunt
00041  *
00042  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00043  * LORENE
00044  *
00045  * Revision 1.5  2000/10/20  13:14:47  eric
00046  * Map_et::val_lx : la valeur par defaut de precis est desormais 1e-14
00047  *  (et non plus 1e-15).
00048  *
00049  * Revision 1.4  2000/01/04  13:05:47  eric
00050  * \Corrections dans val_lx et val_lx_jk : initialisation de ftp/gtp
00051  *  par double(0) dans les cas ou il ne sont pas calcules.
00052  *
00053  * Revision 1.3  1999/12/17  11:03:36  eric
00054  * Fonctions val_r_jk et val_lx_jk operationnelles.
00055  *
00056  * Revision 1.2  1999/12/17  09:29:22  eric
00057  * val_lx : initialisation de niter a 0.
00058  *
00059  * Revision 1.1  1999/12/16  14:19:39  eric
00060  * Initial revision
00061  *
00062  *
00063  * $Header: /cvsroot/Lorene/C++/Source/Map/map_et_radius.C,v 1.4 2008/08/27 08:49:16 jl_cornou Exp $
00064  *
00065  */
00066 
00067 
00068 // Headers Lorene
00069 #include "map.h"
00070 #include "param.h"
00071 #include "nbr_spx.h"
00072 #include "utilitaires.h"
00073 
00074 // Local prototypes
00075 double fonc_invr_map_et_noyau(double, const Param&) ; 
00076 double fonc_invr_map_et_coq(double, const Param&) ; 
00077 double fonc_invr_map_et_zec(double, const Param&) ; 
00078 
00079             //------------------------------// 
00080             //      val_r       //
00081             //------------------------------// 
00082 
00083  
00084 double Map_et::val_r(int l, double xi, double theta, double pphi) const {
00085 
00086     assert( l>=0 ) ; 
00087     assert( l<mg->get_nzone() ) ; 
00088     
00089     double resu ; 
00090     double ftp = ff.val_point(l, 0, theta, pphi) ; // value of F_l(theta,phi)
00091 
00092     switch( mg->get_type_r(l) ) {
00093 
00094     case RARE: {
00095         double gtp = gg.val_point(l, 0, theta, pphi) ; 
00096         double xi_2 = xi * xi ; 
00097         double xi_3 = xi * xi_2 ;
00098         double a = xi_2 * xi_2 * (3. - 2.*xi_2) ;
00099         double b =  ( 2.5  - 1.5 * xi_2 ) * xi_3 ;
00100         resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00101         break ;
00102     }
00103 
00104     case FINJAC: {
00105         double gtp = gg.val_point(l, 0, theta, pphi) ; 
00106         double xm1 = xi - 1. ; 
00107         double xp1 = xi + 1. ; 
00108         double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00109         double b = 0.25* xp1 * xp1 * (2. - xi) ;
00110         resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00111         break ;
00112     }
00113     
00114     case FIN: {
00115         double gtp = gg.val_point(l, 0, theta, pphi) ; 
00116         double xm1 = xi - 1. ; 
00117         double xp1 = xi + 1. ; 
00118         double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00119         double b = 0.25* xp1 * xp1 * (2. - xi) ;
00120         resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00121         break ;
00122     }
00123     
00124     case UNSURR: {
00125         double xm1 = xi - 1. ; 
00126         double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00127         resu = double(1) / ( alpha[l] * ( xi + a * ftp ) + beta[l] ) ;
00128         break ;
00129     }
00130 
00131     default: {
00132         cout << "Map_et::val_r: unknown type_r ! " << endl ;
00133         abort () ;
00134     }      
00135     }
00136              
00137     return resu ;    
00138 }
00139             
00140             //------------------------------// 
00141             //      val_lx      //
00142             //------------------------------// 
00143 
00144 //-------------------------------
00145 // Version with default precision 
00146 //-------------------------------
00147 
00148 void Map_et::val_lx(double rr, double theta, double pphi,  
00149                 int& lz, double& xi) const {
00150 
00151     int nitermax = 100 ;    // Maximum number of iteration in the secant method
00152     int niter ; 
00153     double precis = 1e-14 ; // Absolute precision in the secant method
00154     
00155     Param par ; 
00156     par.add_int(nitermax) ; 
00157     par.add_int_mod(niter) ; 
00158     par.add_double(precis) ; 
00159 
00160     // Call of the version with precision parameters
00161     
00162     val_lx(rr, theta, pphi, par, lz, xi) ;
00163 
00164 }
00165 
00166 
00167 //---------------------------------
00168 // Version with specified precision 
00169 //---------------------------------
00170 
00171 void Map_et::val_lx(double rr, double theta, double pphi,
00172             const Param& par, int& lz, double& xi) const {
00173                
00174     int nz = mg->get_nzone() ;
00175 
00176     // Precision in the secant method :
00177     // ------------------------------
00178     
00179     int nitermax = par.get_int() ; 
00180     int& niter = par.get_int_mod() ; 
00181     niter = 0 ;     // initialisation 
00182     double precis = par.get_double() ; 
00183     
00184     // Particular case of r = infinity
00185     //--------------------------------
00186     if (rr == __infinity) { 
00187     if ( (mg->get_type_r(nz-1) == UNSURR) && 
00188          (alpha[nz-1] == - beta[nz-1]) ) {
00189         lz = nz - 1 ; 
00190         xi = 1 ;         
00191     }
00192     else {
00193         cout.precision(16);
00194         cout.setf(ios::showpoint);
00195         cout << "Map_et::val_lx: the domain containing r = " << rr <<
00196          " has not been found ! " 
00197           << endl ;
00198         abort () ;
00199     }
00200     return ; 
00201     }
00202     
00203 
00204     // In which domain is located r ? 
00205     // ----------------------------
00206     lz = - 1 ;
00207     double rmax = 0. ; 
00208     double ftp = double(0) ; 
00209     double gtp = double(0) ; 
00210     for (int l=0; l<nz; l++) {
00211         
00212     switch( mg->get_type_r(l) ) {
00213 
00214     case RARE: {
00215         ftp = ff.val_point(l, 0, theta, pphi) ; // value of F_l(theta,phi)
00216         gtp = gg.val_point(l, 0, theta, pphi) ; // value of G_l(theta,phi)
00217         rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00218         break ;
00219     }
00220     
00221     case FINJAC: {
00222         ftp = double(0) ; 
00223         gtp = gg.val_point(l, 0, theta, pphi) ; 
00224         rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00225         break ;
00226     }
00227 
00228     case FIN: {
00229         ftp = double(0) ; 
00230         gtp = gg.val_point(l, 0, theta, pphi) ; 
00231         rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00232         break ;
00233     }
00234     
00235     case UNSURR: {
00236         ftp = double(0) ; 
00237         gtp = double(0) ; 
00238         rmax = double(1) / ( alpha[l] + beta[l] ) ; 
00239         break ;
00240     }
00241 
00242     default: {
00243         cout << "Map_et::val_lx: unknown type_r ! " << endl ;
00244         abort() ;
00245     }      
00246     }   // end of switch on type_r
00247 
00248 
00249     if ( rr <= rmax + 1.e-14 ) { 
00250         lz = l ;
00251         if (ftp == double(0)) ftp = ff.val_point(l, 0, theta, pphi) ;
00252         if (gtp == double(0)) gtp = gg.val_point(l, 0, theta, pphi) ;
00253         break ; 
00254     }   
00255     }       // End of loop onto the domains
00256     
00257     if (lz == -1) {         // The domain has not been found
00258     cout.precision(16);
00259     cout.setf(ios::showpoint);
00260     cout << "Map_et::val_lx: the domain containing r = " << rr <<
00261          " has not been found ! " 
00262           << endl ;
00263     for (int l=0; l<nz; l++) {
00264         ftp = ff.val_point(l, 0, theta, pphi) ;
00265         gtp = gg.val_point(l, 0, theta, pphi) ; 
00266         switch( mg->get_type_r(l) ) {
00267         case RARE: {
00268             rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00269             break ;
00270         }
00271         case FIN: {
00272             rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00273             break ;
00274         }
00275         case UNSURR: {
00276             rmax = double(1) / ( alpha[l] + beta[l] ) ; 
00277             break ;
00278         }
00279         default: {
00280             cout << "Map_et::val_lx: unknown type_r ! " << endl ;
00281             abort () ;
00282         }      
00283         }   // end of switch on type_r
00284 
00285         cout << "domain: " << l << " theta = " << theta << " phi = " 
00286          << pphi << " :  rmax = " << rmax << endl ; 
00287     }
00288     abort() ;
00289     }
00290 
00291     // Computation of xi
00292     // ----------------- 
00293 
00294     if ( (rr >= rmax) && ( rr <= rmax + 1.e-14) ) {
00295     xi = double(1) ; 
00296     }
00297     else {
00298 
00299     // Search of xi by the secant method
00300     // ---------------------------------
00301 
00302     Param parzerosec ;
00303     parzerosec.add_double(rr, 0) ; 
00304     parzerosec.add_double(ftp, 1) ; 
00305     parzerosec.add_double(gtp, 2) ; 
00306     parzerosec.add_double(alpha[lz], 3) ; 
00307     parzerosec.add_double(beta[lz], 4) ; 
00308 
00309 
00310     switch( mg->get_type_r(lz) ) {
00311 
00312     case RARE: {
00313         if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00314         xi = ( rr - beta[lz] ) / alpha[lz]  ;
00315         }
00316         else {
00317         double xmin = 0 ; 
00318         double xmax = 1 ; 
00319         xi = zerosec(fonc_invr_map_et_noyau, parzerosec, xmin, xmax, 
00320                  precis, nitermax, niter) ;
00321         }
00322         break ;
00323     }
00324     
00325     case FINJAC: {
00326         if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00327         xi = ( rr - beta[lz] ) / alpha[lz]  ;
00328         }
00329         else {
00330         double xmin = -1 ; 
00331         double xmax = 1 ; 
00332         xi = zerosec(fonc_invr_map_et_coq, parzerosec, xmin, xmax, 
00333                  precis, nitermax, niter) ;
00334         }
00335         break ;
00336     }
00337 
00338     case FIN: {
00339         if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00340         xi = ( rr - beta[lz] ) / alpha[lz]  ;
00341         }
00342         else {
00343         double xmin = -1 ; 
00344         double xmax = 1 ; 
00345         xi = zerosec(fonc_invr_map_et_coq, parzerosec, xmin, xmax, 
00346                  precis, nitermax, niter) ;
00347         }
00348         break ;
00349     }
00350     
00351     case UNSURR: {
00352         if ( (ff.get_etat()==ETATZERO) ) {
00353         xi = ( double(1)/rr - beta[lz] ) / alpha[lz]  ;
00354         }
00355         else {
00356         assert(ff.get_etat()==ETATQCQ) ; 
00357         if ( ff.c->t[lz]->get_etat() == ETATZERO) {
00358             xi = ( double(1) / rr - beta[lz] ) / alpha[lz]  ;
00359         }
00360         else {
00361             double xmin = -1 ; 
00362             double xmax = 1 ; 
00363             xi = zerosec(fonc_invr_map_et_zec, parzerosec, xmin, xmax, 
00364                  precis, nitermax, niter) ;
00365         } 
00366         }
00367         break ;
00368     }
00369 
00370     default: {
00371         cout << "Map_et::val_lx: unknown type_r ! " << endl ;
00372         abort () ;
00373     }      
00374     }
00375     
00376     
00377     } // End of search by the secant method
00378 
00379 } 
00380 
00381 
00382 
00383 
00384             //------------------------------// 
00385             //      val_r_jk        //
00386             //------------------------------// 
00387 
00388  
00389 double Map_et::val_r_jk(int l, double xi, int j, int k) const {
00390 
00391     assert( l>=0 ) ; 
00392     assert( l<mg->get_nzone() ) ; 
00393     
00394     double resu ; 
00395     double ftp = ff(l, k, j, 0) ; // value of F_l(theta_j, phi_k)
00396 
00397     switch( mg->get_type_r(l) ) {
00398 
00399     case RARE: {
00400         double gtp = gg(l, k, j, 0) ; // value of G_l(theta_j, phi_k)
00401         double xi_2 = xi * xi ; 
00402         double xi_3 = xi * xi_2 ;
00403         double a = xi_2 * xi_2 * (3. - 2.*xi_2) ;
00404         double b =  ( 2.5  - 1.5 * xi_2 ) * xi_3 ;
00405         resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00406         break ;
00407     }
00408     
00409     case FIN: {
00410         double gtp = gg(l, k, j, 0) ; // value of G_l(theta_j, phi_k)
00411         double xm1 = xi - 1. ; 
00412         double xp1 = xi + 1. ; 
00413         double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00414         double b = 0.25* xp1 * xp1 * (2. - xi) ;
00415         resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00416         break ;
00417     }
00418 
00419     case FINJAC: {
00420         double gtp = gg(l, k, j, 0) ; // value of G_l(theta_j, phi_k)
00421         double xm1 = xi - 1. ; 
00422         double xp1 = xi + 1. ; 
00423         double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00424         double b = 0.25* xp1 * xp1 * (2. - xi) ;
00425         resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00426         break ;
00427     }
00428     
00429     case UNSURR: {
00430         double xm1 = xi - 1. ; 
00431         double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00432         resu = double(1) / ( alpha[l] * ( xi + a * ftp ) + beta[l] ) ;
00433         break ;
00434     }
00435 
00436     default: {
00437         cout << "Map_et::val_r_jk: unknown type_r ! " << endl ;
00438         abort () ;
00439     }      
00440     }
00441              
00442     return resu ;    
00443 
00444 }
00445             
00446             //------------------------------// 
00447             //      val_lx_jk       //
00448             //------------------------------// 
00449 
00450 void Map_et::val_lx_jk(double rr, int j, int k, const Param& par, 
00451                 int& lz, double& xi) const {
00452                
00453     int nz = mg->get_nzone() ;
00454 
00455     // Precision in the secant method :
00456     // ------------------------------
00457     
00458     int nitermax = par.get_int() ; 
00459     int& niter = par.get_int_mod() ; 
00460     niter = 0 ;     // initialisation 
00461     double precis = par.get_double() ; 
00462     
00463     // Particular case of r = infinity
00464     //--------------------------------
00465     if (rr == __infinity) { 
00466     if ( (mg->get_type_r(nz-1) == UNSURR) && 
00467          (alpha[nz-1] == - beta[nz-1]) ) {
00468         lz = nz - 1 ; 
00469         xi = 1 ;         
00470     }
00471     else {
00472         cout.precision(16);
00473         cout.setf(ios::showpoint);
00474         cout << "Map_et::val_lx_jk: the domain containing r = " << rr <<
00475          " has not been found ! " 
00476           << endl ;
00477         abort () ;
00478     }
00479     return ; 
00480     }
00481     
00482 
00483     // In which domain is located r ? 
00484     // ----------------------------
00485     lz = - 1 ;
00486     double rmax = 0 ; 
00487     double ftp = double(0) ; 
00488     double gtp = double(0) ; 
00489     for (int l=0; l<nz; l++) {
00490         
00491     switch( mg->get_type_r(l) ) {
00492 
00493     case RARE: {
00494         ftp = ff(l, k, j, 0) ; // value of F_l(theta_j, phi_k)
00495         gtp = gg(l, k, j, 0) ; // value of G_l(theta_j, phi_k)
00496         rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00497         break ;
00498     }
00499     
00500     case FIN: {
00501         ftp = double(0) ; 
00502         gtp = gg(l, k, j, 0) ; // value of G_l(theta_j, phi_k)
00503         rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00504         break ;
00505     }
00506     
00507     case UNSURR: {
00508         ftp = double(0) ; 
00509         gtp = double(0) ; 
00510         rmax = double(1) / ( alpha[l] + beta[l] ) ; 
00511         break ;
00512     }
00513 
00514     default: {
00515         cout << "Map_et::val_lx_jk: unknown type_r ! " << endl ;
00516         abort() ;
00517     }      
00518     }   // end of switch on type_r
00519 
00520 
00521     if ( rr <= rmax + 1.e-14 ) { 
00522         lz = l ;
00523         if (ftp == double(0)) ftp = ff(l, k, j, 0) ;
00524         if (gtp == double(0)) gtp = gg(l, k, j, 0) ;
00525         break ; 
00526     }   
00527     }       // End of loop onto the domains
00528     
00529     if (lz == -1) {         // The domain has not been found
00530     cout.precision(16);
00531     cout.setf(ios::showpoint);
00532     cout << "Map_et::val_lx_jk: the domain containing r = " << rr <<
00533          " has not been found ! " 
00534           << endl ;
00535     for (int l=0; l<nz; l++) {
00536         ftp = ff(l, k, j, 0) ;
00537         gtp = gg(l, k, j, 0) ; 
00538         switch( mg->get_type_r(l) ) {
00539         case RARE: {
00540             rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00541             break ;
00542         }
00543         case FIN: {
00544             rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00545             break ;
00546         }
00547         case UNSURR: {
00548             rmax = double(1) / ( alpha[l] + beta[l] ) ; 
00549             break ;
00550         }
00551         default: {
00552             cout << "Map_et::val_lx_jk: unknown type_r ! " << endl ;
00553             abort () ;
00554         }      
00555         }   // end of switch on type_r
00556 
00557         cout << "domain: " << l << "   j = " << j << "   k = " << k
00558          << " :  rmax = " << rmax << endl ; 
00559     }
00560     abort() ;
00561     }
00562 
00563     // Computation of xi
00564     // ----------------- 
00565 
00566     if ( (rr >= rmax) && ( rr <= rmax + 1.e-14) ) {
00567     xi = double(1) ; 
00568     }
00569     else {
00570 
00571     // Search of xi by the secant method
00572     // ---------------------------------
00573 
00574     Param parzerosec ;
00575     parzerosec.add_double(rr, 0) ; 
00576     parzerosec.add_double(ftp, 1) ; 
00577     parzerosec.add_double(gtp, 2) ; 
00578     parzerosec.add_double(alpha[lz], 3) ; 
00579     parzerosec.add_double(beta[lz], 4) ; 
00580 
00581 
00582     switch( mg->get_type_r(lz) ) {
00583 
00584     case RARE: {
00585         if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00586         xi = ( rr - beta[lz] ) / alpha[lz]  ;
00587         }
00588         else {
00589         double xmin = 0 ; 
00590         double xmax = 1 ; 
00591         xi = zerosec(fonc_invr_map_et_noyau, parzerosec, xmin, xmax, 
00592                  precis, nitermax, niter) ;
00593         }
00594         break ;
00595     }
00596     
00597     case FIN: {
00598         if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00599         xi = ( rr - beta[lz] ) / alpha[lz]  ;
00600         }
00601         else {
00602         double xmin = -1 ; 
00603         double xmax = 1 ; 
00604         xi = zerosec(fonc_invr_map_et_coq, parzerosec, xmin, xmax, 
00605                  precis, nitermax, niter) ;
00606         }
00607         break ;
00608     }
00609     
00610     case UNSURR: {
00611         if ( (ff.get_etat()==ETATZERO) ) {
00612         xi = ( double(1)/rr - beta[lz] ) / alpha[lz]  ;
00613         }
00614         else {
00615         assert(ff.get_etat()==ETATQCQ) ; 
00616         if ( ff.c->t[lz]->get_etat() == ETATZERO) {
00617             xi = ( double(1) / rr - beta[lz] ) / alpha[lz]  ;
00618         }
00619         else {
00620             double xmin = -1 ; 
00621             double xmax = 1 ; 
00622             xi = zerosec(fonc_invr_map_et_zec, parzerosec, xmin, xmax, 
00623                  precis, nitermax, niter) ;
00624         } 
00625         }
00626         break ;
00627     }
00628 
00629     default: {
00630         cout << "Map_et::val_lx_jk: unknown type_r ! " << endl ;
00631         abort () ;
00632     }      
00633     }
00634     
00635     
00636     } // End of search by the secant method
00637 } 
00638 
00639 
00640 //=============================================================================//
00641 //              Auxilary functions                 //
00642 //=============================================================================//
00643        
00644 double fonc_invr_map_et_noyau(double x, const Param& par) {
00645 
00646     double r = par.get_double(0) ;
00647     double f = par.get_double(1) ;
00648     double g = par.get_double(2) ;
00649     double alp = par.get_double(3) ;
00650     double bet = par.get_double(4) ;
00651     double x_2 = x * x ; 
00652     double x_3 = x_2 * x ;
00653     double a = x_2 * x_2 * (3. - 2.*x_2) ;
00654     double b =  ( 2.5  - 1.5 * x_2 ) * x_3 ;
00655     
00656     return alp * ( x + a * f + b * g ) + bet - r ;
00657  
00658 }
00659 
00660 //****************************************************************************
00661 
00662 double fonc_invr_map_et_coq(double x, const Param& par) {
00663 
00664     double r = par.get_double(0) ;
00665     double f = par.get_double(1) ;
00666     double g = par.get_double(2) ;
00667     double alp = par.get_double(3) ;
00668     double bet = par.get_double(4) ;
00669     double xm1 = x - 1. ;
00670     double xp1 = x + 1. ;
00671     double a = 0.25* xm1 * xm1 * (x + 2.) ;
00672     double b = 0.25* xp1 * xp1 * (2. - x) ;
00673     
00674     return alp * ( x + a * f + b * g ) + bet - r ;
00675  
00676 }
00677        
00678 //****************************************************************************
00679 
00680 double fonc_invr_map_et_zec(double x, const Param& par) {
00681 
00682     double r = par.get_double(0) ;
00683     double f = par.get_double(1) ;
00684     double alp = par.get_double(3) ;
00685     double bet = par.get_double(4) ;
00686     double xm1 = x - 1. ;
00687     double a = 0.25* xm1 * xm1 * (x + 2.) ;
00688     
00689     return alp * ( x + a * f ) + bet - double(1) / r ;
00690  
00691 }
00692 

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