cftlegp.C

00001 /*
00002  *   Copyright (c) 1999-2001 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 cftlegp_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Coef/cftlegp.C,v 1.4 2005/02/18 13:14:10 j_novak Exp $" ;
00024 
00025 /*
00026  * Transformation en fonctions de Legendre associees sur le deuxieme indice
00027  *  (theta) d'un tableau 3-D representant une fonction symetrique par rapport
00028  *  au plan z=0.
00029  *
00030  * Entree:
00031  * -------
00032  *   int* deg   : tableau du nombre effectif de degres de liberte dans chacune 
00033  *        des 3 dimensions: le nombre de points de collocation
00034  *        en theta est  nt = deg[1] et doit etre de la forme
00035  *          nt = 2^p 3^q 5^r + 1 
00036  *   int* dimf  : tableau du nombre d'elements de ff dans chacune des trois 
00037  *            dimensions.
00038  *        On doit avoir  dimf[1] >= deg[1] = nt. 
00039  *
00040  *   double* ff : tableau des valeurs de la fonction aux nt points de
00041  *                        de collocation
00042  *
00043  *            theta_l =  pi/2 l/(nt-1)       0 <= l <= nt-1 
00044  *
00045  *            L'espace memoire correspondant a ce
00046  *                        pointeur doit etre dimf[0]*dimf[1]*dimf[2] et doit 
00047  *            etre alloue avant l'appel a la routine.    
00048  *            Les valeurs de la fonction doivent etre stokees
00049  *            dans le tableau ff comme suit
00050  *          f( theta_l ) = ff[ dimf[1]*dimf[2] * m + k + dimf[2] * l ]
00051  *           ou m et k sont les indices correspondant a
00052  *           phi et r respectivement.
00053  *  NB: cette routine suppose que la transformation en phi a deja ete
00054  *      effectuee: ainsi m est un indice de Fourier, non un indice de
00055  *      point de collocation en phi.
00056  *
00057  *   int* dimc  : tableau du nombre d'elements de cf dans chacune des trois 
00058  *            dimensions.
00059  *        On doit avoir  dimc[1] >= deg[1] = nt. 
00060  * Sortie:
00061  * -------
00062  *   double* cf :  tableau des coefficients a_l du develop. en fonctions de
00063  *          Legendre associees P_n^m:
00064  *
00065  *  pour m pair:    f(theta) = 
00066  *              som_{l=m/2}^{nt-1} a_l P_{2l}^m( cos(theta) )
00067  *            
00068  *  pour m impair:  f(theta) = 
00069  *              som_{l=(m-1)/2}^{nt-2} a_l P_{2l+1}^m( cos(theta) )
00070  *
00071  *          ou P_n^m(x) represente la fonction de Legendre associee
00072  *             de degre n et d'ordre m normalisee de facon a ce que
00073  *
00074  *          int_0^pi [ P_n^m(cos(theta)) ]^2  sin(theta) dtheta = 1
00075  *
00076  *          L'espace memoire correspondant au pointeur cfi doit etre 
00077  *              nr*nt*(np+2) et doit avoir ete alloue avant 
00078  *          l'appel a la routine.    
00079  *          Le coefficient a_l (0 <= l <= nt-1) doit etre stoke dans le 
00080  *          tableau cfi comme suit
00081  *                a_l = cfi[ nr*nt* k + i + nr* l ]
00082  *          ou k et i sont les indices correspondant a phi et r 
00083  *          respectivement: m = k/2.
00084  *          NB: pour m pair et l < m/2,  a_l = 0
00085  *          pour m impair et l < (m-1)/2,  a_l = 0
00086  *
00087  * NB: Si le pointeur cf est egal a ff, la routine ne travaille que sur un 
00088  *     seul tableau, qui constitue une entree/sortie.
00089  *
00090  */
00091 
00092 /*
00093  * $Id: cftlegp.C,v 1.4 2005/02/18 13:14:10 j_novak Exp $
00094  * $Log: cftlegp.C,v $
00095  * Revision 1.4  2005/02/18 13:14:10  j_novak
00096  * Changing of malloc/free to new/delete + suppression of some unused variables
00097  * (trying to avoid compilation warnings).
00098  *
00099  * Revision 1.3  2003/01/31 10:31:23  e_gourgoulhon
00100  * Suppressed the directive #include <malloc.h> for malloc is defined
00101  * in <stdlib.h>
00102  *
00103  * Revision 1.2  2002/10/16 14:36:52  j_novak
00104  * Reorganization of #include instructions of standard C++, in order to
00105  * use experimental version 3 of gcc.
00106  *
00107  * Revision 1.1.1.1  2001/11/20 15:19:28  e_gourgoulhon
00108  * LORENE
00109  *
00110  * Revision 2.0  1999/02/22  15:46:47  hyc
00111  * *** empty log message ***
00112  *
00113  *
00114  * $Header: /cvsroot/Lorene/C++/Source/Non_class_members/Coef/cftlegp.C,v 1.4 2005/02/18 13:14:10 j_novak Exp $
00115  *
00116  */
00117 
00118 // headers du C
00119 #include <assert.h>
00120 #include <stdlib.h>
00121 
00122 // headers bien de chez nous
00123 #include "headcpp.h"
00124 #include "proto.h"
00125 //*****************************************************************************
00126 
00127 void cftlegp(const int* deg, const int* dimf, double* ff, const int* dimc,
00128         double* cf)
00129 {
00130 
00131 // Limitations de la routine:
00132     assert(dimc[0]==deg[0]+2) ;
00133     assert(dimc[1]==deg[1]) ;
00134     assert(dimc[2]==deg[2]) ;
00135 
00136 
00137     // Tableau de travail :
00138     int taille = dimc[0]*dimc[1]*dimc[2] ;
00139     double* cf_cs =  new double[taille] ; 
00140 
00141 //--------------------------------------------------------------
00142 // 1/ Transformation esp. des configurations --> cos(2l theta)/sin((2l+1)theta) 
00143 //--------------------------------------------------------------
00144 
00145     cftcossincp(deg, dimf, ff, dimc, cf_cs) ;
00146 
00147 //--------------------------------------------------------------
00148 // 2/ Transformation  cos(2l theta)/sin((2l+1)theta) ---> Legendre 
00149 //--------------------------------------------------------------
00150 
00151     chb_cossincp_legp(deg , cf_cs, cf) ;
00152 
00153     // Menage
00154     delete [] cf_cs ;
00155 }

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