valeur_ylm_i.C

00001 /*
00002  *   Copyright (c) 1999-2003 Eric Gourgoulhon
00003  *   Copyright (c) 1999-2001 Philippe Grandclement
00004  *
00005  *   This file is part of LORENE.
00006  *
00007  *   LORENE is free software; you can redistribute it and/or modify
00008  *   it under the terms of the GNU General Public License as published by
00009  *   the Free Software Foundation; either version 2 of the License, or
00010  *   (at your option) any later version.
00011  *
00012  *   LORENE is distributed in the hope that it will be useful,
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *   GNU General Public License for more details.
00016  *
00017  *   You should have received a copy of the GNU General Public License
00018  *   along with LORENE; if not, write to the Free Software
00019  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020  *
00021  */
00022 
00023 
00024 char valeur_ylm_i_C[] = "$Header: /cvsroot/Lorene/C++/Source/Valeur/valeur_ylm_i.C,v 1.10 2009/10/23 12:56:29 j_novak Exp $" ;
00025 
00026 /*
00027  * Fonction membre de la classe Valeur qui calcule les coefficients
00028  * de la decomposition en cos(l*theta) / sin(l*theta)  
00029  * a partir des coefficients de la decomp. en harmoniques spheriques 
00030  * 
00031  */
00032 
00033 
00034 /*
00035  * $Id: valeur_ylm_i.C,v 1.10 2009/10/23 12:56:29 j_novak Exp $
00036  * $Log: valeur_ylm_i.C,v $
00037  * Revision 1.10  2009/10/23 12:56:29  j_novak
00038  * New base T_LEG_MI
00039  *
00040  * Revision 1.9  2009/10/13 13:49:58  j_novak
00041  * New base T_LEG_MP.
00042  *
00043  * Revision 1.8  2005/11/22 10:13:44  p_grandclement
00044  * Correction of the normalization in the case nt=1
00045  *
00046  * Revision 1.7  2005/02/16 15:33:14  m_forot
00047  * Correct the case T_LEG
00048  *
00049  * Revision 1.6  2004/11/23 15:17:20  m_forot
00050  * Added the bases for the cases without any equatorial symmetry
00051  *  (T_COSSIN_C, T_COSSIN_S, T_LEG, R_CHEBPI_P, R_CHEBPI_I).
00052  *
00053  * Revision 1.5  2003/10/13 20:52:58  e_gourgoulhon
00054  * Loop variables i and l have now local scope.
00055  *
00056  * Revision 1.4  2003/09/17 12:30:22  j_novak
00057  * New checks for changing to T_LEG* bases.
00058  *
00059  * Revision 1.3  2003/09/16 08:54:09  j_novak
00060  * Addition of the T_LEG_II base (odd in theta, only for odd m) and the
00061  * transformation functions to and from the T_SIN_P base.
00062  *
00063  * Revision 1.2  2002/10/16 14:37:16  j_novak
00064  * Reorganization of #include instructions of standard C++, in order to
00065  * use experimental version 3 of gcc.
00066  *
00067  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00068  * LORENE
00069  *
00070  * Revision 2.11  2000/09/29  16:10:37  eric
00071  * Ajout des bases T_LEG_IP et T_LEG_PI.
00072  *
00073  * Revision 2.10  2000/03/31  15:58:26  phil
00074  * changement des bases meme si etat est zero
00075  *
00076  * Revision 2.9  1999/12/22  16:25:52  eric
00077  * Traitement du cas ETATZERO
00078  * Test sur c_cf avant d'appeler coef().
00079  *
00080  * Revision 2.8  1999/12/16  16:41:43  phil
00081  * *** empty log message ***
00082  *
00083  * Revision 2.7  1999/12/16  16:10:07  phil
00084  * correction cas nt = 1.
00085  *
00086  * Revision 2.6  1999/11/30  12:46:40  eric
00087  * Valeur::base est desormais du type Base_val et non plus Base_val*.
00088  *
00089  * Revision 2.5  1999/11/22  11:36:14  eric
00090  * Suppression de #include "tenseur.h"
00091  *
00092  * Revision 2.4  1999/10/18  14:12:39  eric
00093  * Les bases sont desormais membres des Mtbl_cf.
00094  *
00095  * Revision 2.3  1999/04/14  10:19:52  phil
00096  * *** empty log message ***
00097  *
00098  * Revision 2.2  1999/04/14  09:53:21  phil
00099  * remplacement de malloc en new
00100  *
00101  * Revision 2.1  1999/04/14  09:38:47  phil
00102  * Changement liberation memoire : free -> delete
00103  *
00104  * Revision 2.0  1999/04/13  16:47:28  phil
00105  * *** empty log message ***
00106  *
00107  *
00108  * $Header: /cvsroot/Lorene/C++/Source/Valeur/valeur_ylm_i.C,v 1.10 2009/10/23 12:56:29 j_novak Exp $
00109  *
00110  */
00111 
00112 // headers C
00113 #include <assert.h>
00114 #include <stdlib.h>
00115 #include <math.h>
00116 
00117 // headers Lorene
00118 #include "type_parite.h"
00119 #include "valeur.h"
00120 #include "proto.h"
00121 
00122 void ylm_i_pasprevu(const int*, const double*, double*) ;
00123 
00124 void Valeur::ylm_i() {
00125 
00126     static void (*chbase_t[MAX_BASE])(const int*, const double*,
00127                             double*) ;
00128     static int nouv_base_t[MAX_BASE] ;   
00129     static int premier_appel = 1 ;
00130     
00131     int deg[3] ;
00132 
00133     if (premier_appel==1) {
00134     premier_appel = 0 ;
00135 
00136     for (int i=0; i<MAX_BASE; i++) {
00137         chbase_t[i] = ylm_i_pasprevu ;
00138         nouv_base_t[i] = NONDEF ; 
00139     }
00140         
00141     chbase_t[T_LEG_P >> TRA_T] = chb_legp_cossincp ;
00142     nouv_base_t[T_LEG_P >> TRA_T] = T_COSSIN_CP  ;
00143 
00144     chbase_t[T_LEG_I >> TRA_T] = chb_legi_cossinci ;
00145     nouv_base_t[T_LEG_I >> TRA_T] = T_COSSIN_CI  ;
00146 
00147     chbase_t[T_LEG >> TRA_T] = chb_leg_cossinc ;
00148     nouv_base_t[T_LEG >> TRA_T] = T_COSSIN_C  ;
00149 
00150     chbase_t[T_LEG_MP >> TRA_T] = chb_legmp_cos ;
00151     nouv_base_t[T_LEG_MP >> TRA_T] = T_COS  ;
00152 
00153     chbase_t[T_LEG_MI >> TRA_T] = chb_legmi_sin ;
00154     nouv_base_t[T_LEG_MI >> TRA_T] = T_SIN  ;
00155 
00156     chbase_t[T_LEG_PP >> TRA_T] = chb_legpp_cosp ;
00157     nouv_base_t[T_LEG_PP >> TRA_T] = T_COS_P  ;
00158 
00159     chbase_t[T_LEG_IP >> TRA_T] = chb_legip_cosi ;
00160     nouv_base_t[T_LEG_IP >> TRA_T] = T_COS_I  ;
00161 
00162     chbase_t[T_LEG_PI >> TRA_T] = chb_legpi_sini ;
00163     nouv_base_t[T_LEG_PI >> TRA_T] = T_SIN_I  ;
00164 
00165     chbase_t[T_LEG_II >> TRA_T] = chb_legii_sinp ;
00166     nouv_base_t[T_LEG_II >> TRA_T] = T_SIN_P  ;
00167     }
00168 
00169 //---------------------------------------------------------------------------
00170 // fin des operation de premier appel 
00171 //---------------------------------------------------------------------------
00172 
00173     // Tout null ?
00174     int nzone = get_mg()->get_nzone() ;
00175     if (etat == ETATZERO) {
00176     for (int l=0 ; l<nzone ; l++) {
00177         int vbase_r = base.b[l] & MSQ_R  ;
00178         int vbase_t = base.b[l] & MSQ_T  ;
00179         int vbase_p = base.b[l] & MSQ_P  ;
00180         
00181         int vbase_t_tra =  vbase_t  >> TRA_T ;
00182         base.b[l] = ( vbase_p | nouv_base_t[vbase_t_tra] ) | vbase_r ;
00183     }
00184     return ;
00185     }
00186     
00187     // Protection
00188     assert(etat != ETATNONDEF) ;
00189         
00190     if (c_cf == 0x0) {
00191     coef() ;     // The coefficients are required
00192     }
00193     
00194 // Boucle sur les differentes zones
00195 
00196     
00197     for (int l=0; l<nzone; l++) {
00198     
00199 // On recupere les anciennes bases en r, phi et theta : 
00200         int vbase_r = base.b[l] & MSQ_R  ;
00201         int vbase_t = base.b[l] & MSQ_T  ;
00202         int vbase_p = base.b[l] & MSQ_P  ;
00203         
00204         if ((vbase_t != T_COSSIN_CP) && (vbase_t != T_COS_I) &&
00205         (vbase_t != T_COS_P) && (vbase_t != T_COSSIN_CI) &&
00206         (vbase_t != T_SIN_P) && (vbase_t != T_SIN_I) && 
00207         (vbase_t != T_COSSIN_C) && (vbase_t != T_COSSIN_S) &&
00208         (vbase_t != T_COS) && (vbase_t != T_SIN) ) 
00209           { // cas ou le calcul est necessaire
00210         
00211         int vbase_t_tra =  vbase_t  >> TRA_T ;
00212         assert(vbase_t_tra < MAX_BASE) ; 
00213         bool pair = ( (vbase_t == T_LEG_PP) || (vbase_t == T_LEG_IP) ||
00214                   (vbase_t == T_LEG_MP) ) ;
00215         bool impair = ( (vbase_t == T_LEG_PI) || (vbase_t == T_LEG_II) ||
00216                 (vbase_t == T_LEG_MI) ) ;
00217 
00218 // Nouvelle base : 
00219         base.b[l] = ( vbase_p | nouv_base_t[vbase_t_tra] ) | vbase_r ;
00220         if (get_mg()->get_nt(l)==1) {
00221             *c_cf->t[l] /= sqrt(2.) ;
00222             continue ;
00223             }
00224 //... tbl contenant les coefficients dans la zone l : 
00225         Tbl* cf =  c_cf->t[l]  ;
00226 
00227         if (cf->get_etat() == ETATZERO) continue ; // On ne fait rien si le tbl = 0 
00228 
00229 //... resultat du calcul :
00230         double* resu = new double [cf->get_taille()] ;
00231 
00232         deg[0] = get_mg()->get_np(l) ;     // nb. de degres de liberte en phi
00233         deg[1] = get_mg()->get_nt(l) ;     // nb. de degres de liberte en theta
00234         deg[2] = get_mg()->get_nr(l) ;     // nb. de degres de liberte en r
00235                 
00236         
00237 // Transformation en theta:
00238 //-------------------------
00239 
00240         if ((pair && (vbase_p == P_COSSIN_I)) ||
00241             (impair && (vbase_p == P_COSSIN_P)) )
00242           ylm_i_pasprevu(deg, (cf->t), resu ) ;
00243         else
00244           chbase_t[vbase_t_tra](deg, (cf->t), resu ) ;
00245         
00246         // On branche le tbl contenant les coef sur resu : 
00247         delete [] cf->t ;   // les anciens coef. sont oublies
00248         cf->t = resu ;  // nouveaux coef.
00249 
00250       } // fin du cas ou la transformation devait etre effectuee
00251         
00252     }  // fin de la boucle sur les differentes zones
00253 
00254     // On met les bonnes bases dans c_cf : 
00255     c_cf->base = base ; 
00256 
00257 }
00258 
00259 //******************************************************************************
00260 
00261 void ylm_i_pasprevu(const int*, const double*, double*) {
00262 
00263     cout << 
00264      "Valeur::ylm_i: change of basis not implemented yet !" 
00265      << endl ;
00266     abort() ; 
00267 }
00268 
00269 

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