op_sx2.C

00001 /*
00002  *   Copyright (c) 1999-2000 Jean-Alain Marck
00003  *   Copyright (c) 1999-2001 Eric Gourgoulhon
00004  *   Copyright (c) 1999-2001 Philippe Grandclement
00005  *
00006  *   This file is part of LORENE.
00007  *
00008  *   LORENE is free software; you can redistribute it and/or modify
00009  *   it under the terms of the GNU General Public License as published by
00010  *   the Free Software Foundation; either version 2 of the License, or
00011  *   (at your option) any later version.
00012  *
00013  *   LORENE is distributed in the hope that it will be useful,
00014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  *   GNU General Public License for more details.
00017  *
00018  *   You should have received a copy of the GNU General Public License
00019  *   along with LORENE; if not, write to the Free Software
00020  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  */
00023 
00024 
00025 char op_sx2_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_sx2.C,v 1.2 2004/11/23 15:16:02 m_forot Exp $" ;
00026 
00027 /* 
00028  * Ensemble des routines de base de division par rapport a x
00029  * (Utilisation interne)
00030  * 
00031  *  void _sx2_XXXX(Tbl * t, int & b)
00032  *  t   pointeur sur le Tbl d'entree-sortie
00033  *  b   base spectrale
00034  * On entend par sx2 l'operateur:
00035  *
00036  *  --   {f(x) - f(0) - x f'(0)}/x^2        dans le noyau (cas RARE)
00037  *  --   Id                 dans les coquilles (cas FIN)
00038  *  --   {f(x) - f(1) - (x-1) f'(1)}/(x-1)^2    dans la zone externe compactifiee 
00039  *                      (cas UNSURR) 
00040  *
00041  */
00042 
00043 /*
00044  * $Id: op_sx2.C,v 1.2 2004/11/23 15:16:02 m_forot Exp $
00045  * $Log: op_sx2.C,v $
00046  * Revision 1.2  2004/11/23 15:16:02  m_forot
00047  *
00048  * Added the bases for the cases without any equatorial symmetry
00049  *  (T_COSSIN_C, T_COSSIN_S, T_LEG, R_CHEBPI_P, R_CHEBPI_I).
00050  *
00051  * Revision 1.1.1.1  2001/11/20 15:19:29  e_gourgoulhon
00052  * LORENE
00053  *
00054  * Revision 2.4  2000/09/07  12:51:34  phil
00055  * *** empty log message ***
00056  *
00057  * Revision 2.3  2000/02/24  16:43:06  eric
00058  * Initialisation a zero du tableau xo avant le calcul.
00059  *
00060  * Revision 2.2  1999/11/15  16:39:30  eric
00061  * Tbl::dim est desormais un Dim_tbl et non plus un Dim_tbl*.
00062  *
00063  *
00064  * $Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_sx2.C,v 1.2 2004/11/23 15:16:02 m_forot Exp $
00065  *
00066  */
00067 
00068 
00069 // Fichier includes
00070 #include "tbl.h" 
00071 #include "proto.h" 
00072 
00073 
00074 
00075         //-----------------------------------
00076         // Routine pour les cas non prevus --
00077         //-----------------------------------
00078 
00079 void _sx2_pas_prevu(Tbl * tb, int& base) {
00080     cout << "sx pas prevu..." << endl ;
00081     cout << "Tbl: " << tb << " base: " << base << endl ;
00082     abort () ;
00083     exit(-1) ;
00084 }
00085 
00086             //-------------
00087             // Identite ---
00088             //-------------
00089 
00090 void _sx2_identite(Tbl* , int& ) {
00091     return ;
00092 }
00093 
00094             //---------------
00095             // cas R_CHEBP --
00096             //--------------
00097 void _sx2_r_chebp(Tbl* tb, int&)
00098     {
00099     // Peut-etre rien a faire ?
00100     if (tb->get_etat() == ETATZERO) {
00101     return ;
00102     }
00103     
00104     // Pour le confort
00105     int nr = (tb->dim).dim[0] ;     // Nombre
00106     int nt = (tb->dim).dim[1] ;     //   de points
00107     int np = (tb->dim).dim[2] ;     //      physiques REELS
00108     np = np - 2 ;           // Nombre de points physiques
00109     
00110     // pt. sur le tableau de double resultat
00111     double* xo = new double [tb->get_taille()];
00112 
00113     // Initialisation a zero :
00114     for (int i=0; i<tb->get_taille(); i++) {
00115     xo[i] = 0 ; 
00116     }
00117     
00118     // On y va...
00119     double* xi = tb->t ;
00120     double* xci = xi ;  // Pointeurs
00121     double* xco = xo ;  //  courants
00122     
00123     for (int k=0 ; k<np+1 ; k++) 
00124     if (k==1) {
00125         xci += nr*nt ;
00126         xco += nr*nt ;
00127         }
00128         
00129     else {
00130     for (int j=0 ; j<nt ; j++) {
00131 
00132         double somp, somn ;
00133         int sgn = 1 ;
00134         
00135         xco[nr-1] = 0 ;
00136         somp = 4 * sgn * (nr-1) * xci[nr-1] ;
00137         somn = 2 * sgn * xci[nr-1] ;
00138         xco[nr-2] = somp - 2*(nr-2)*somn ;
00139         for (int i = nr-3 ; i >= 0 ; i-- ) {
00140         sgn = - sgn ;
00141         somp += 4 * (i+1) * sgn * xci[i+1] ;
00142         somn += 2 * sgn * xci[i+1] ;
00143         xco[i] = somp - 2*i * somn ;
00144         }   // Fin de la premiere boucle sur r
00145         for (int i=0 ; i<nr ; i+=2) {
00146         xco[i] = -xco[i] ;
00147         }   // Fin de la deuxieme boucle sur r
00148         xco[0] *= .5 ;
00149         
00150         xci += nr ;
00151         xco += nr ;
00152     }   // Fin de la boucle sur theta
00153     }   // Fin de la boucle sur phi
00154     
00155     // On remet les choses la ou il faut
00156     delete [] tb->t ;
00157     tb->t = xo ;
00158     
00159     // base de developpement
00160     // inchangee
00161 }
00162 
00163             //----------------
00164             // cas R_CHEBI ---
00165             //----------------
00166 
00167 void _sx2_r_chebi(Tbl* tb, int&)
00168 {
00169 
00170     // Peut-etre rien a faire ?
00171     if (tb->get_etat() == ETATZERO) {
00172     return ;
00173     }
00174     
00175     // Pour le confort
00176     int nr = (tb->dim).dim[0] ;     // Nombre
00177     int nt = (tb->dim).dim[1] ;     //   de points
00178     int np = (tb->dim).dim[2] ;     //      physiques REELS
00179     np = np - 2 ;           // Nombre de points physiques
00180     
00181     // pt. sur le tableau de double resultat
00182     double* xo = new double [tb->get_taille()];
00183      
00184     // Initialisation a zero :
00185     for (int i=0; i<tb->get_taille(); i++) {
00186     xo[i] = 0 ; 
00187     }
00188     
00189     // On y va...
00190     double* xi = tb->t ;
00191     double* xci = xi ;  // Pointeurs
00192     double* xco = xo ;  //  courants
00193     
00194     for (int k=0 ; k<np+1 ; k++) 
00195     if (k==1) {
00196         xci += nr*nt ;
00197         xco += nr*nt ;
00198         }
00199     else {
00200     for (int j=0 ; j<nt ; j++) {
00201 
00202         double somp, somn ;
00203         int sgn = 1 ;
00204         
00205         xco[nr-1] = 0 ;
00206         somp = 2 * sgn * (2*(nr-1)+1) * xci[nr-1] ;
00207         somn = 2 * sgn * xci[nr-1] ;
00208         xco[nr-2] = somp - (2*(nr-2)+1)*somn ;
00209         for (int i = nr-3 ; i >= 0 ; i-- ) {
00210         sgn = - sgn ;
00211         somp += 2 * (2*(i+1)+1) * sgn * xci[i+1] ;
00212         somn += 2 * sgn * xci[i+1] ;
00213         xco[i] = somp - (2*i+1) * somn ;
00214         }   // Fin de la premiere boucle sur r
00215         for (int i=0 ; i<nr ; i+=2) {
00216         xco[i] = -xco[i] ;
00217         }   // Fin de la deuxieme boucle sur r
00218         
00219         xci += nr ;
00220         xco += nr ;
00221     }   // Fin de la boucle sur theta
00222     }   // Fin de la boucle sur phi
00223     
00224     // On remet les choses la ou il faut
00225     delete [] tb->t;
00226     tb->t = xo ;
00227     
00228     // base de developpement
00229     // inchangee
00230 }
00231 
00232             //--------------------
00233             // cas R_CHEBPIM_P --
00234             //------------------
00235 
00236 void _sx2_r_chebpim_p(Tbl* tb, int&)
00237 {
00238   
00239     // Peut-etre rien a faire ?
00240     if (tb->get_etat() == ETATZERO) {
00241     return ;
00242     }
00243     
00244     // Pour le confort
00245     int nr = (tb->dim).dim[0] ;     // Nombre
00246     int nt = (tb->dim).dim[1] ;     //   de points
00247     int np = (tb->dim).dim[2] ;     //      physiques REELS
00248     np = np - 2 ;          
00249    
00250     // pt. sur le tableau de double resultat
00251     double* xo = new double [tb->get_taille()];
00252         
00253     // Initialisation a zero :
00254     for (int i=0; i<tb->get_taille(); i++) {
00255     xo[i] = 0 ; 
00256     }
00257     
00258     // On y va...
00259     double* xi = tb->t ;
00260     double* xci ;   // Pointeurs
00261     double* xco ;   //  courants
00262     int auxiliaire ;
00263     
00264     // Partie paire
00265     xci = xi ;
00266     xco = xo ;
00267     for (int k=0 ; k<np+1 ; k += 4) {
00268     auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00269     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00270     
00271         // On evite le coefficient de sin (0*phi)
00272     if ((k==0) && (kmod==1)) { 
00273         xco += nr*nt ;
00274         xci += nr*nt ;
00275         }
00276         
00277     else   
00278         for (int j=0 ; j<nt ; j++) {
00279 
00280         double somp, somn ;
00281         int sgn = 1 ;
00282         
00283         xco[nr-1] = 0 ;
00284         somp = 4 * sgn * (nr-1) * xci[nr-1] ;
00285         somn = 2 * sgn * xci[nr-1] ;
00286         xco[nr-2] = somp - 2*(nr-2)*somn ;
00287         for (int i = nr-3 ; i >= 0 ; i-- ) {
00288             sgn = - sgn ;
00289             somp += 4 * (i+1) * sgn * xci[i+1] ;
00290             somn += 2 * sgn * xci[i+1] ;
00291             xco[i] = somp - 2*i * somn ;
00292         }   // Fin de la premiere boucle sur r
00293         for (int i=0 ; i<nr ; i+=2) {
00294             xco[i] = -xco[i] ;
00295         }   // Fin de la deuxieme boucle sur r
00296         xco[0] *= .5 ;
00297         
00298         xci += nr ; // au
00299         xco += nr ; //  suivant
00300         }   // Fin de la boucle sur theta
00301     }   // Fin de la boucle sur kmod
00302     xci += 2*nr*nt ;    // saute
00303     xco += 2*nr*nt ;    //  2 phis
00304     }   // Fin de la boucle sur phi
00305 
00306     // Partie impaire
00307     xci = xi + 2*nr*nt ;
00308     xco = xo + 2*nr*nt ;
00309     for (int k=2 ; k<np+1 ; k += 4) {
00310     
00311     auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00312     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00313         for (int j=0 ; j<nt ; j++) {
00314 
00315         double somp, somn ;
00316         int sgn = 1 ;
00317         
00318         xco[nr-1] = 0 ;
00319         somp = 2 * sgn * (2*(nr-1)+1) * xci[nr-1] ;
00320         somn = 2 * sgn * xci[nr-1] ;
00321         xco[nr-2] = somp - (2*(nr-2)+1)*somn ;
00322         for (int i = nr-3 ; i >= 0 ; i-- ) {
00323             sgn = - sgn ;
00324             somp += 2 * (2*(i+1)+1) * sgn * xci[i+1] ;
00325             somn += 2 * sgn * xci[i+1] ;
00326             xco[i] = somp - (2*i+1) * somn ;
00327         }   // Fin de la premiere boucle sur r
00328         for (int i=0 ; i<nr ; i+=2) {
00329             xco[i] = -xco[i] ;
00330         }   // Fin de la deuxieme boucle sur r
00331         
00332         xci += nr ;
00333         xco += nr ;
00334     }   // Fin de la boucle sur theta
00335     }   // Fin de la boucle sur kmod
00336     xci += 2*nr*nt ;
00337     xco += 2*nr*nt ;
00338     }   // Fin de la boucle sur phi
00339     
00340     // On remet les choses la ou il faut
00341     delete [] tb->t ;
00342     tb->t = xo ;
00343     
00344     // base de developpement
00345     // inchangee
00346 }
00347 
00348 
00349             //-------------------
00350             // cas R_CHEBPIM_I --
00351             //-------------------
00352 
00353 void _sx2_r_chebpim_i(Tbl* tb, int&)
00354 {
00355 
00356    // Peut-etre rien a faire ?
00357     if (tb->get_etat() == ETATZERO) {
00358     return ;
00359     }
00360     
00361     // Pour le confort
00362     int nr = (tb->dim).dim[0] ;     // Nombre
00363     int nt = (tb->dim).dim[1] ;     //   de points
00364     int np = (tb->dim).dim[2] ;     //      physiques REELS
00365     np = np - 2 ;          
00366    
00367     // pt. sur le tableau de double resultat
00368     double* xo = new double [tb->get_taille()];
00369         
00370     // Initialisation a zero :
00371     for (int i=0; i<tb->get_taille(); i++) {
00372     xo[i] = 0 ; 
00373     }
00374     
00375     // On y va...
00376     double* xi = tb->t ;
00377     double* xci ;   // Pointeurs
00378     double* xco ;   //  courants
00379     int auxiliaire ;
00380     
00381     // Partie impaire
00382     xci = xi ;
00383     xco = xo ;
00384     for (int k=0 ; k<np+1 ; k += 4) {
00385     
00386     auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00387     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00388         
00389         
00390         // On evite le sin (0*phi)
00391     
00392     if ((k==0) && (kmod == 1)) { 
00393         xco += nr*nt ;
00394         xci += nr*nt ;
00395         }
00396         
00397     else 
00398         for (int j=0 ; j<nt ; j++) {
00399 
00400         double somp, somn ;
00401         int sgn = 1 ;
00402         
00403         xco[nr-1] = 0 ;
00404         somp = 2 * sgn * (2*(nr-1)+1) * xci[nr-1] ;
00405         somn = 2 * sgn * xci[nr-1] ;
00406         xco[nr-2] = somp - (2*(nr-2)+1)*somn ;
00407         for (int i = nr-3 ; i >= 0 ; i-- ) {
00408             sgn = - sgn ;
00409             somp += 2 * (2*(i+1)+1) * sgn * xci[i+1] ;
00410             somn += 2 * sgn * xci[i+1] ;
00411             xco[i] = somp - (2*i+1) * somn ;
00412         }   // Fin de la premiere boucle sur r
00413         for (int i=0 ; i<nr ; i+=2) {
00414             xco[i] = -xco[i] ;
00415         }   // Fin de la deuxieme boucle sur r
00416         
00417         xci += nr ;
00418         xco += nr ;
00419         }   // Fin de la boucle sur theta
00420     }   // Fin de la boucle sur kmod
00421     xci += 2*nr*nt ;
00422     xco += 2*nr*nt ;
00423     }   // Fin de la boucle sur phi
00424 
00425     // Partie paire
00426     xci = xi + 2*nr*nt ;
00427     xco = xo + 2*nr*nt ;
00428     for (int k=2 ; k<np+1 ; k += 4) {
00429     
00430     auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00431     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00432         for (int j=0 ; j<nt ; j++) {
00433 
00434         double somp, somn ;
00435         int sgn = 1 ;
00436         
00437         xco[nr-1] = 0 ;
00438         somp = 4 * sgn * (nr-1) * xci[nr-1] ;
00439         somn = 2 * sgn * xci[nr-1] ;
00440         xco[nr-2] = somp - 2*(nr-2)*somn ;
00441         for (int i = nr-3 ; i >= 0 ; i-- ) {
00442             sgn = - sgn ;
00443             somp += 4 * (i+1) * sgn * xci[i+1] ;
00444             somn += 2 * sgn * xci[i+1] ;
00445             xco[i] = somp - 2*i * somn ;
00446         }   // Fin de la premiere boucle sur r
00447         for (int i=0 ; i<nr ; i+=2) {
00448             xco[i] = -xco[i] ;
00449         }   // Fin de la deuxieme boucle sur r
00450         xco[0] *= .5 ;
00451         
00452         xci += nr ;
00453         xco += nr ;
00454     }   // Fin de la boucle sur theta
00455     }   // Fin de la boucle sur kmod
00456     xci += 2*nr*nt ;
00457     xco += 2*nr*nt ;
00458     }   // Fin de la boucle sur phi
00459     
00460     // On remet les choses la ou il faut
00461     delete [] tb->t ;
00462     tb->t = xo ;
00463     
00464     // base de developpement
00465     // inchangee
00466 }
00467 
00468             //---------------
00469             // cas R_CHEBU --
00470             //---------------
00471 
00472 void _sx2_r_chebu(Tbl* tb, int&)
00473 {
00474     // Peut-etre rien a faire ?
00475     if (tb->get_etat() == ETATZERO) {
00476     return ;
00477     }
00478     
00479     // Pour le confort
00480     int nr = (tb->dim).dim[0] ;     // Nombre
00481     int nt = (tb->dim).dim[1] ;     //   de points
00482     int np = (tb->dim).dim[2] ;     //      physiques REELS
00483     np = np - 2 ;          
00484       
00485     int ntnr = nt*nr ; 
00486     
00487     for (int k=0 ; k<np+1 ; k++) {
00488     if (k==1) continue ;    // On ne traite pas le coefficient de sin(0*phi) 
00489     for (int j=0 ; j<nt ; j++) {
00490     
00491         double* cf = tb->t + k*ntnr + j*nr ;
00492         sxm1_1d_cheb(nr, cf) ;  // 1ere division par (x-1)
00493         sxm1_1d_cheb(nr, cf) ;  // 2eme division par (x-1) 
00494         
00495     }   // Fin de la boucle sur theta
00496     }   // Fin de la boucle sur phi
00497     
00498     // base de developpement
00499     // inchangee
00500 }
00501 
00502             //---------------
00503             // cas R_CHEBPI_P --
00504             //--------------
00505 void _sx2_r_chebpi_p(Tbl* tb, int&)
00506     {
00507     // Peut-etre rien a faire ?
00508     if (tb->get_etat() == ETATZERO) {
00509     return ;
00510     }
00511     
00512     // Pour le confort
00513     int nr = (tb->dim).dim[0] ;     // Nombre
00514     int nt = (tb->dim).dim[1] ;     //   de points
00515     int np = (tb->dim).dim[2] ;     //      physiques REELS
00516     np = np - 2 ;           // Nombre de points physiques
00517     
00518     // pt. sur le tableau de double resultat
00519     double* xo = new double [tb->get_taille()];
00520 
00521     // Initialisation a zero :
00522     for (int i=0; i<tb->get_taille(); i++) {
00523     xo[i] = 0 ; 
00524     }
00525     
00526     // On y va...
00527     double* xi = tb->t ;
00528     double* xci = xi ;  // Pointeurs
00529     double* xco = xo ;  //  courants
00530     
00531     for (int k=0 ; k<np+1 ; k++) 
00532     if (k==1) {
00533         xci += nr*nt ;
00534         xco += nr*nt ;
00535         }
00536         
00537     else {
00538     for (int j=0 ; j<nt ; j++) {
00539         int l = j%2 ;
00540         if(l==0){
00541           double somp, somn ;
00542           int sgn = 1 ;
00543           
00544           xco[nr-1] = 0 ;
00545           somp = 4 * sgn * (nr-1) * xci[nr-1] ;
00546           somn = 2 * sgn * xci[nr-1] ;
00547           xco[nr-2] = somp - 2*(nr-2)*somn ;
00548           for (int i = nr-3 ; i >= 0 ; i-- ) {
00549         sgn = - sgn ;
00550         somp += 4 * (i+1) * sgn * xci[i+1] ;
00551         somn += 2 * sgn * xci[i+1] ;
00552         xco[i] = somp - 2*i * somn ;
00553           } // Fin de la premiere boucle sur r
00554           for (int i=0 ; i<nr ; i+=2) {
00555         xco[i] = -xco[i] ;
00556           } // Fin de la deuxieme boucle sur r
00557           xco[0] *= .5 ;
00558         } else {
00559           double somp, somn ;
00560           int sgn = 1 ;
00561           
00562           xco[nr-1] = 0 ;
00563           somp = 2 * sgn * (2*(nr-1)+1) * xci[nr-1] ;
00564           somn = 2 * sgn * xci[nr-1] ;
00565           xco[nr-2] = somp - (2*(nr-2)+1)*somn ;
00566           for (int i = nr-3 ; i >= 0 ; i-- ) {
00567         sgn = - sgn ;
00568         somp += 2 * (2*(i+1)+1) * sgn * xci[i+1] ;
00569         somn += 2 * sgn * xci[i+1] ;
00570         xco[i] = somp - (2*i+1) * somn ;
00571           } // Fin de la premiere boucle sur r
00572           for (int i=0 ; i<nr ; i+=2) {
00573         xco[i] = -xco[i] ;
00574           } // Fin de la deuxieme boucle sur r
00575         }
00576         xci += nr ;
00577         xco += nr ;
00578     }   // Fin de la boucle sur theta
00579     }   // Fin de la boucle sur phi
00580     
00581     // On remet les choses la ou il faut
00582     delete [] tb->t ;
00583     tb->t = xo ;
00584     
00585     // base de developpement
00586     // inchangee
00587 }
00588 
00589             //----------------
00590             // cas R_CHEBPI_I ---
00591             //----------------
00592 
00593 void _sx2_r_chebpi_i(Tbl* tb, int&)
00594 {
00595 
00596     // Peut-etre rien a faire ?
00597     if (tb->get_etat() == ETATZERO) {
00598     return ;
00599     }
00600     
00601     // Pour le confort
00602     int nr = (tb->dim).dim[0] ;     // Nombre
00603     int nt = (tb->dim).dim[1] ;     //   de points
00604     int np = (tb->dim).dim[2] ;     //      physiques REELS
00605     np = np - 2 ;           // Nombre de points physiques
00606     
00607     // pt. sur le tableau de double resultat
00608     double* xo = new double [tb->get_taille()];
00609      
00610     // Initialisation a zero :
00611     for (int i=0; i<tb->get_taille(); i++) {
00612     xo[i] = 0 ; 
00613     }
00614     
00615     // On y va...
00616     double* xi = tb->t ;
00617     double* xci = xi ;  // Pointeurs
00618     double* xco = xo ;  //  courants
00619     
00620     for (int k=0 ; k<np+1 ; k++) 
00621     if (k==1) {
00622         xci += nr*nt ;
00623         xco += nr*nt ;
00624         }
00625     else {
00626     for (int j=0 ; j<nt ; j++) {
00627         int l = j%2 ;
00628         if(l==1){
00629           double somp, somn ;
00630           int sgn = 1 ;
00631           
00632           xco[nr-1] = 0 ;
00633           somp = 4 * sgn * (nr-1) * xci[nr-1] ;
00634           somn = 2 * sgn * xci[nr-1] ;
00635           xco[nr-2] = somp - 2*(nr-2)*somn ;
00636           for (int i = nr-3 ; i >= 0 ; i-- ) {
00637         sgn = - sgn ;
00638         somp += 4 * (i+1) * sgn * xci[i+1] ;
00639         somn += 2 * sgn * xci[i+1] ;
00640         xco[i] = somp - 2*i * somn ;
00641           } // Fin de la premiere boucle sur r
00642           for (int i=0 ; i<nr ; i+=2) {
00643         xco[i] = -xco[i] ;
00644           } // Fin de la deuxieme boucle sur r
00645           xco[0] *= .5 ;
00646         } else {
00647           double somp, somn ;
00648           int sgn = 1 ;
00649           
00650           xco[nr-1] = 0 ;
00651           somp = 2 * sgn * (2*(nr-1)+1) * xci[nr-1] ;
00652           somn = 2 * sgn * xci[nr-1] ;
00653           xco[nr-2] = somp - (2*(nr-2)+1)*somn ;
00654           for (int i = nr-3 ; i >= 0 ; i-- ) {
00655         sgn = - sgn ;
00656         somp += 2 * (2*(i+1)+1) * sgn * xci[i+1] ;
00657         somn += 2 * sgn * xci[i+1] ;
00658         xco[i] = somp - (2*i+1) * somn ;
00659           } // Fin de la premiere boucle sur r
00660           for (int i=0 ; i<nr ; i+=2) {
00661         xco[i] = -xco[i] ;
00662           } // Fin de la deuxieme boucle sur r
00663         }
00664         xci += nr ;
00665         xco += nr ;
00666     }   // Fin de la boucle sur theta
00667     }   // Fin de la boucle sur phi
00668     
00669     // On remet les choses la ou il faut
00670     delete [] tb->t;
00671     tb->t = xo ;
00672     
00673     // base de developpement
00674     // inchangee
00675 }
00676 

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