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