op_dsdx.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_dsdx_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_dsdx.C,v 1.6 2007/12/21 13:59:02 j_novak Exp $" ;
00026 
00027 /* 
00028  * Ensemble des routines de base de derivation par rapport a r
00029  * (Utilisation interne)
00030  * 
00031  *  void _dsdx_XXXX(Tbl * t, int & b)
00032  *  t   pointeur sur le Tbl d'entree-sortie
00033  *  b   base spectrale
00034  * 
00035  */
00036 
00037 /*
00038  * $Id: op_dsdx.C,v 1.6 2007/12/21 13:59:02 j_novak Exp $
00039  * $Log: op_dsdx.C,v $
00040  * Revision 1.6  2007/12/21 13:59:02  j_novak
00041  * Suppression of call to pow(-1, something).
00042  *
00043  * Revision 1.5  2007/12/20 09:11:08  jl_cornou
00044  * Correction of an error in op_sxpun about Jacobi(0,2) polynomials
00045  *
00046  * Revision 1.4  2007/12/11 15:28:18  jl_cornou
00047  * Jacobi(0,2) polynomials partially implemented
00048  *
00049  * Revision 1.3  2006/05/17 13:15:18  j_novak
00050  * Added a test for the pure angular grid case (nr=1), in the shell.
00051  *
00052  * Revision 1.2  2004/11/23 15:16:01  m_forot
00053  *
00054  * Added the bases for the cases without any equatorial symmetry
00055  *  (T_COSSIN_C, T_COSSIN_S, T_LEG, R_CHEBPI_P, R_CHEBPI_I).
00056  *
00057  * Revision 1.1.1.1  2001/11/20 15:19:29  e_gourgoulhon
00058  * LORENE
00059  *
00060  * Revision 2.6  2000/09/07  12:49:04  phil
00061  * *** empty log message ***
00062  *
00063  * Revision 2.5  2000/02/24  16:41:25  eric
00064  * Initialisation a zero du tableau xo avant le calcul.
00065  *
00066  * Revision 2.4  1999/11/15  16:38:26  eric
00067  * Tbl::dim est desormais un Dim_tbl et non plus un Dim_tbl*.
00068  *
00069  * Revision 2.3  1999/09/13  11:31:49  phil
00070  * gestion des cas k==1 et k==np+1\
00071  *
00072  * Revision 2.2  1999/02/22  17:25:15  hyc
00073  * *** empty log message ***
00074  *
00075  * Revision 2.1  1999/02/22  16:17:36  hyc
00076  * *** empty log message ***
00077  *
00078  * $Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_dsdx.C,v 1.6 2007/12/21 13:59:02 j_novak Exp $
00079  *
00080  */
00081 
00082 // Fichier includes
00083 #include "tbl.h"
00084 #include <math.h>
00085 
00086 // Routine pour les cas non prevus
00087 //--------------------------------
00088 void _dsdx_pas_prevu(Tbl* , int & b) {
00089     cout << "dsdx pas prevu..." << endl ;
00090     cout << " base: " << b << endl ;
00091     abort () ;
00092 }
00093 
00094 // cas R_CHEB
00095 //-----------
00096 void _dsdx_r_cheb(Tbl *tb, int & )
00097 {
00098 
00099     // Peut-etre rien a faire ?
00100     if (tb->get_etat() == ETATZERO) {
00101     return ;
00102     }
00103     
00104     // Protection
00105     assert(tb->get_etat() == ETATQCQ) ;
00106     
00107     // Pour le confort
00108     int nr = (tb->dim).dim[0] ;     // Nombre
00109     int nt = (tb->dim).dim[1] ;     //   de points
00110     int np = (tb->dim).dim[2] ;     //      physiques REELS
00111     np = np - 2 ;           // Nombre de points physiques
00112     
00113     // pt. sur le tableau de double resultat
00114     double* xo = new double[(tb->dim).taille] ;
00115     
00116     // Initialisation a zero :
00117     for (int i=0; i<(tb->dim).taille; i++) {
00118     xo[i] = 0 ; 
00119     }
00120     if (nr > 2) { // If not an angular grid...
00121     // On y va...
00122     double* xi = tb->t ;
00123     double* xci = xi ;  // Pointeurs
00124     double* xco = xo ;  //  courants
00125     
00126     int borne_phi = np + 1 ; 
00127     if (np == 1) borne_phi = 1 ; 
00128     
00129     for (int k=0 ; k< borne_phi ; k++)
00130         // On evite le coefficient de sin(0*phi)
00131         if (k==1) {
00132         xci += nr*nt ;
00133         xco += nr*nt ;
00134         }
00135         else {
00136         for (int j=0 ; j<nt ; j++) {
00137             
00138             double som ;
00139             
00140             xco[nr-1] = 0 ;
00141             som = 2*(nr-1) * xci[nr-1] ;
00142             xco[nr-2] = som ;
00143             for (int i = nr-4 ; i >= 0 ; i -= 2 ) {
00144             som += 2*(i+1) * xci[i+1] ;
00145             xco[i] = som ;
00146             }   // Fin de la premiere boucle sur r
00147             som = 2*(nr-2) * xci[nr-2] ;
00148             xco[nr-3] = som ;
00149             for (int i = nr-5 ; i >= 0 ; i -= 2 ) {
00150             som += 2*(i+1) * xci[i+1] ;
00151             xco[i] = som ;
00152             }   // Fin de la deuxieme boucle sur r
00153             xco[0] *= .5 ;
00154             
00155             xci += nr ;
00156             xco += nr ;
00157         }   // Fin de la boucle sur theta
00158         }   // Fin de la boucle sur phi
00159     }
00160     // On remet les choses la ou il faut
00161     delete [] tb->t ;
00162     tb->t = xo ;
00163     
00164     // base de developpement
00165     // inchangee
00166 }
00167 
00168 // cas R_CHEBU
00169 //------------
00170 void _dsdx_r_chebu(Tbl *tb, int & )
00171 {
00172 
00173     // Peut-etre rien a faire ?
00174     if (tb->get_etat() == ETATZERO) {
00175     return ;
00176     }
00177     
00178     // Protection
00179     assert(tb->get_etat() == ETATQCQ) ;
00180     
00181     // Pour le confort
00182     int nr = (tb->dim).dim[0] ;     // Nombre
00183     int nt = (tb->dim).dim[1] ;     //   de points
00184     int np = (tb->dim).dim[2] ;     //      physiques REELS
00185     np = np - 2 ;           // Nombre de points physiques
00186     
00187     // pt. sur le tableau de double resultat
00188     double* xo = new double[(tb->dim).taille] ;
00189     
00190     // Initialisation a zero :
00191     for (int i=0; i<(tb->dim).taille; i++) {
00192     xo[i] = 0 ; 
00193     }
00194     
00195     // On y va...
00196     double* xi = tb->t ;
00197     double* xci = xi ;  // Pointeurs
00198     double* xco = xo ;  //  courants
00199     
00200     int borne_phi = np + 1 ; 
00201     if (np == 1) borne_phi = 1 ; 
00202     
00203     for (int k=0 ; k< borne_phi ; k++)
00204     
00205     // On evite le coefficient de sin(0*phi)
00206     if (k==1) {
00207         xci += nr*nt ;
00208         xco += nr*nt ;
00209     }
00210     
00211     else { 
00212     for (int j=0 ; j<nt ; j++) {
00213 
00214         double som ;
00215         
00216         xco[nr-1] = 0 ;
00217         som = 2*(nr-1) * xci[nr-1] ;
00218         xco[nr-2] = som ;
00219         for (int i = nr-4 ; i >= 0 ; i -= 2 ) {
00220         som += 2*(i+1) * xci[i+1] ;
00221         xco[i] = som ;
00222         }   // Fin de la premiere boucle sur r
00223         som = 2*(nr-2) * xci[nr-2] ;
00224         xco[nr-3] = som ;
00225         for (int i = nr-5 ; i >= 0 ; i -= 2 ) {
00226         som += 2*(i+1) * xci[i+1] ;
00227         xco[i] = som ;
00228         }   // Fin de la deuxieme boucle sur r
00229         xco[0] *= .5 ;
00230         
00231         xci += nr ;
00232         xco += nr ;
00233     }   // Fin de la boucle sur theta
00234     }   // Fin de la boucle sur phi
00235     
00236     // On remet les choses la ou il faut
00237     delete [] tb->t ;
00238     tb->t = xo ;
00239     
00240     // base de developpement
00241     // inchangee
00242 }
00243 
00244 // cas R_CHEBP
00245 //------------
00246 void _dsdx_r_chebp(Tbl *tb, int & b)
00247 {
00248 
00249     // Peut-etre rien a faire ?
00250     if (tb->get_etat() == ETATZERO) {
00251     int base_t = b & MSQ_T ;
00252     int base_p = b & MSQ_P ;
00253     b = base_p | base_t | R_CHEBI ;
00254     return ;
00255     }
00256     
00257     // Protection
00258     assert(tb->get_etat() == ETATQCQ) ;
00259     
00260     // Pour le confort
00261     int nr = (tb->dim).dim[0] ;     // Nombre
00262     int nt = (tb->dim).dim[1] ;     //   de points
00263     int np = (tb->dim).dim[2] ;     //      physiques REELS
00264     np = np - 2 ;           // Nombre de points physiques
00265     
00266     // pt. sur le tableau de double resultat
00267     double* xo = new double[(tb->dim).taille] ;
00268     
00269     // Initialisation a zero :
00270     for (int i=0; i<(tb->dim).taille; i++) {
00271     xo[i] = 0 ; 
00272     }
00273     
00274     // On y va...
00275     double* xi = tb->t ;
00276     double* xci = xi ;  // Pointeurs
00277     double* xco = xo ;  //  courants
00278     
00279     int borne_phi = np + 1 ; 
00280     if (np == 1) borne_phi = 1 ; 
00281     
00282     for (int k=0 ; k< borne_phi ; k++)
00283     
00284     // On evite le coefficient de sin(0*phi)
00285     
00286     if (k==1) {
00287         xco += nr*nt ;
00288         xci += nr*nt ;
00289         }
00290         
00291          
00292     else {
00293     for (int j=0 ; j<nt ; j++) {
00294 
00295         double som ;
00296         
00297         xco[nr-1] = 0 ;
00298         som = 4*(nr-1) * xci[nr-1] ;
00299         xco[nr-2] = som ;
00300         for (int i = nr-3 ; i >= 0 ; i-- ) {
00301         som += 4*(i+1) * xci[i+1] ;
00302         xco[i] = som ;
00303         }   // Fin de la boucle sur r
00304         
00305         xci += nr ;
00306         xco += nr ;
00307     }   // Fin de la boucle sur theta
00308     }   // Fin de la boucle sur phi
00309     
00310     // On remet les choses la ou il faut
00311     delete [] tb->t ;
00312     tb->t = xo ;
00313     
00314     // base de developpement
00315     // pair -> impair
00316     int base_t = b & MSQ_T ;
00317     int base_p = b & MSQ_P ;
00318     b = base_p | base_t | R_CHEBI ;
00319 }
00320 
00321 // cas R_CHEBI
00322 //------------
00323 void _dsdx_r_chebi(Tbl *tb, int & b)
00324 {
00325 
00326     // Peut-etre rien a faire ?
00327     if (tb->get_etat() == ETATZERO) {
00328     int base_t = b & MSQ_T ;
00329     int base_p = b & MSQ_P ;
00330     b = base_p | base_t | R_CHEBP ;
00331     return ;
00332     }
00333     
00334     // Protection
00335     assert(tb->get_etat() == ETATQCQ) ;
00336     
00337     // Pour le confort
00338     int nr = (tb->dim).dim[0] ;     // Nombre
00339     int nt = (tb->dim).dim[1] ;     //   de points
00340     int np = (tb->dim).dim[2] ;     //      physiques REELS
00341     np = np - 2 ;           // Nombre de points physiques
00342     
00343     // pt. sur le tableau de double resultat
00344     double* xo = new double[(tb->dim).taille] ;
00345     
00346     // Initialisation a zero :
00347     for (int i=0; i<(tb->dim).taille; i++) {
00348     xo[i] = 0 ; 
00349     }
00350     
00351     // On y va...
00352     double* xi = tb->t ;
00353     double* xci = xi ;  // Pointeurs
00354     double* xco = xo ;  //  courants
00355     
00356     int borne_phi = np + 1 ; 
00357     if (np == 1) borne_phi = 1 ; 
00358     
00359     for (int k=0 ; k< borne_phi ; k++)
00360     // On evite le coefficient de sin(0*phi)
00361     if (k==1) {
00362         xci += nr*nt ;
00363         xco += nr*nt ;
00364     }
00365     
00366     else {
00367     for (int j=0 ; j<nt ; j++) {
00368 
00369         double som ;
00370         
00371         xco[nr-1] = 0 ;
00372         som = 2*(2*nr-3) * xci[nr-2] ;
00373         xco[nr-2] = som ;
00374         for (int i = nr-3 ; i >= 0 ; i-- ) {
00375         som += 2*(2*i+1) * xci[i] ;
00376         xco[i] = som ;
00377         }   // Fin de la boucle sur r
00378         xco[0] *= .5 ;
00379         
00380         xci += nr ;
00381         xco += nr ;
00382     }   // Fin de la boucle sur theta
00383     }   // Fin de la boucle sur phi
00384     
00385     // On remet les choses la ou il faut
00386     delete [] tb->t ;
00387     tb->t = xo ;
00388     
00389     // base de developpement
00390     // impair -> pair
00391     int base_t = b & MSQ_T ;
00392     int base_p = b & MSQ_P ;
00393     b = base_p | base_t | R_CHEBP ;
00394 }
00395 
00396 // cas R_CHEBPIM_P
00397 //----------------
00398 void _dsdx_r_chebpim_p(Tbl *tb, int & b)
00399 {
00400 
00401     // Peut-etre rien a faire ?
00402     if (tb->get_etat() == ETATZERO) {
00403     int base_t = b & MSQ_T ;
00404     int base_p = b & MSQ_P ;
00405     b = base_p | base_t | R_CHEBPIM_I ;
00406     return ;
00407     }
00408     
00409     // Pour le confort
00410     int nr = (tb->dim).dim[0] ;     // Nombre
00411     int nt = (tb->dim).dim[1] ;     //   de points
00412     int np = (tb->dim).dim[2] ;     //      physiques REELS
00413     np = np - 2 ;           // Nombre de points physiques
00414     
00415     // pt. sur le tableau de double resultat
00416     double* xo = new double[(tb->dim).taille] ;
00417     
00418     // Initialisation a zero :
00419     for (int i=0; i<(tb->dim).taille; i++) {
00420     xo[i] = 0 ; 
00421     }
00422     
00423     // On y va...
00424     double* xi = tb->t ;
00425     double* xci ;   // Pointeurs
00426     double* xco ;   //  courants
00427     
00428     int auxiliaire ;
00429     // Partie paire
00430     xci = xi ;
00431     xco = xo ;
00432     for (int k=0 ; k<np+1 ; k += 4) {
00433     auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00434     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00435         
00436         
00437         // On evite le sin (0*phi)
00438     
00439     if ((k==0) && (kmod == 1)) { 
00440         xco += nr*nt ;
00441         xci += nr*nt ;
00442         }
00443         
00444     else 
00445         
00446         for (int j=0 ; j<nt ; j++) {
00447 
00448         double som ;
00449         
00450         xco[nr-1] = 0 ;
00451         som = 4*(nr-1) * xci[nr-1] ;
00452         xco[nr-2] = som ;
00453         for (int i = nr-3 ; i >= 0 ; i-- ) {
00454             som += 4*(i+1) * xci[i+1] ;
00455             xco[i] = som ;
00456         }   // Fin de la boucle sur r
00457         
00458         xci += nr ; // au
00459         xco += nr ; //  suivant
00460         }   // Fin de la boucle sur theta
00461     }   // Fin de la boucle sur kmod
00462     xci += 2*nr*nt ;    // saute
00463     xco += 2*nr*nt ;    //  2 phis
00464     }   // Fin de la boucle sur phi
00465 
00466     // Partie impaire
00467     xci = xi + 2*nr*nt ;
00468     xco = xo + 2*nr*nt ;
00469     for (int k=2 ; k<np+1 ; k += 4) {
00470     auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00471     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00472         for (int j=0 ; j<nt ; j++) {
00473 
00474         double som ;
00475 
00476         xco[nr-1] = 0 ;
00477         som = 2*(2*nr-3) * xci[nr-2] ;
00478         xco[nr-2] = som ;
00479         for (int i = nr-3 ; i >= 0 ; i-- ) {
00480             som += 2*(2*i+1) * xci[i] ;
00481             xco[i] = som ;
00482         }   // Fin de la boucle sur r
00483         xco[0] *= .5 ;
00484         
00485         xci += nr ;
00486         xco += nr ;
00487     }   // Fin de la boucle sur theta
00488     }   // Fin de la boucle sur kmod
00489     xci += 2*nr*nt ;
00490     xco += 2*nr*nt ;
00491     }   // Fin de la boucle sur phi
00492     
00493     // On remet les choses la ou il faut
00494     delete [] tb->t ;
00495     tb->t = xo ;
00496     
00497     // base de developpement
00498     // (pair,impair) -> (impair,pair)
00499     int base_t = b & MSQ_T ;
00500     int base_p = b & MSQ_P ;
00501     b = base_p | base_t | R_CHEBPIM_I ;
00502 }
00503 
00504 // cas R_CHEBPIM_I
00505 //----------------
00506 void _dsdx_r_chebpim_i(Tbl *tb, int & b)
00507 {
00508 
00509     // Peut-etre rien a faire ?
00510     if (tb->get_etat() == ETATZERO) {
00511     int base_t = b & MSQ_T ;
00512     int base_p = b & MSQ_P ;
00513     b = base_p | base_t | R_CHEBPIM_P ;
00514     return ;
00515     }
00516     
00517     // Protection
00518     assert(tb->get_etat() == ETATQCQ) ;
00519     
00520     // Pour le confort
00521     // Pour le confort
00522     int nr = (tb->dim).dim[0] ;     // Nombre
00523     int nt = (tb->dim).dim[1] ;     //   de points
00524     int np = (tb->dim).dim[2] ;     //      physiques REELS
00525     np = np - 2 ;           // Nombre de points physiques
00526     
00527     // pt. sur le tableau de double resultat
00528     double* xo = new double[(tb->dim).taille] ;
00529     
00530     // Initialisation a zero :
00531     for (int i=0; i<(tb->dim).taille; i++) {
00532     xo[i] = 0 ; 
00533     }
00534     
00535     // On y va...
00536     double* xi = tb->t ;
00537     double* xci ;   // Pointeurs
00538     double* xco ;   //  courants
00539     int auxiliaire ;
00540     
00541     // Partie impaire
00542     xci = xi ;
00543     xco = xo ;
00544     for (int k=0 ; k<np+1 ; k += 4) {
00545     auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00546     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00547           
00548         
00549         // On evite le sin (0*phi)
00550     
00551     if ((k==0) && (kmod == 1)) { 
00552         xco += nr*nt ;
00553         xci += nr*nt ;
00554         }
00555         
00556     else   
00557         
00558         for (int j=0 ; j<nt ; j++) {
00559 
00560         double som ;
00561     
00562         xco[nr-1] = 0 ;
00563         som = 2*(2*nr-3) * xci[nr-2] ;
00564         xco[nr-2] = som ;
00565         for (int i = nr-3 ; i >= 0 ; i-- ) {
00566             som += 2*(2*i+1) * xci[i] ;
00567             xco[i] = som ;
00568         }   // Fin de la boucle sur r
00569         xco[0] *= .5 ;
00570         
00571         xci += nr ;
00572         xco += nr ;
00573         }   // Fin de la boucle sur theta
00574     }   // Fin de la boucle sur kmod
00575     xci += 2*nr*nt ;
00576     xco += 2*nr*nt ;
00577     }   // Fin de la boucle sur phi
00578 
00579     // Partie paire
00580     xci = xi + 2*nr*nt ;
00581     xco = xo + 2*nr*nt ;
00582     for (int k=2 ; k<np+1 ; k += 4) {
00583         auxiliaire = (k==np) ? 1 : 2 ; // evite de prendre le dernier coef
00584     for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00585         for (int j=0 ; j<nt ; j++) {
00586 
00587         double som ;
00588         
00589         xco[nr-1] = 0 ;
00590         som = 4*(nr-1) * xci[nr-1] ;
00591         xco[nr-2] = som ;
00592         for (int i = nr-3 ; i >= 0 ; i-- ) {
00593             som += 4*(i+1) * xci[i+1] ;
00594             xco[i] = som ;
00595         }   // Fin de la boucle sur r
00596         
00597         xci += nr ;
00598         xco += nr ;
00599     }   // Fin de la boucle sur theta
00600     }   // Fin de la boucle sur kmod
00601     xci += 2*nr*nt ;
00602     xco += 2*nr*nt ;
00603     }   // Fin de la boucle sur phi
00604     
00605     // On remet les choses la ou il faut
00606     delete [] tb->t ;
00607     tb->t = xo ;
00608     
00609     // base de developpement
00610     // (impair,pair) -> (pair,impair)
00611     int base_t = b & MSQ_T ;
00612     int base_p = b & MSQ_P ;
00613     b = base_p | base_t | R_CHEBPIM_P ;
00614 }
00615 
00616 // cas R_CHEBPI_P
00617 //------------
00618 void _dsdx_r_chebpi_p(Tbl *tb, int & b)
00619 {
00620 
00621     // Peut-etre rien a faire ?
00622     if (tb->get_etat() == ETATZERO) {
00623     int base_t = b & MSQ_T ;
00624     int base_p = b & MSQ_P ;
00625     b = base_p | base_t | R_CHEBPI_I ;
00626     return ;
00627     }
00628     
00629     // Protection
00630     assert(tb->get_etat() == ETATQCQ) ;
00631     
00632     // Pour le confort
00633     int nr = (tb->dim).dim[0] ;     // Nombre
00634     int nt = (tb->dim).dim[1] ;     //   de points
00635     int np = (tb->dim).dim[2] ;     //      physiques REELS
00636     np = np - 2 ;           // Nombre de points physiques
00637     
00638     // pt. sur le tableau de double resultat
00639     double* xo = new double[(tb->dim).taille] ;
00640     
00641     // Initialisation a zero :
00642     for (int i=0; i<(tb->dim).taille; i++) {
00643     xo[i] = 0 ; 
00644     }
00645     
00646     // On y va...
00647     double* xi = tb->t ;
00648     double* xci = xi ;  // Pointeurs
00649     double* xco = xo ;  //  courants
00650     
00651     int borne_phi = np + 1 ; 
00652     if (np == 1) borne_phi = 1 ; 
00653     
00654     for (int k=0 ; k< borne_phi ; k++)
00655     
00656     // On evite le coefficient de sin(0*phi)
00657     
00658     if (k==1) {
00659         xco += nr*nt ;
00660         xci += nr*nt ;
00661         }
00662         
00663          
00664     else {
00665     for (int j=0 ; j<nt ; j++) {
00666         int l = j%2 ;
00667         double som ;
00668         
00669         if(l==0){
00670           xco[nr-1] = 0 ;
00671           som = 4*(nr-1) * xci[nr-1] ;
00672           xco[nr-2] = som ;
00673           for (int i = nr-3 ; i >= 0 ; i-- ) {
00674         som += 4*(i+1) * xci[i+1] ;
00675         xco[i] = som ;
00676           } // Fin de la boucle sur r
00677         } else {
00678           xco[nr-1] = 0 ;
00679           som = 2*(2*nr-3) * xci[nr-2] ;
00680           xco[nr-2] = som ;
00681           for (int i = nr-3 ; i >= 0 ; i-- ) {
00682         som += 2*(2*i+1) * xci[i] ;
00683         xco[i] = som ;
00684           } // Fin de la boucle sur r
00685           xco[0] *= .5 ;
00686         }
00687         xci += nr ;
00688         xco += nr ;
00689     }   // Fin de la boucle sur theta
00690     }   // Fin de la boucle sur phi
00691     
00692     // On remet les choses la ou il faut
00693     delete [] tb->t ;
00694     tb->t = xo ;
00695     
00696     // base de developpement
00697     // pair -> impair
00698     int base_t = b & MSQ_T ;
00699     int base_p = b & MSQ_P ;
00700     b = base_p | base_t | R_CHEBPI_I ;
00701 }
00702 
00703 // cas R_CHEBPI_I
00704 //------------
00705 void _dsdx_r_chebpi_i(Tbl *tb, int & b)
00706 {
00707 
00708     // Peut-etre rien a faire ?
00709     if (tb->get_etat() == ETATZERO) {
00710     int base_t = b & MSQ_T ;
00711     int base_p = b & MSQ_P ;
00712     b = base_p | base_t | R_CHEBPI_P ;
00713     return ;
00714     }
00715     
00716     // Protection
00717     assert(tb->get_etat() == ETATQCQ) ;
00718     
00719     // Pour le confort
00720     int nr = (tb->dim).dim[0] ;     // Nombre
00721     int nt = (tb->dim).dim[1] ;     //   de points
00722     int np = (tb->dim).dim[2] ;     //      physiques REELS
00723     np = np - 2 ;           // Nombre de points physiques
00724     
00725     // pt. sur le tableau de double resultat
00726     double* xo = new double[(tb->dim).taille] ;
00727     
00728     // Initialisation a zero :
00729     for (int i=0; i<(tb->dim).taille; i++) {
00730     xo[i] = 0 ; 
00731     }
00732     
00733     // On y va...
00734     double* xi = tb->t ;
00735     double* xci = xi ;  // Pointeurs
00736     double* xco = xo ;  //  courants
00737     
00738     int borne_phi = np + 1 ; 
00739     if (np == 1) borne_phi = 1 ; 
00740     
00741     for (int k=0 ; k< borne_phi ; k++)
00742     // On evite le coefficient de sin(0*phi)
00743     if (k==1) {
00744         xci += nr*nt ;
00745         xco += nr*nt ;
00746     }
00747     
00748     else {
00749     for (int j=0 ; j<nt ; j++) {
00750         int l = j%2 ;
00751         double som ;
00752         
00753         if(l==1){
00754           xco[nr-1] = 0 ;
00755           som = 4*(nr-1) * xci[nr-1] ;
00756           xco[nr-2] = som ;
00757           for (int i = nr-3 ; i >= 0 ; i-- ) {
00758         som += 4*(i+1) * xci[i+1] ;
00759         xco[i] = som ;
00760           } // Fin de la boucle sur r
00761         } else {
00762           xco[nr-1] = 0 ;
00763           som = 2*(2*nr-3) * xci[nr-2] ;
00764           xco[nr-2] = som ;
00765           for (int i = nr-3 ; i >= 0 ; i-- ) {
00766         som += 2*(2*i+1) * xci[i] ;
00767         xco[i] = som ;
00768           } // Fin de la boucle sur r
00769           xco[0] *= .5 ;
00770         }
00771         xci += nr ;
00772         xco += nr ;
00773     }   // Fin de la boucle sur theta
00774     }   // Fin de la boucle sur phi
00775     
00776     // On remet les choses la ou il faut
00777     delete [] tb->t ;
00778     tb->t = xo ;
00779     
00780     // base de developpement
00781     // impair -> pair
00782     int base_t = b & MSQ_T ;
00783     int base_p = b & MSQ_P ;
00784     b = base_p | base_t | R_CHEBPI_P ;
00785 }
00786 
00787 
00788 // cas R_JACO02
00789 //-----------
00790 void _dsdx_r_jaco02(Tbl *tb, int & )
00791 {
00792 
00793     // Peut-etre rien a faire ?
00794     if (tb->get_etat() == ETATZERO) {
00795     return ;
00796     }
00797     
00798     // Protection
00799     assert(tb->get_etat() == ETATQCQ) ;
00800     
00801     // Pour le confort
00802     int nr = (tb->dim).dim[0] ;     // Nombre
00803     int nt = (tb->dim).dim[1] ;     //   de points
00804     int np = (tb->dim).dim[2] ;     //      physiques REELS
00805     np = np - 2 ;           // Nombre de points physiques
00806     
00807     // pt. sur le tableau de double resultat
00808     double* xo = new double[(tb->dim).taille] ;
00809     
00810     // Initialisation a zero :
00811     for (int i=0; i<(tb->dim).taille; i++) {
00812     xo[i] = 0 ; 
00813     }
00814     if (nr > 2) { // If not an angular grid...
00815     // On y va...
00816     double* xi = tb->t ;
00817     double* xci = xi ;  // Pointeurs
00818     double* xco = xo ;  //  courants
00819     
00820     int borne_phi = np + 1 ; 
00821     if (np == 1) borne_phi = 1 ; 
00822     
00823     for (int k=0 ; k< borne_phi ; k++)
00824         // On evite le coefficient de sin(0*phi)
00825         if (k==1) {
00826         xci += nr*nt ;
00827         xco += nr*nt ;
00828         }
00829         else {
00830         for (int j=0 ; j<nt ; j++) {
00831             
00832             double som ;
00833             xco[nr-1] = 0 ;
00834          
00835             for (int i = 0 ; i < nr-1 ; i++ ) {
00836             
00837               som = 0 ;
00838               for (int m = i+1 ; m < nr ; m++ ) {
00839             int signe = ((m-i)%2 == 0 ? 1 : -1) ; 
00840             som += (1-signe*(i+1)*(i+2)/double((m+1)*(m+2)))* xci[m] ;
00841               } // Fin de la boucle annexe
00842             xco[i] = (i+1.5)*som ;
00843             }// Fin de la boucle sur r
00844                         
00845             xci += nr ;
00846             xco += nr ;
00847         }   // Fin de la boucle sur theta
00848         }   // Fin de la boucle sur phi
00849     }
00850     // On remet les choses la ou il faut
00851     delete [] tb->t ;
00852     tb->t = xo ;
00853     
00854     // base de developpement
00855     // inchangee
00856 }

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