00001 /* 00002 * Copyright (c) 2007 Jean-Louis Cornou 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 cirjaco02_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Coef/cirjaco02.C,v 1.2 2007/12/21 12:41:46 j_novak Exp $" ; 00024 00025 00026 /* 00027 * Transformation de Jacobi inverse (cas fin) sur le troisieme indice 00028 * (indice correspondant a r) d'un tableau 3-D 00029 * 00030 * 00031 * Entree: 00032 * ------- 00033 * int* deg : tableau du nombre effectif de degres de liberte dans chacune 00034 * des 3 dimensions: le nombre de points de collocation 00035 * en r est nr = deg[2] et doit etre de la forme 00036 * nr = 2*p + 1 00037 * int* dimc : tableau du nombre d'elements de cf dans chacune des trois 00038 * dimensions. 00039 * On doit avoir dimc[2] >= deg[2] = nr. 00040 * NB: pour dimc[0] = 1 (un seul point en phi), la transformation 00041 * est bien effectuee. 00042 * pour dimc[0] > 1 (plus d'un point en phi), la 00043 * transformation n'est effectuee que pour les indices (en phi) 00044 * j != 1 et j != dimc[0]-1 (cf. commentaires sur borne_phi). 00045 * 00046 * double* cf : tableau des coefficients c_i de la fonction definis 00047 * comme suit (a theta et phi fixes) 00048 * 00049 * f(x) = som_{i=0}^{nr-1} c_i J_i(x) , 00050 * 00051 * ou J_i(x) designe le polynome de Jacobi(0,2) de degre i. 00052 * Les coefficients c_i (0 <= i <= nr-1) doivent etre stockes 00053 * dans le tableau cf comme suit 00054 * c_i = cf[ dimc[1]*dimc[2] * j + dimc[2] * k + i ] 00055 * ou j et k sont les indices correspondant a phi et theta 00056 * respectivement. 00057 * L'espace memoire correspondant au pointeur cf doit etre 00058 * dimc[0]*dimc[1]*dimc[2] et doit avoir ete alloue avant 00059 * l'appel a la routine. 00060 * 00061 * int* dimf : tableau du nombre d'elements de ff dans chacune des trois 00062 * dimensions. 00063 * On doit avoir dimf[2] >= deg[2] = nr. 00064 * 00065 * Sortie: 00066 * ------- 00067 * double* ff : tableau des valeurs de la fonction aux nr points de 00068 * de collocation 00069 * 00070 * x_i = points de gauss lobatto 0 <= i <= nr-1 00071 * 00072 * Les valeurs de la fonction sont stokees dans le 00073 * tableau ff comme suit 00074 * f( x_i ) = ff[ dimf[1]*dimf[2] * j + dimf[2] * k + i ] 00075 * ou j et k sont les indices correspondant a phi et theta 00076 * respectivement. 00077 * L'espace memoire correspondant a ce pointeur doit etre 00078 * dimf[0]*dimf[1]*dimf[2] et doit etre alloue avant l'appel a 00079 * la routine. 00080 * 00081 * NB: Si le pointeur cf est egal a ff, la routine ne travaille que sur un 00082 * seul tableau, qui constitue une entree/sortie. 00083 * 00084 */ 00085 00086 /* 00087 * $Id: cirjaco02.C,v 1.2 2007/12/21 12:41:46 j_novak Exp $ 00088 * $Log: cirjaco02.C,v $ 00089 * Revision 1.2 2007/12/21 12:41:46 j_novak 00090 * Removed the #include<fftw3.h> not needed here. Corrected headers. 00091 * 00092 * Revision 1.1 2007/12/11 15:42:21 jl_cornou 00093 * Premiere version des fonctions liees aux polynomes de Jacobi(0,2) 00094 * 00095 * $Header: /cvsroot/Lorene/C++/Source/Non_class_members/Coef/cirjaco02.C,v 1.2 2007/12/21 12:41:46 j_novak Exp $ 00096 * 00097 */ 00098 00099 // headers du C 00100 #include <assert.h> 00101 #include <stdlib.h> 00102 00103 //Lorene prototypes 00104 #include "tbl.h" 00105 #include "proto.h" 00106 00107 00108 //***************************************************************************** 00109 00110 void cirjaco02(const int* deg, const int* dimc, double* cf, const int* dimf, 00111 double* ff) 00112 00113 { 00114 int i, j, k ; 00115 00116 // Dimensions des tableaux ff et cf : 00117 int n1f = dimf[0] ; 00118 int n2f = dimf[1] ; 00119 int n3f = dimf[2] ; 00120 int n1c = dimc[0] ; 00121 int n2c = dimc[1] ; 00122 int n3c = dimc[2] ; 00123 00124 // Nombres de degres de liberte en r : 00125 int nr = deg[2] ; 00126 00127 // Tests de dimension: 00128 if (nr > n3c) { 00129 cout << "circheb: nr > n3c : nr = " << nr << " , n3c = " 00130 << n3c << endl ; 00131 abort () ; 00132 exit(-1) ; 00133 } 00134 if (nr > n3f) { 00135 cout << "circheb: nr > n3f : nr = " << nr << " , n3f = " 00136 << n3f << endl ; 00137 abort () ; 00138 exit(-1) ; 00139 } 00140 if (n1c > n1f) { 00141 cout << "circheb: n1c > n1f : n1c = " << n1c << " , n1f = " 00142 << n1f << endl ; 00143 abort () ; 00144 exit(-1) ; 00145 } 00146 if (n2c > n2f) { 00147 cout << "circheb: n2c > n2f : n2c = " << n2c << " , n2f = " 00148 << n2f << endl ; 00149 abort () ; 00150 exit(-1) ; 00151 } 00152 00153 // 00154 int nm1 = nr - 1; 00155 00156 // boucle sur phi et theta 00157 00158 int n2n3f = n2f * n3f ; 00159 int n2n3c = n2c * n3c ; 00160 00161 /* 00162 * Borne de la boucle sur phi: 00163 * si n1c = 1, on effectue la boucle une fois seulement. 00164 * si n1c > 1, on va jusqu'a j = n1c-2 en sautant j = 1 (les coefficients 00165 * j=n1c-1 et j=0 ne sont pas consideres car nuls). 00166 */ 00167 int borne_phi = ( n1c > 1 ) ? n1c-1 : 1 ; 00168 00169 for (j=0; j< borne_phi; j++) { 00170 00171 if (j==1) continue ; // on ne traite pas le terme en sin(0 phi) 00172 00173 for (k=0; k<n2c; k++) { 00174 00175 int i0 = n2n3c * j + n3c * k ; // indice de depart 00176 double* cf0 = cf + i0 ; // tableau des donnees a transformer 00177 00178 i0 = n2n3f * j + n3f * k ; // indice de depart 00179 double* ff0 = ff + i0 ; // tableau resultat 00180 00181 Tbl jj = jacobipointsgl(nm1) ; 00182 double som ; 00183 for (i=0 ; i<nr ; i++) { 00184 som = 0 ; 00185 for (int n = 0 ; n<nr ; n++){ 00186 som += cf0[n]*jj(n,i) ; 00187 } // fin de la boucle auxiliaire 00188 ff0[i] = som ; 00189 } // fin de la boucle sur r 00190 } // fin de la boucle sur theta 00191 } // fin de la boucle sur phi 00192 } 00193
1.4.6