cirjaco02.C

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 

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