base_val_mult.C

00001 /*
00002  *   Copyright (c) 1999-2001 Philippe Grandclement
00003  *   Copyright (c) 2001 Eric Gourgoulhon
00004  *   Copyright (c) 2001 Keisuke Taniguchi
00005  *
00006  *   This file is part of LORENE.
00007  *
00008  *   LORENE is free software; you can redistribute it and/or modify
00009  *   it under the terms of the GNU General Public License as published by
00010  *   the Free Software Foundation; either version 2 of the License, or
00011  *   (at your option) any later version.
00012  *
00013  *   LORENE is distributed in the hope that it will be useful,
00014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  *   GNU General Public License for more details.
00017  *
00018  *   You should have received a copy of the GNU General Public License
00019  *   along with LORENE; if not, write to the Free Software
00020  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  */
00023 
00024 
00025 char base_val_mult_C[] = "$Header: /cvsroot/Lorene/C++/Source/Base_val/base_val_mult.C,v 1.8 2009/10/23 12:55:16 j_novak Exp $" ;
00026 
00027 /*
00028  * $Id: base_val_mult.C,v 1.8 2009/10/23 12:55:16 j_novak Exp $
00029  * $Log: base_val_mult.C,v $
00030  * Revision 1.8  2009/10/23 12:55:16  j_novak
00031  * New base T_LEG_MI
00032  *
00033  * Revision 1.7  2009/10/08 16:20:13  j_novak
00034  * Addition of new bases T_COS and T_SIN.
00035  *
00036  * Revision 1.6  2008/08/27 08:46:30  jl_cornou
00037  * Added R_JACO02 base (Jacobi(0,2) polynomials)
00038  *
00039  * Revision 1.5  2004/11/23 15:08:00  m_forot
00040  * Added the bases for the cases without any equatorial symmetry
00041  * (T_COSSIN_C, T_COSSIN_S, T_LEG, R_CHEBPI_P, R_CHEBPI_I).
00042  *
00043  * Revision 1.4  2002/10/16 14:36:30  j_novak
00044  * Reorganization of #include instructions of standard C++, in order to
00045  * use experimental version 3 of gcc.
00046  *
00047  * Revision 1.3  2002/08/02 15:07:41  j_novak
00048  * Member function determinant has been added to the class Metrique.
00049  * A better handling of spectral bases is now implemented for the class Tenseur.
00050  *
00051  * Revision 1.2  2002/02/07 14:55:07  e_gourgoulhon
00052  * Add more cases in theta and phi
00053  *
00054  * Revision 1.1.1.1  2001/11/20 15:19:28  e_gourgoulhon
00055  * LORENE
00056  *
00057  * Revision 2.3  2001/08/29  09:31:00  keisuke
00058  * Addition of the cases T_COSSIN_SP * T_COSSIN_SP,
00059  *  T_COSSIN_SI * T_COSSIN_SI, etc.
00060  *
00061  * Revision 2.2  2001/08/27  14:59:27  keisuke
00062  * Ajout du cas T_COSSIN_CP * T_COSSIN_SI
00063  *
00064  * Revision 2.1  2001/08/27  13:40:18  eric
00065  * Ajout du cas T_COSSIN_CP * T_COSSIN_SP
00066  *
00067  * Revision 2.0  1999/10/26  14:42:47  phil
00068  * *** empty log message ***
00069  *
00070  *
00071  * $Header: /cvsroot/Lorene/C++/Source/Base_val/base_val_mult.C,v 1.8 2009/10/23 12:55:16 j_novak Exp $
00072  *
00073  */
00074 
00075 // Fichier includes
00076 #include <stdlib.h>
00077 #include <stdio.h>
00078 #include <assert.h>
00079 
00080 #include "headcpp.h"
00081 #include "type_parite.h"
00082 #include "base_val.h"
00083 
00084 /*
00085  * Routine calculant le produit de deux bases spectrales en utilisant en fait 
00086  * le produit des symetries par rapport au plan z=0
00087  * 
00088  * Si le resultat n'est pas defini le resultat est dans etat == ETATNONDEF
00089  * 
00090  */
00091 
00092 Base_val operator* (const Base_val& b1, const Base_val& b2) {
00093     
00094     assert (b1.nzone == b2.nzone) ;
00095     
00096     Base_val res(b1.nzone) ;
00097     
00098     int base, indic_r, indic_t, indic_p ;
00099     int b1_r, b2_r, b1_t, b2_t, b1_p, b2_p ; // Confort ;
00100     
00101     int indic_total = 1 ;
00102     
00103     //Boucle sur les zones :
00104     for (int l=0 ; l<b1.nzone ; l++) {
00105     
00106     indic_r = -1 ;
00107     indic_t = -1 ;
00108     indic_p = -1 ;
00109     
00110     b1_r = b1.b[l] & MSQ_R ;
00111     b1_t = b1.b[l] & MSQ_T ;
00112     b1_p = b1.b[l] & MSQ_P ;
00113     b2_r = b2.b[l] & MSQ_R ;
00114     b2_t = b2.b[l] & MSQ_T ;
00115     b2_p = b2.b[l] & MSQ_P ;
00116     
00117     base = 0 ;
00118     
00119     switch (b1_p) {
00120         case P_COSSIN :
00121         switch (b2_p) {
00122             case P_COSSIN :
00123             base = P_COSSIN ;
00124             indic_p = 1 ;
00125             break ;
00126             default :
00127             break ;
00128         }
00129         break ;
00130         
00131         case P_COSSIN_P :
00132         switch (b2_p) {
00133             case P_COSSIN_P :
00134             base = P_COSSIN_P ;
00135             indic_p = 1 ;
00136             break ;
00137 
00138                     case P_COSSIN_I :
00139             base = P_COSSIN_I ;
00140             indic_p = 1 ;
00141             break ;
00142 
00143                     default :
00144             break ;
00145         }
00146         break ;
00147 
00148         case P_COSSIN_I :
00149         switch (b2_p) {
00150             case P_COSSIN_P :
00151             base = P_COSSIN_I ;
00152             indic_p = 1 ;
00153             break ;
00154 
00155                     case P_COSSIN_I :
00156             base = P_COSSIN_P ;
00157             indic_p = 1 ;
00158             break ;
00159 
00160                     default :
00161             break ;
00162         }
00163         break ;
00164 
00165         default :
00166         break ;
00167     }
00168 
00169     switch (b1_t) {
00170         
00171         case T_COSSIN_CP :
00172         switch (b2_t) {
00173             case T_COSSIN_CP :
00174             base = base | T_COSSIN_CP ;
00175             indic_t = 1 ;
00176             break ;
00177             
00178             case T_COSSIN_CI :
00179             base = base | T_COSSIN_CI ;
00180             indic_t = 1 ;
00181             break ;
00182             
00183             case T_COSSIN_SP :
00184             base = base | T_COSSIN_SP ;
00185             indic_t = 1 ;
00186             break ;
00187 
00188             case T_COSSIN_SI :
00189             base = base | T_COSSIN_SI ;
00190             indic_t = 1 ;
00191             break ;
00192             
00193             default :
00194             break ;
00195         }
00196         break ;
00197         
00198         case T_COSSIN_CI : 
00199         switch (b2_t) {
00200             case T_COSSIN_CP :
00201             base = base | T_COSSIN_CI ;
00202             indic_t = 1 ;
00203             break ;
00204             
00205             case T_COSSIN_CI :
00206             base = base | T_COSSIN_CP ;
00207             indic_t = 1 ;
00208             break ;
00209             
00210             case T_COSSIN_SP :
00211             base = base | T_COSSIN_SI ;
00212             indic_t = 1 ;
00213             break ;
00214 
00215             case T_COSSIN_SI :
00216             base = base | T_COSSIN_SP ;
00217             indic_t = 1 ;
00218             break ;
00219 
00220             default :
00221             break ; 
00222         }
00223         break ;
00224         
00225         case T_COSSIN_SP :
00226         switch (b2_t) {
00227             case T_COSSIN_CP :
00228             base = base | T_COSSIN_SP ;
00229             indic_t = 1 ;
00230             break ;
00231 
00232             case T_COSSIN_CI :
00233             base = base | T_COSSIN_SI ;
00234             indic_t = 1 ;
00235             break ;
00236 
00237             case T_COSSIN_SP :
00238             base = base | T_COSSIN_CP ;
00239             indic_t = 1 ;
00240             break ;
00241             
00242             case T_COSSIN_SI :
00243             base = base | T_COSSIN_CI ;
00244             indic_t = 1 ;
00245             break ;
00246 
00247             default :
00248             break ;
00249         }
00250         break ;
00251 
00252         case T_COSSIN_SI :
00253         switch (b2_t) {
00254             case T_COSSIN_CP :
00255             base = base | T_COSSIN_SI ;
00256             indic_t = 1 ;
00257             break ;
00258 
00259             case T_COSSIN_CI :
00260             base = base | T_COSSIN_SP ;
00261             indic_t = 1 ;
00262             break ;
00263 
00264             case T_COSSIN_SP :
00265             base = base | T_COSSIN_CI ;
00266             indic_t = 1 ;
00267             break ;
00268 
00269             case T_COSSIN_SI :
00270             base = base | T_COSSIN_CP ;
00271             indic_t = 1 ;
00272             break ;
00273             
00274             default :
00275             break ;
00276         }
00277         break ;
00278         
00279         case T_COS_P :
00280         switch (b2_t) {
00281             case T_COS_P :
00282             base = base | T_COS_P ;
00283             indic_t = 1 ;
00284             break ;
00285 
00286             case T_COS_I :
00287             base = base | T_COS_I ;
00288             indic_t = 1 ;
00289             break ;
00290 
00291             case T_SIN_I :
00292             base = base | T_SIN_I ;
00293             indic_t = 1 ;
00294             break ;
00295 
00296             case T_SIN_P :
00297             base = base | T_SIN_P ;
00298             indic_t = 1 ;
00299             break ;
00300 
00301                     default :
00302             break ;
00303         }
00304         break ;
00305 
00306         case T_COS_I :
00307         switch (b2_t) {
00308             case T_COS_P :
00309             base = base | T_COS_I ;
00310             indic_t = 1 ;
00311             break ;
00312             
00313             case T_COS_I :
00314             base = base | T_COS_P ;
00315             indic_t = 1 ;
00316             break ;
00317 
00318             case T_SIN_I :
00319             base = base | T_SIN_P ;
00320             indic_t = 1 ;
00321             break ;
00322 
00323             case T_SIN_P :
00324             base = base | T_SIN_I ;
00325             indic_t = 1 ;
00326             break ;
00327 
00328             default :
00329             break ;
00330         }
00331         break ;
00332         
00333         case T_SIN_P :
00334         switch (b2_t) {
00335             case T_SIN_P :
00336             base = base | T_COS_P ;
00337             indic_t = 1 ;
00338             break ;
00339 
00340             case T_COS_P :
00341             base = base | T_SIN_P ;
00342             indic_t = 1 ;
00343             break ;
00344 
00345             case T_COS_I :
00346             base = base | T_SIN_I ;
00347             indic_t = 1 ;
00348             break ;
00349 
00350                     case T_SIN_I :
00351             base = base | T_COS_I ;
00352             indic_t = 1 ;
00353             break ;
00354 
00355             default :
00356             break ;
00357         }
00358         break ;
00359 
00360         case T_SIN_I :
00361         switch (b2_t) {
00362             case T_SIN_I :
00363             base = base | T_COS_P ;
00364             indic_t = 1 ;
00365             break ;
00366 
00367             case T_COS_I :
00368             base = base | T_SIN_P ;
00369             indic_t = 1 ;
00370             break ;
00371 
00372             case T_COS_P :
00373             base = base | T_SIN_I ;
00374             indic_t = 1 ;
00375             break ;
00376 
00377             case T_SIN_P :
00378             base = base | T_COS_I ;
00379             indic_t = 1 ;
00380             break ;
00381 
00382             default :
00383             break ;
00384         }
00385         break ;
00386 
00387         case T_COSSIN_C :
00388         switch (b2_t) {
00389             case T_COSSIN_C :
00390             base = base | T_COSSIN_C ;
00391             indic_t = 1 ;
00392             break ;
00393             
00394             case T_COSSIN_S :
00395             base = base | T_COSSIN_S ;
00396             indic_t = 1 ;
00397             break ;
00398                         
00399             default :
00400             break ;
00401         }
00402         break ;
00403 
00404          case T_COSSIN_S :
00405         switch (b2_t) {
00406             case T_COSSIN_C :
00407             base = base | T_COSSIN_S ;
00408             indic_t = 1 ;
00409             break ;
00410             
00411             case T_COSSIN_S :
00412             base = base | T_COSSIN_C ;
00413             indic_t = 1 ;
00414             break ;
00415                         
00416             default :
00417             break ;
00418         }
00419         break ;
00420 
00421         case T_LEG_P :
00422         switch (b2_t) {
00423             case T_LEG_P :
00424             base = base | T_LEG_P ;
00425             indic_t = 1 ;
00426             break ;
00427             case T_LEG_I :
00428             base = base | T_LEG_I ;
00429             indic_t = 1 ; 
00430             break ;
00431             default :
00432             break ;
00433         }
00434         break ;
00435         
00436         case T_COS :
00437         switch (b2_t) {
00438             case T_COS :
00439             base = base | T_COS ;
00440             indic_t = 1 ;
00441             break ;
00442             
00443             case T_SIN :
00444             base = base | T_SIN ;
00445             indic_t = 1 ;
00446             break ;
00447 
00448             default :
00449             break ;
00450         }
00451         break ;
00452         
00453         case T_SIN :
00454         switch (b2_t) {
00455             case T_SIN :
00456             base = base | T_COS ;
00457             indic_t = 1 ;
00458             break ;
00459 
00460             case T_COS :
00461             base = base | T_SIN ;
00462             indic_t = 1 ;
00463             break ;
00464 
00465             default :
00466             break ;
00467         }
00468         break ;
00469 
00470         case T_LEG_I :
00471         switch (b2_t) {
00472             case T_LEG_P :
00473             base = base | T_LEG_I ;
00474             indic_t = 1 ;
00475             break ;
00476             case T_LEG_I :
00477             base = base | T_LEG_P ;
00478             indic_t = 1 ; 
00479             break ;
00480             default :
00481             break ;
00482         }
00483         break ; 
00484         
00485       
00486         case T_LEG :
00487         switch (b2_t) {
00488             case T_LEG :
00489             base = base | T_LEG ;
00490             indic_t = 1 ;
00491             break ;
00492            
00493             default :
00494             break ;
00495         }
00496         break ; 
00497         
00498         case T_LEG_MP :
00499         switch (b2_t) {
00500             case T_LEG_MP :
00501             base = base | T_LEG_MP ;
00502             indic_t = 1 ;
00503             break ;
00504            
00505             case T_LEG_MI :
00506             base = base | T_LEG_MI ;
00507             indic_t = 1 ;
00508             break ;
00509            
00510             default :
00511             break ;
00512         }
00513         break ; 
00514         
00515         case T_LEG_MI :
00516         switch (b2_t) {
00517             case T_LEG_MP :
00518             base = base | T_LEG_MI ;
00519             indic_t = 1 ;
00520             break ;
00521 
00522             case T_LEG_MI :
00523             base = base | T_LEG_MP ;
00524             indic_t = 1 ;
00525             break ;
00526            
00527             default :
00528             break ;
00529         }
00530         break ; 
00531         
00532         
00533         default :
00534         break ;
00535     }
00536     
00537     switch (b1_r) {
00538         
00539         case R_CHEB :
00540         switch (b2_r) {
00541             case R_CHEB :
00542             base = base | R_CHEB ;
00543             indic_r = 1 ;
00544             break ;
00545             
00546             default :
00547             break ;
00548         }
00549         break ;
00550 
00551         case R_JACO02 :
00552         switch (b2_r) {
00553             case R_JACO02 :
00554             base = base | R_JACO02 ;
00555             indic_r = 1 ;
00556             break ;
00557             
00558             default :
00559             break ;
00560         }
00561         break ;
00562         
00563         case R_CHEBU :
00564         switch (b2_r) {
00565             case R_CHEBU :
00566             base = base | R_CHEBU ;
00567             indic_r = 1 ;
00568             break ;
00569             
00570             default :
00571             break ;
00572         }
00573         break ;
00574         
00575         case R_CHEBPIM_P :
00576         switch (b2_r) {
00577             case R_CHEBPIM_P :
00578             base = base | R_CHEBPIM_P ;
00579             indic_r = 1 ;
00580             break ;
00581             
00582             case R_CHEBPIM_I :
00583             base = base | R_CHEBPIM_I ;
00584             indic_r = 1 ;
00585             break ;
00586             
00587             default :
00588             break ;
00589         }
00590         break ;
00591         
00592         case R_CHEBPIM_I :
00593         switch (b2_r) {
00594             case R_CHEBPIM_P :
00595             base = base | R_CHEBPIM_I ;
00596             indic_r = 1 ;
00597             break ;
00598             
00599             case R_CHEBPIM_I :
00600             base = base | R_CHEBPIM_P ;
00601             indic_r = 1 ;
00602             break ;
00603             
00604             default :
00605             break ;
00606         }
00607         break ;
00608 
00609          case R_CHEBPI_I :
00610         switch (b2_r) {
00611             case R_CHEBPI_P :
00612             base = base | R_CHEBPI_I ;
00613             indic_r = 1 ;
00614             break ;
00615             
00616             case R_CHEBPI_I :
00617             base = base | R_CHEBPI_P ;
00618             indic_r = 1 ;
00619             break ;
00620             
00621             default :
00622             break ;
00623         }
00624         break ;
00625 
00626          case R_CHEBPI_P :
00627         switch (b2_r) {
00628             case R_CHEBPI_P :
00629             base = base | R_CHEBPI_P ;
00630             indic_r = 1 ;
00631             break ;
00632             
00633             case R_CHEBPI_I :
00634             base = base | R_CHEBPI_I ;
00635             indic_r = 1 ;
00636             break ;
00637             
00638             default :
00639             break ;
00640         }
00641         break ;
00642         
00643         case R_CHEBP :
00644         switch (b2_r) {
00645             case R_CHEBP :
00646             base = base | R_CHEBP ;
00647             indic_r = 1 ;
00648             break ;
00649             
00650             case R_CHEBI : 
00651             base = base | R_CHEBI ;
00652             indic_r = 1 ;
00653             break ;
00654             
00655             default :
00656             break ;
00657         }
00658         break ;
00659         
00660         case R_CHEBI :
00661         switch (b2_r) {
00662             case R_CHEBP :
00663             base = base | R_CHEBI ;
00664             indic_r = 1 ;
00665             break ;
00666             
00667             case R_CHEBI : 
00668             base = base | R_CHEBP ;
00669             indic_r = 1 ;
00670             break ;
00671             
00672             default :
00673             break ;
00674         }
00675         break ;
00676      
00677      default :
00678         break ;   
00679     }
00680     
00681     if (indic_r*indic_t*indic_p == -1)
00682         indic_total = -1 ;
00683     
00684     res.b[l] = base ;
00685     }
00686     
00687     if (indic_total == -1)
00688     res.set_base_nondef() ;
00689     
00690     return res ;    
00691 }

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