cftcossincp.C

00001 /*
00002  *   Copyright (c) 1999-2002 Eric Gourgoulhon
00003  *
00004  *   This file is part of LORENE.
00005  *
00006  *   LORENE is free software; you can redistribute it and/or modify
00007  *   it under the terms of the GNU General Public License as published by
00008  *   the Free Software Foundation; either version 2 of the License, or
00009  *   (at your option) any later version.
00010  *
00011  *   LORENE is distributed in the hope that it will be useful,
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *   GNU General Public License for more details.
00015  *
00016  *   You should have received a copy of the GNU General Public License
00017  *   along with LORENE; if not, write to the Free Software
00018  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  *
00020  */
00021 
00022 
00023 char cftcossincp_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Coef/FFT991/cftcossincp.C,v 1.1 2004/12/21 17:06:01 j_novak Exp $" ;
00024 
00025 
00026 /*
00027  * Transformation en cos(2*l*theta) ou sin((2*l+1)*theta) (suivant la parite
00028  *  de l'indice m en phi) sur le deuxieme indice (theta)
00029  *  d'un tableau 3-D representant une fonction symetrique par rapport
00030  *  au plan z=0.
00031  *  Utilise la routine FFT Fortran FFT991
00032  *
00033  * Entree:
00034  * -------
00035  *   int* deg   : tableau du nombre effectif de degres de liberte dans chacune
00036  *        des 3 dimensions: le nombre de points de collocation
00037  *        en theta est  nt = deg[1] et doit etre de la forme
00038  *          nt = 2^p 3^q 5^r + 1 
00039  *   int* dimf  : tableau du nombre d'elements de ff dans chacune des trois 
00040  *            dimensions.
00041  *        On doit avoir  dimf[1] >= deg[1] = nt. 
00042  *
00043  *   double* ff : tableau des valeurs de la fonction aux nt points de
00044  *                        de collocation
00045  *
00046  *            theta_l =  pi/2 l/(nt-1)       0 <= l <= nt-1 
00047  *
00048  *            L'espace memoire correspondant a ce
00049  *                        pointeur doit etre dimf[0]*dimf[1]*dimf[2] et doit 
00050  *            etre alloue avant l'appel a la routine.    
00051  *            Les valeurs de la fonction doivent etre stokees
00052  *            dans le tableau ff comme suit
00053  *          f( theta_l ) = ff[ dimf[1]*dimf[2] * m + k + dimf[2] * l ]
00054  *           ou m et k sont les indices correspondant a
00055  *           phi et r respectivement.
00056  *  NB: cette routine suppose que la transformation en phi a deja ete
00057  *      effectuee: ainsi m est un indice de Fourier, non un indice de
00058  *      point de collocation en phi.
00059  *
00060  *   int* dimc  : tableau du nombre d'elements de cc dans chacune des trois 
00061  *            dimensions.
00062  *        On doit avoir  dimc[1] >= deg[1] = nt. 
00063  * Sortie:
00064  * -------
00065  *   double* cf :   tableau des coefficients c_l de la fonction definis
00066  *            comme suit (a r et phi fixes)
00067  *
00068  *            pour m pair:
00069  *          f(theta) = som_{l=0}^{nt-1} c_l cos( 2 l theta ) . 
00070  *            pour m impair:
00071  *          f(theta) = som_{l=0}^{nt-2} c_l sin( (2 l+1) theta ) . 
00072  *
00073  *            L'espace memoire correspondant a ce
00074  *                        pointeur doit etre dimc[0]*dimc[1]*dimc[2] et doit 
00075  *            etre alloue avant l'appel a la routine.    
00076  *           Le coefficient c_l (0 <= l <= nt-1) est stoke dans
00077  *           le tableau cf comme suit
00078  *                c_l = cf[ dimc[1]*dimc[2] * m + k + dimc[2] * l ]
00079  *           ou m et k sont les indices correspondant a
00080  *           phi et r respectivement.
00081  *           Pour m impair, c_{nt-1} = 0.
00082  *
00083  * NB: Si le pointeur ff est egal a cf, la routine ne travaille que sur un 
00084  *     seul tableau, qui constitue une entree/sortie.
00085  *
00086  */
00087 
00088 /*
00089  * $Id: cftcossincp.C,v 1.1 2004/12/21 17:06:01 j_novak Exp $
00090  * $Log: cftcossincp.C,v $
00091  * Revision 1.1  2004/12/21 17:06:01  j_novak
00092  * Added all files for using fftw3.
00093  *
00094  * Revision 1.4  2003/01/31 10:31:23  e_gourgoulhon
00095  * Suppressed the directive #include <malloc.h> for malloc is defined
00096  * in <stdlib.h>
00097  *
00098  * Revision 1.3  2002/10/16 14:36:51  j_novak
00099  * Reorganization of #include instructions of standard C++, in order to
00100  * use experimental version 3 of gcc.
00101  *
00102  * Revision 1.2  2002/09/09 13:00:39  e_gourgoulhon
00103  * Modification of declaration of Fortran 77 prototypes for
00104  * a better portability (in particular on IBM AIX systems):
00105  * All Fortran subroutine names are now written F77_* and are
00106  * defined in the new file C++/Include/proto_f77.h.
00107  *
00108  * Revision 1.1.1.1  2001/11/20 15:19:28  e_gourgoulhon
00109  * LORENE
00110  *
00111  * Revision 2.1  2000/01/27  12:16:02  eric
00112  * Modif commentaires.
00113  *
00114  * Revision 2.0  1999/02/22  15:47:32  hyc
00115  * *** empty log message ***
00116  *
00117  *
00118  * $Header: /cvsroot/Lorene/C++/Source/Non_class_members/Coef/FFT991/cftcossincp.C,v 1.1 2004/12/21 17:06:01 j_novak Exp $
00119  *
00120  */
00121 
00122 
00123 // headers du C
00124 #include <assert.h>
00125 #include <stdlib.h>
00126 
00127 // Prototypes of F77 subroutines
00128 #include "headcpp.h"
00129 #include "proto_f77.h"
00130 
00131 // Prototypage des sous-routines utilisees:
00132 int*    facto_ini(int ) ;
00133 double* trigo_ini(int ) ;
00134 double* cheb_ini(const int) ;
00135 double* chebimp_ini(const int ) ;
00136 //*****************************************************************************
00137 
00138 void cftcossincp(const int* deg, const int* dimf, double* ff, const int* dimc,
00139         double* cf)
00140 {
00141 
00142 int i, j, k ;
00143 
00144 // Dimensions des tableaux ff et cf  :
00145     int n1f = dimf[0] ;
00146     int n2f = dimf[1] ;
00147     int n3f = dimf[2] ;
00148     int n1c = dimc[0] ;
00149     int n2c = dimc[1] ;
00150     int n3c = dimc[2] ;
00151 
00152 // Nombre de degres de liberte en theta :    
00153     int nt = deg[1] ;
00154     
00155 // Tests de dimension:
00156     if (nt > n2f) {
00157     cout << "cftcossincp: nt > n2f : nt = " << nt << " ,  n2f = " 
00158     << n2f << endl ;
00159     abort () ;
00160     exit(-1) ;
00161     }
00162     if (nt > n2c) {
00163     cout << "cftcossincp: nt > n2c : nt = " << nt << " ,  n2c = " 
00164     << n2c << endl ;
00165     abort () ;
00166     exit(-1) ;
00167     }
00168     if (n1f > n1c) {
00169     cout << "cftcossincp: n1f > n1c : n1f = " << n1f << " ,  n1c = " 
00170     << n1c << endl ;
00171     abort () ;
00172     exit(-1) ;
00173     }
00174     if (n3f > n3c) {
00175     cout << "cftcossincp: n3f > n3c : n3f = " << n3f << " ,  n3c = " 
00176     << n3c << endl ;
00177     abort () ;
00178     exit(-1) ;
00179     }
00180 
00181 // Nombre de points pour la FFT:
00182     int nm1 = nt - 1;
00183     int nm1s2 = nm1 / 2;
00184 
00185 // Recherche des tables pour la FFT:
00186     int* facto = facto_ini(nm1) ;
00187     double* trigo = trigo_ini(nm1) ;
00188 
00189 // Recherche de la table des sin(psi) :
00190     double* sinp = cheb_ini(nt);    
00191     
00192 // Recherche de la table des sin( theta_l ) :
00193     double* sinth = chebimp_ini(nt);    
00194 
00195     // tableau de travail G et t1
00196     //   (la dimension nm1+2 = nt+1 est exigee par la routine fft991)
00197     double* g = (double*)( malloc( (nm1+2)*sizeof(double) ) );  
00198     double* t1 = (double*)( malloc( (nm1+2)*sizeof(double) ) ) ;
00199 
00200 // Parametres pour la routine FFT991
00201     int jump = 1 ;
00202     int inc = 1 ;
00203     int lot = 1 ;
00204     int isign = - 1 ;
00205 
00206 // boucle sur phi et r (les boucles vont resp. de 0 a dimf[0]-1
00207 //           et 0 a dimf[2])
00208 
00209     int n2n3f = n2f * n3f ;
00210     int n2n3c = n2c * n3c ;
00211 
00212 //=======================================================================
00213 //              Cas m pair
00214 //=======================================================================
00215 
00216     j = 0 ;
00217     
00218     while (j<n1f-1) {   //le dernier coef en phi n'est pas considere
00219             // (car nul)
00220 
00221 //--------------------------------------------------------------------
00222 //  partie cos(m phi) avec m pair : transformation en cos(2 l theta)
00223 //--------------------------------------------------------------------
00224 
00225     for (k=0; k<n3f; k++) {
00226 
00227         int i0 = n2n3f * j + k ; // indice de depart 
00228         double* ff0 = ff + i0 ;    // tableau des donnees a transformer
00229 
00230         i0 = n2n3c * j + k ; // indice de depart 
00231         double* cf0 = cf + i0 ;    // tableau resultat
00232 
00233 /*
00234  * NB: dans les commentaires qui suivent, psi designe la variable de [0, pi]
00235  *     reliee a theta par  psi = 2 theta   et F(psi) = f(theta(psi)).  
00236  */
00237  
00238 // Valeur en psi=0 de la partie antisymetrique de F, F_ :
00239             double fmoins0 = 0.5 * ( ff0[0] - ff0[ n3f*nm1 ] );
00240 
00241 // Fonction G(psi) = F+(psi) + F_(psi) sin(psi) 
00242 //---------------------------------------------
00243             for ( i = 1; i < nm1s2 ; i++ ) {
00244 // ... indice (dans le tableau g) du pt symetrique de psi par rapport a pi/2:
00245         int isym = nm1 - i ; 
00246 // ... indice (dans le tableau ff0) du point theta correspondant a psi
00247         int ix = n3f * i ;
00248 // ... indice (dans le tableau ff0) du point theta correspondant a sym(psi)
00249         int ixsym = n3f * isym ;
00250 // ... F+(psi)
00251         double fp = 0.5 * ( ff0[ix] + ff0[ixsym] ) ;    
00252 // ... F_(psi) sin(psi)
00253         double fms = 0.5 * ( ff0[ix] - ff0[ixsym] ) * sinp[i] ; 
00254         g[i] = fp + fms ;
00255         g[isym] = fp - fms ;
00256             }
00257 //... cas particuliers:
00258             g[0] = 0.5 * ( ff0[0] + ff0[ n3f*nm1 ] );
00259             g[nm1s2] = ff0[ n3f*nm1s2 ];
00260 
00261 // Developpement de G en series de Fourier par une FFT
00262 //----------------------------------------------------
00263 
00264             F77_fft991( g, t1, trigo, facto, &inc, &jump, &nm1, &lot, &isign) ;
00265 
00266 // Coefficients pairs du developmt. cos(2l theta) de f
00267 //----------------------------------------------------
00268 //  Ces coefficients sont egaux aux coefficients en cosinus du developpement
00269 //  de G en series de Fourier (le facteur 2 vient de la normalisation
00270 //  de fft991) :
00271 
00272         cf0[0] = g[0] ;
00273             for (i=2; i<nm1; i += 2 ) cf0[n3c*i] = 2.* g[i] ;   
00274         cf0[n3c*nm1] = g[nm1] ;    
00275 
00276 // Coefficients impairs du developmt. en cos(2l theta) de f
00277 //---------------------------------------------------------
00278 // 1. Coef. c'_k (recurrence amorcee a partir de zero):
00279 //  Le +4. en facteur de g[i] est du a la normalisation de fft991
00280 //  (si fft991 donnait reellement les coef. en sinus, il faudrait le
00281 //   remplacer par un -2.) 
00282             cf0[n3c] = 0 ;
00283             double som = 0;
00284             for ( i = 3; i < nt; i += 2 ) {
00285         cf0[n3c*i] = cf0[n3c*(i-2)] + 4. * g[i] ;
00286             som += cf0[n3c*i] ;
00287             }
00288 
00289 // 2. Calcul de c_1 :
00290             double c1 = ( fmoins0 - som ) / nm1s2 ;
00291 
00292 // 3. Coef. c_k avec k impair:  
00293             cf0[n3c] = c1 ;
00294             for ( i = 3; i < nt; i += 2 ) cf0[n3c*i] += c1 ;
00295 
00296 
00297     }   // fin de la boucle sur r 
00298 
00299 //--------------------------------------------------------------------
00300 //  partie sin(m phi) avec m pair : transformation en cos(2 l theta)
00301 //--------------------------------------------------------------------
00302 
00303     j++ ;
00304 
00305     if ( (j != 1) && (j != n1f-1 ) ) {  
00306 //  on effectue le calcul seulement dans les cas ou les coef en phi ne sont 
00307 //  pas nuls 
00308     for (k=0; k<n3f; k++) {
00309 
00310         int i0 = n2n3f * j + k ; // indice de depart 
00311         double* ff0 = ff + i0 ;    // tableau des donnees a transformer
00312 
00313         i0 = n2n3c * j + k ; // indice de depart 
00314         double* cf0 = cf + i0 ;    // tableau resultat
00315 
00316 /*
00317  * NB: dans les commentaires qui suivent, psi designe la variable de [0, pi]
00318  *     reliee a theta par  psi = 2 theta   et F(psi) = f(theta(psi)).  
00319  */
00320  
00321 // Valeur en psi=0 de la partie antisymetrique de F, F_ :
00322             double fmoins0 = 0.5 * ( ff0[0] - ff0[ n3f*nm1 ] );
00323 
00324 // Fonction G(psi) = F+(psi) + F_(psi) sin(psi) 
00325 //---------------------------------------------
00326             for ( i = 1; i < nm1s2 ; i++ ) {
00327 // ... indice (dans le tableau g) du pt symetrique de psi par rapport a pi/2:
00328         int isym = nm1 - i ; 
00329 // ... indice (dans le tableau ff0) du point theta correspondant a psi
00330         int ix = n3f * i ;
00331 // ... indice (dans le tableau ff0) du point theta correspondant a sym(psi)
00332         int ixsym = n3f * isym ;
00333 // ... F+(psi)
00334         double fp = 0.5 * ( ff0[ix] + ff0[ixsym] ) ;    
00335 // ... F_(psi) sin(psi)
00336         double fms = 0.5 * ( ff0[ix] - ff0[ixsym] ) * sinp[i] ; 
00337         g[i] = fp + fms ;
00338         g[isym] = fp - fms ;
00339             }
00340 //... cas particuliers:
00341             g[0] = 0.5 * ( ff0[0] + ff0[ n3f*nm1 ] );
00342             g[nm1s2] = ff0[ n3f*nm1s2 ];
00343 
00344 // Developpement de G en series de Fourier par une FFT
00345 //----------------------------------------------------
00346 
00347             F77_fft991( g, t1, trigo, facto, &inc, &jump, &nm1, &lot, &isign) ;
00348 
00349 // Coefficients pairs du developmt. cos(2l theta) de f
00350 //----------------------------------------------------
00351 //  Ces coefficients sont egaux aux coefficients en cosinus du developpement
00352 //  de G en series de Fourier (le facteur 2 vient de la normalisation
00353 //  de fft991) :
00354 
00355         cf0[0] = g[0] ;
00356             for (i=2; i<nm1; i += 2 ) cf0[n3c*i] = 2.* g[i] ;   
00357         cf0[n3c*nm1] = g[nm1] ;    
00358 
00359 // Coefficients impairs du developmt. en cos(2l theta) de f
00360 //---------------------------------------------------------
00361 // 1. Coef. c'_k (recurrence amorcee a partir de zero):
00362 //  Le +4. en facteur de g[i] est du a la normalisation de fft991
00363 //  (si fft991 donnait reellement les coef. en sinus, il faudrait le
00364 //   remplacer par un -2.) 
00365             cf0[n3c] = 0 ;
00366             double som = 0;
00367             for ( i = 3; i < nt; i += 2 ) {
00368         cf0[n3c*i] = cf0[n3c*(i-2)] + 4. * g[i] ;
00369             som += cf0[n3c*i] ;
00370             }
00371 
00372 // 2. Calcul de c_1 :
00373             double c1 = ( fmoins0 - som ) / nm1s2 ;
00374 
00375 // 3. Coef. c_k avec k impair:  
00376             cf0[n3c] = c1 ;
00377             for ( i = 3; i < nt; i += 2 ) cf0[n3c*i] += c1 ;
00378 
00379 
00380     }   // fin de la boucle sur r 
00381     }    // fin du cas ou le calcul etait necessaire (i.e. ou les
00382          // coef en phi n'etaient pas nuls)
00383 
00384 // On passe au cas m pair suivant:
00385     j+=3 ;
00386 
00387    }    // fin de la boucle sur les cas m pair
00388 
00389     if (n1f<=3) {       // cas m=0 seulement (symetrie axiale)
00390     free (t1) ;
00391     free (g) ;
00392     return ;
00393     }
00394     
00395 //=======================================================================
00396 //              Cas m impair
00397 //=======================================================================
00398 
00399     j = 2 ;
00400     
00401     while (j<n1f-1) {   //le dernier coef en phi n'est pas considere
00402             // (car nul)
00403 
00404 //------------------------------------------------------------------------
00405 //  partie cos(m phi) avec m impair : transformation en sin((2 l+1) theta)
00406 //------------------------------------------------------------------------
00407 
00408     for (k=0; k<n3f; k++) {
00409 
00410         int i0 = n2n3f * j + k ; // indice de depart 
00411         double* ff0 = ff + i0 ;    // tableau des donnees a transformer
00412 
00413         i0 = n2n3c * j + k ; // indice de depart 
00414         double* cf0 = cf + i0 ;    // tableau resultat
00415 
00416 // Multiplication de la fonction par sin(theta) (pour la rendre developpable
00417 //  en cos(2l theta) ) 
00418 // NB: dans les commentaires qui suivent, on note 
00419 //     h(theta) = f(theta) sin(theta).
00420 // (Les valeurs de h dans l'espace des configurations sont stokees dans le
00421 //  tableau cf0).
00422         cf0[0] = 0 ;
00423         for (i=1; i<nt; i++) cf0[n3c*i] = sinth[i] * ff0[n3f*i] ;
00424 
00425 /*
00426  * NB: dans les commentaires qui suivent, psi designe la variable de [0, pi]
00427  *     reliee a theta par  psi = 2 theta  et F(psi) = h(theta(psi)).  
00428  */
00429  
00430 // Valeur en psi=0 de la partie antisymetrique de F, F_ :
00431             double fmoins0 = 0.5 * ( cf0[0] - cf0[ n3c*nm1 ] );
00432 
00433 // Fonction G(psi) = F+(psi) + F_(psi) sin(psi) 
00434 //---------------------------------------------
00435             for ( i = 1; i < nm1s2 ; i++ ) {
00436 // ... indice (dans le tableau g) du pt symetrique de psi par rapport a pi/2:
00437         int isym = nm1 - i ; 
00438 // ... indice (dans le tableau cf0) du point theta correspondant a psi
00439         int ix = n3c * i ;
00440 // ... indice (dans le tableau cf0) du point theta correspondant a sym(psi)
00441         int ixsym = n3c * isym ;
00442 // ... F+(psi)
00443         double fp = 0.5 * ( cf0[ix] + cf0[ixsym] ) ;    
00444 // ... F_(psi) sin(psi)
00445         double fms = 0.5 * ( cf0[ix] - cf0[ixsym] ) * sinp[i] ; 
00446         g[i] = fp + fms ;
00447         g[isym] = fp - fms ;
00448             }
00449 //... cas particuliers:
00450             g[0] = 0.5 * ( cf0[0] + cf0[ n3c*nm1 ] );
00451             g[nm1s2] = cf0[ n3c*nm1s2 ];
00452 
00453 // Developpement de G en series de Fourier par une FFT
00454 //----------------------------------------------------
00455 
00456             F77_fft991( g, t1, trigo, facto, &inc, &jump, &nm1, &lot, &isign) ;
00457 
00458 // Coefficients pairs du developmt. cos(2l theta) de h
00459 //----------------------------------------------------
00460 //  Ces coefficients sont egaux aux coefficients en cosinus du developpement
00461 //  de G en series de Fourier (le facteur 2 vient de la normalisation
00462 //  de fft991) :
00463 
00464         cf0[0] = g[0] ;
00465             for (i=2; i<nm1; i += 2 ) cf0[n3c*i] = 2.* g[i] ;   
00466         cf0[n3c*nm1] = g[nm1] ;    
00467 
00468 // Coefficients impairs du developmt. en cos(2l theta) de h
00469 //---------------------------------------------------------
00470 // 1. Coef. c'_k (recurrence amorcee a partir de zero):
00471 //  Le +4. en facteur de g[i] est du a la normalisation de fft991
00472 //  (si fft991 donnait reellement les coef. en sinus, il faudrait le
00473 //   remplacer par un -2.) 
00474             cf0[n3c] = 0 ;
00475             double som = 0;
00476             for ( i = 3; i < nt; i += 2 ) {
00477         cf0[n3c*i] = cf0[n3c*(i-2)] + 4. * g[i] ;
00478             som += cf0[n3c*i] ;
00479             }
00480 
00481 // 2. Calcul de c_1 :
00482             double c1 = ( fmoins0 - som ) / nm1s2 ;
00483 
00484 // 3. Coef. c_k avec k impair:  
00485             cf0[n3c] = c1 ;
00486             for ( i = 3; i < nt; i += 2 ) cf0[n3c*i] += c1 ;
00487 
00488 // Coefficients de f en fonction de ceux de h
00489 //-------------------------------------------
00490 
00491             cf0[0] = 2* cf0[0] ;
00492             for (i=1; i<nm1; i++) {
00493         cf0[n3c*i] = 2 * cf0[n3c*i] + cf0[n3c*(i-1)] ;
00494             }    
00495             cf0[n3c*nm1] = 0 ;
00496 
00497     }   // fin de la boucle sur r 
00498 
00499 //------------------------------------------------------------------------
00500 //  partie sin(m phi) avec m impair : transformation en sin((2 l+1) theta)
00501 //------------------------------------------------------------------------
00502 
00503     j++ ;
00504 
00505     if ( j != n1f-1  ) {  
00506 //  on effectue le calcul seulement dans les cas ou les coef en phi ne sont 
00507 //  pas nuls 
00508 
00509     for (k=0; k<n3f; k++) {
00510 
00511         int i0 = n2n3f * j + k ; // indice de depart 
00512         double* ff0 = ff + i0 ;    // tableau des donnees a transformer
00513 
00514         i0 = n2n3c * j + k ; // indice de depart 
00515         double* cf0 = cf + i0 ;    // tableau resultat
00516 
00517 // Multiplication de la fonction par sin(theta) (pour la rendre developpable
00518 //  en cos(2l theta) ) 
00519 // NB: dans les commentaires qui suivent, on note 
00520 //     h(theta) = f(theta) sin(theta).
00521 // (Les valeurs de h dans l'espace des configurations sont stokees dans le
00522 //  tableau cf0).
00523         cf0[0] = 0 ;
00524         for (i=1; i<nt; i++) cf0[n3c*i] = sinth[i] * ff0[n3f*i] ;
00525 
00526 /*
00527  * NB: dans les commentaires qui suivent, psi designe la variable de [0, pi]
00528  *     reliee a theta par  psi = 2 theta  et F(psi) = h(theta(psi)).  
00529  */
00530  
00531 // Valeur en psi=0 de la partie antisymetrique de F, F_ :
00532             double fmoins0 = 0.5 * ( cf0[0] - cf0[ n3c*nm1 ] );
00533 
00534 // Fonction G(psi) = F+(psi) + F_(psi) sin(psi) 
00535 //---------------------------------------------
00536             for ( i = 1; i < nm1s2 ; i++ ) {
00537 // ... indice (dans le tableau g) du pt symetrique de psi par rapport a pi/2:
00538         int isym = nm1 - i ; 
00539 // ... indice (dans le tableau cf0) du point theta correspondant a psi
00540         int ix = n3c * i ;
00541 // ... indice (dans le tableau cf0) du point theta correspondant a sym(psi)
00542         int ixsym = n3c * isym ;
00543 // ... F+(psi)
00544         double fp = 0.5 * ( cf0[ix] + cf0[ixsym] ) ;    
00545 // ... F_(psi) sin(psi)
00546         double fms = 0.5 * ( cf0[ix] - cf0[ixsym] ) * sinp[i] ; 
00547         g[i] = fp + fms ;
00548         g[isym] = fp - fms ;
00549             }
00550 //... cas particuliers:
00551             g[0] = 0.5 * ( cf0[0] + cf0[ n3c*nm1 ] );
00552             g[nm1s2] = cf0[ n3c*nm1s2 ];
00553 
00554 // Developpement de G en series de Fourier par une FFT
00555 //----------------------------------------------------
00556 
00557             F77_fft991( g, t1, trigo, facto, &inc, &jump, &nm1, &lot, &isign) ;
00558 
00559 // Coefficients pairs du developmt. cos(2l theta) de h
00560 //----------------------------------------------------
00561 //  Ces coefficients sont egaux aux coefficients en cosinus du developpement
00562 //  de G en series de Fourier (le facteur 2 vient de la normalisation
00563 //  de fft991) :
00564 
00565         cf0[0] = g[0] ;
00566             for (i=2; i<nm1; i += 2 ) cf0[n3c*i] = 2.* g[i] ;   
00567         cf0[n3c*nm1] = g[nm1] ;    
00568 
00569 // Coefficients impairs du developmt. en cos(2l theta) de h
00570 //---------------------------------------------------------
00571 // 1. Coef. c'_k (recurrence amorcee a partir de zero):
00572 //  Le +4. en facteur de g[i] est du a la normalisation de fft991
00573 //  (si fft991 donnait reellement les coef. en sinus, il faudrait le
00574 //   remplacer par un -2.) 
00575             cf0[n3c] = 0 ;
00576             double som = 0;
00577             for ( i = 3; i < nt; i += 2 ) {
00578         cf0[n3c*i] = cf0[n3c*(i-2)] + 4. * g[i] ;
00579             som += cf0[n3c*i] ;
00580             }
00581 
00582 // 2. Calcul de c_1 :
00583             double c1 = ( fmoins0 - som ) / nm1s2 ;
00584 
00585 // 3. Coef. c_k avec k impair:  
00586             cf0[n3c] = c1 ;
00587             for ( i = 3; i < nt; i += 2 ) cf0[n3c*i] += c1 ;
00588 
00589 // Coefficients de f en fonction de ceux de h
00590 //-------------------------------------------
00591 
00592             cf0[0] = 2* cf0[0] ;
00593             for (i=1; i<nm1; i++) {
00594         cf0[n3c*i] = 2 * cf0[n3c*i] + cf0[n3c*(i-1)] ;
00595             }    
00596             cf0[n3c*nm1] = 0 ;
00597 
00598     }   // fin de la boucle sur r 
00599 
00600     }    // fin du cas ou le calcul etait necessaire (i.e. ou les
00601          // coef en phi n'etaient pas nuls)
00602 
00603 
00604 // On passe au cas m impair suivant:
00605     j+=3 ;
00606 
00607    }    // fin de la boucle sur les cas m impair
00608 
00609     // Menage
00610     free (t1) ;
00611     free (g) ;
00612 
00613 }

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