op_lapang.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 op_lapang_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_lapang.C,v 1.7 2009/10/23 12:55:04 j_novak Exp $" ;
00024 
00025 /* 
00026  * Ensemble des routines de base pour le calcul du laplacien angulaire,
00027  * c'est-a-dire de l'operateur
00028  * 
00029  *  d^2/dtheta^2 + cos(theta)/sin(theta) d/dtheta + 1/sin(theta) d^2/dphi^2
00030  * 
00031  * (Utilisation interne)
00032  * 
00033  *  void _lapang_XXXX(Mtbl_cf * mt, int l)
00034  *  mt  pointeur sur le Mtbl_cf d'entree-sortie
00035  *  l   indice de la zone ou l'on doit effectuer le calcul
00036  * 
00037  */
00038 
00039 /*
00040  * $Id: op_lapang.C,v 1.7 2009/10/23 12:55:04 j_novak Exp $
00041  * $Log: op_lapang.C,v $
00042  * Revision 1.7  2009/10/23 12:55:04  j_novak
00043  * New base T_LEG_MI
00044  *
00045  * Revision 1.6  2009/10/13 19:45:01  j_novak
00046  * New base T_LEG_MP.
00047  *
00048  * Revision 1.5  2005/05/18 07:47:36  j_novak
00049  * Corrected an error for the T_LEG_II base (ll was set to 2j+1 instead of 2j for
00050  * sin(phi)).
00051  *
00052  * Revision 1.4  2004/12/17 13:20:55  m_forot
00053  * Add T_LEG base
00054  *
00055  * Revision 1.3  2003/09/16 12:11:59  j_novak
00056  * Added the base T_LEG_II.
00057  *
00058  * Revision 1.2  2002/10/16 14:36:58  j_novak
00059  * Reorganization of #include instructions of standard C++, in order to
00060  * use experimental version 3 of gcc.
00061  *
00062  * Revision 1.1.1.1  2001/11/20 15:19:29  e_gourgoulhon
00063  * LORENE
00064  *
00065  * Revision 2.2  2000/11/14  15:09:08  eric
00066  * Traitement du cas np=1 dans T_LEG_PI
00067  *
00068  * Revision 2.1  2000/10/04  14:54:59  eric
00069  * Ajout des bases T_LEG_IP et T_LEG_PI.
00070  *
00071  * Revision 2.0  1999/04/26  16:42:04  phil
00072  * *** empty log message ***
00073  *
00074  *
00075  * $Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_lapang.C,v 1.7 2009/10/23 12:55:04 j_novak Exp $
00076  *
00077  */
00078 
00079 // Headers C
00080 #include <stdlib.h>
00081 
00082 // Headers Lorene
00083 #include "mtbl_cf.h"
00084 #include "grilles.h"
00085 #include "type_parite.h"
00086 
00087 
00088         //--------------------------------------
00089         // Routine pour les cas non prevus ----
00090         //------------------------------------
00091 
00092 void _lapang_pas_prevu(Mtbl_cf* mt, int l) {
00093     cout << "Unknwon theta basis in the operator Mtbl_cf::lapang() !" << endl ;
00094     cout << " basis : " << hex << (mt->base).b[l] << endl ; 
00095     abort () ;
00096 }
00097             //---------------
00098             // cas T_LEG --
00099             //---------------
00100 
00101 void _lapang_t_leg(Mtbl_cf* mt, int l)
00102 {
00103 
00104     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00105     
00106     // Peut-etre rien a faire ?
00107     if (tb->get_etat() == ETATZERO) {
00108     return ;
00109     }
00110     
00111     int k, j, i ; 
00112     // Pour le confort
00113     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00114     int nt = mt->get_mg()->get_nt(l) ;   // de points
00115     int np = mt->get_mg()->get_np(l) ;   //     physiques
00116     
00117     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00118     
00119     double* tuu = tb->t ; 
00120 
00121     // k = 0  :
00122      
00123     for (j=0 ; j<nt ; j++) {
00124     int ll = j ;
00125     double xl = - ll*(ll+1) ;
00126     for (i=0 ; i<nr ; i++) {
00127         tuu[i] *= xl ;
00128     }   // Fin de boucle sur r
00129     tuu  += nr ;
00130     }     // Fin de boucle sur theta
00131 
00132     // On saute k = 1 : 
00133     tuu += nt*nr ; 
00134     
00135     // k=2,...
00136     for (k=2 ; k<np1 ; k++) {
00137     int m = k/2 ;
00138     tuu  += (m/2)*nr ;
00139     for (j=m/2 ; j<nt ; j++) {
00140         int ll = j;
00141         double xl = - ll*(ll+1) ;
00142         for (i=0 ; i<nr ; i++) {
00143         tuu[i] *= xl ;
00144         }   // Fin de boucle sur r
00145         tuu  += nr ;
00146     }     // Fin de boucle sur theta
00147     }   // Fin de boucle sur phi    
00148         
00149     // base de developpement inchangee 
00150 }
00151 
00152             //---------------
00153             // cas T_LEG_P --
00154             //---------------
00155 
00156 void _lapang_t_leg_p(Mtbl_cf* mt, int l)
00157 {
00158 
00159     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00160     
00161     // Peut-etre rien a faire ?
00162     if (tb->get_etat() == ETATZERO) {
00163     return ;
00164     }
00165     
00166     int k, j, i ; 
00167     // Pour le confort
00168     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00169     int nt = mt->get_mg()->get_nt(l) ;   // de points
00170     int np = mt->get_mg()->get_np(l) ;   //     physiques
00171     
00172     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00173     
00174     double* tuu = tb->t ; 
00175 
00176     // k = 0  :
00177      
00178     for (j=0 ; j<nt ; j++) {
00179     int ll = 2*j ;
00180     double xl = - ll*(ll+1) ;
00181     for (i=0 ; i<nr ; i++) {
00182         tuu[i] *= xl ;
00183     }   // Fin de boucle sur r
00184     tuu  += nr ;
00185     }     // Fin de boucle sur theta
00186 
00187     // On saute k = 1 : 
00188     tuu += nt*nr ; 
00189     
00190     // k=2,...
00191     for (k=2 ; k<np1 ; k++) {
00192     int m = k/2 ;
00193     tuu  += (m/2)*nr ;
00194     for (j=m/2 ; j<nt ; j++) {
00195         int ll = 2*j + (m%2) ;
00196         double xl = - ll*(ll+1) ;
00197         for (i=0 ; i<nr ; i++) {
00198         tuu[i] *= xl ;
00199         }   // Fin de boucle sur r
00200         tuu  += nr ;
00201     }     // Fin de boucle sur theta
00202     }   // Fin de boucle sur phi    
00203         
00204     // base de developpement inchangee 
00205 }
00206 
00207             //------------------
00208             // cas T_LEG_PP --
00209             //----------------
00210 
00211 void _lapang_t_leg_pp(Mtbl_cf* mt, int l)
00212 {
00213 
00214     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00215     
00216     // Peut-etre rien a faire ?
00217     if (tb->get_etat() == ETATZERO) {
00218     return ;
00219     }
00220     
00221     int k, j, i ; 
00222     // Pour le confort
00223     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00224     int nt = mt->get_mg()->get_nt(l) ;   // de points
00225     int np = mt->get_mg()->get_np(l) ;   //     physiques
00226     
00227     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00228     
00229     double* tuu = tb->t ; 
00230 
00231     // k = 0  :
00232      
00233     for (j=0 ; j<nt ; j++) {
00234     int ll = 2*j ;
00235     double xl = - ll*(ll+1) ;
00236     for (i=0 ; i<nr ; i++) {
00237         tuu[i] *= xl ;
00238     }   // Fin de boucle sur r
00239     tuu  += nr ;
00240     }     // Fin de boucle sur theta
00241 
00242     // On saute k = 1 : 
00243     tuu += nt*nr ; 
00244     
00245     // k=2,...
00246     for (k=2 ; k<np1 ; k++) {
00247     int m = 2*(k/2);
00248     tuu  += (m/2)*nr ;
00249     for (j=m/2 ; j<nt ; j++) {
00250         int ll = 2*j ;
00251         double xl = - ll*(ll+1) ;
00252         for (i=0 ; i<nr ; i++) {
00253         tuu[i] *= xl ;
00254         }   // Fin de boucle sur r
00255         tuu  += nr ;
00256     }     // Fin de boucle sur theta
00257     }   // Fin de boucle sur phi    
00258         
00259     // base de developpement inchangee 
00260 }
00261 
00262             //----------------
00263             // cas T_LEG_I --
00264             //---------------
00265 
00266 void _lapang_t_leg_i(Mtbl_cf* mt, int l)
00267 {
00268 
00269     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00270     
00271     // Peut-etre rien a faire ?
00272     if (tb->get_etat() == ETATZERO) {
00273     return ;
00274     }
00275     
00276     int k, j, i ; 
00277     // Pour le confort
00278     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00279     int nt = mt->get_mg()->get_nt(l) ;   // de points
00280     int np = mt->get_mg()->get_np(l) ;   //     physiques
00281     
00282     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00283     
00284     double* tuu = tb->t ; 
00285 
00286     // k = 0  :
00287      
00288     for (j=0 ; j<nt-1 ; j++) {
00289     int ll = 2*j+1 ;
00290     double xl = - ll*(ll+1) ;
00291     for (i=0 ; i<nr ; i++) {
00292         tuu[i] *= xl ;
00293     }   // Fin de boucle sur r
00294     tuu  += nr ;
00295     }     // Fin de boucle sur theta
00296     tuu  += nr ; // On saute j=nt-1
00297 
00298     // On saute k = 1 : 
00299     tuu += nt*nr ; 
00300     
00301     // k=2,...
00302     for (k=2 ; k<np1 ; k++) {
00303     int m = k/2 ;
00304     tuu  += ((m+1)/2)*nr ;
00305     for (j=(m+1)/2 ; j<nt-1 ; j++) {
00306         int ll = 2*j + ((m+1)%2) ;
00307         double xl = - ll*(ll+1) ;
00308         for (i=0 ; i<nr ; i++) {
00309         tuu[i] *= xl ;
00310         }   // Fin de boucle sur r
00311         tuu  += nr ;
00312     }     // Fin de boucle sur theta
00313     tuu  += nr ; // On saute j=nt-1
00314     }   // Fin de boucle sur phi    
00315         
00316     // base de developpement inchangee 
00317 }
00318 
00319             //------------------
00320             // cas T_LEG_IP --
00321             //----------------
00322 
00323 void _lapang_t_leg_ip(Mtbl_cf* mt, int l)
00324 {
00325 
00326     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00327     
00328     // Peut-etre rien a faire ?
00329     if (tb->get_etat() == ETATZERO) {
00330     return ;
00331     }
00332     
00333     int k, j, i ; 
00334     // Pour le confort
00335     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00336     int nt = mt->get_mg()->get_nt(l) ;   // de points
00337     int np = mt->get_mg()->get_np(l) ;   //     physiques
00338     
00339     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00340     
00341     double* tuu = tb->t ; 
00342 
00343     // k = 0  :
00344      
00345     for (j=0 ; j<nt-1 ; j++) {
00346     int ll = 2*j+1 ;
00347     double xl = - ll*(ll+1) ;
00348     for (i=0 ; i<nr ; i++) {
00349         tuu[i] *= xl ;
00350     }   // Fin de boucle sur r
00351     tuu  += nr ;
00352     }     // Fin de boucle sur theta
00353     tuu  += nr ; // On saute j=nt-1
00354 
00355     // On saute k = 1 : 
00356     tuu += nt*nr ; 
00357     
00358     // k=2,...
00359     for (k=2 ; k<np1 ; k++) {
00360     int m = 2*(k/2);
00361     tuu  += (m/2)*nr ;
00362     for (j=m/2 ; j<nt-1 ; j++) {
00363         int ll = 2*j+1 ;
00364         double xl = - ll*(ll+1) ;
00365         for (i=0 ; i<nr ; i++) {
00366         tuu[i] *= xl ;
00367         }   // Fin de boucle sur r
00368         tuu  += nr ;
00369     }     // Fin de boucle sur theta
00370     tuu  += nr ; // On saute j=nt-1
00371     }   // Fin de boucle sur phi    
00372 
00373 //## Verif
00374     assert (tuu == tb->t + (np+1)*nt*nr) ;
00375         
00376     // base de developpement inchangee 
00377 }
00378 
00379             //------------------
00380             // cas T_LEG_PI --
00381             //----------------
00382 
00383 void _lapang_t_leg_pi(Mtbl_cf* mt, int l)
00384 {
00385 
00386     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00387     
00388     // Peut-etre rien a faire ?
00389     if (tb->get_etat() == ETATZERO) {
00390     return ;
00391     }
00392     
00393     int k, j, i ; 
00394     // Pour le confort
00395     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00396     int nt = mt->get_mg()->get_nt(l) ;   // de points
00397     int np = mt->get_mg()->get_np(l) ;   //     physiques
00398     
00399     double* tuu = tb->t ; 
00400 
00401     // k = 0  :     cos(phi)
00402     // -----
00403      
00404     for (j=0 ; j<nt-1 ; j++) {
00405     int ll = 2*j+1 ;
00406     double xl = - ll*(ll+1) ;
00407     for (i=0 ; i<nr ; i++) {
00408         tuu[i] *= xl ;
00409     }   // Fin de boucle sur r
00410     tuu  += nr ;
00411     }     // Fin de boucle sur theta
00412     tuu  += nr ; // On saute j=nt-1
00413 
00414     if (np==1) {
00415     return ; 
00416     }
00417 
00418     // k = 1 : on saute
00419     // -----
00420     tuu += nt*nr ; 
00421     
00422     // k = 2 :  sin(phi)
00423     // ------
00424     for (j=0 ; j<nt-1 ; j++) {
00425     int ll = 2*j+1 ;
00426     double xl = - ll*(ll+1) ;
00427     for (i=0 ; i<nr ; i++) {
00428         tuu[i] *= xl ;
00429     }   // Fin de boucle sur r
00430     tuu  += nr ;
00431     }     // Fin de boucle sur theta
00432     tuu  += nr ; // On saute j=nt-1
00433 
00434     // 3 <= k <= np
00435     // ------------
00436     for (k=3 ; k<np+1 ; k++) {
00437     int m = (k%2 == 0) ? k-1 : k ;
00438     tuu  += (m-1)/2*nr ;
00439     for (j=(m-1)/2 ; j<nt-1 ; j++) {
00440         int ll = 2*j+1 ;
00441         double xl = - ll*(ll+1) ;
00442         for (i=0 ; i<nr ; i++) {
00443         tuu[i] *= xl ;
00444         }   // Fin de boucle sur r
00445         tuu  += nr ;
00446     }     // Fin de boucle sur theta
00447     tuu  += nr ; // On saute j=nt-1
00448     }   // Fin de boucle sur phi    
00449 
00450 //## Verif
00451     assert (tuu == tb->t + (np+1)*nt*nr) ;
00452         
00453     // base de developpement inchangee 
00454 }
00455 
00456             //------------------
00457             // cas T_LEG_II --
00458             //----------------
00459 
00460 void _lapang_t_leg_ii(Mtbl_cf* mt, int l)
00461 {
00462 
00463     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00464     
00465     // Peut-etre rien a faire ?
00466     if (tb->get_etat() == ETATZERO) {
00467     return ;
00468     }
00469     
00470     int k, j, i ; 
00471     // Pour le confort
00472     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00473     int nt = mt->get_mg()->get_nt(l) ;   // de points
00474     int np = mt->get_mg()->get_np(l) ;   //     physiques
00475     
00476     double* tuu = tb->t ; 
00477 
00478     // k = 0  :     cos(phi)
00479     // -----
00480      
00481     for (j=0 ; j<nt-1 ; j++) {
00482     int ll = 2*j ;
00483     double xl = - ll*(ll+1) ;
00484     for (i=0 ; i<nr ; i++) {
00485         tuu[i] *= xl ;
00486     }   // Fin de boucle sur r
00487     tuu  += nr ;
00488     }     // Fin de boucle sur theta
00489     tuu  += nr ; // On saute j=nt-1
00490 
00491     if (np==1) {
00492     return ; 
00493     }
00494 
00495     // k = 1 : on saute
00496     // -----
00497     tuu += nt*nr ; 
00498     
00499     // k = 2 :  sin(phi)
00500     // ------
00501     for (j=0 ; j<nt-1 ; j++) {
00502     int ll = 2*j ;
00503     double xl = - ll*(ll+1) ;
00504     for (i=0 ; i<nr ; i++) {
00505         tuu[i] *= xl ;
00506     }   // Fin de boucle sur r
00507     tuu  += nr ;
00508     }     // Fin de boucle sur theta
00509     tuu  += nr ; // On saute j=nt-1
00510 
00511     // 3 <= k <= np
00512     // ------------
00513     for (k=3 ; k<np+1 ; k++) {
00514     int m = (k%2 == 0) ? k-1 : k ;
00515     tuu  += (m+1)/2*nr ;
00516     for (j=(m+1)/2 ; j<nt-1 ; j++) {
00517         int ll = 2*j ;
00518         double xl = - ll*(ll+1) ;
00519         for (i=0 ; i<nr ; i++) {
00520         tuu[i] *= xl ;
00521         }   // Fin de boucle sur r
00522         tuu  += nr ;
00523     }     // Fin de boucle sur theta
00524     tuu  += nr ; // On saute j=nt-1
00525     }   // Fin de boucle sur phi    
00526 
00527 //## Verif
00528     assert (tuu == tb->t + (np+1)*nt*nr) ;
00529         
00530     // base de developpement inchangee 
00531 }
00532 
00533             //----------------
00534             // cas T_LEG_MP --
00535             //----------------
00536 
00537 void _lapang_t_leg_mp(Mtbl_cf* mt, int l)
00538 {
00539 
00540     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00541     
00542     // Peut-etre rien a faire ?
00543     if (tb->get_etat() == ETATZERO) {
00544     return ;
00545     }
00546     
00547     int k, j, i ; 
00548     // Pour le confort
00549     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00550     int nt = mt->get_mg()->get_nt(l) ;   // de points
00551     int np = mt->get_mg()->get_np(l) ;   //     physiques
00552     
00553     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00554     
00555     double* tuu = tb->t ; 
00556 
00557     // k = 0  :
00558      
00559     for (j=0 ; j<nt ; j++) {
00560     int ll = j ;
00561     double xl = - ll*(ll+1) ;
00562     for (i=0 ; i<nr ; i++) {
00563         tuu[i] *= xl ;
00564     }   // Fin de boucle sur r
00565     tuu  += nr ;
00566     }     // Fin de boucle sur theta
00567 
00568     // On saute k = 1 : 
00569     tuu += nt*nr ; 
00570     
00571     // k=2,...
00572     for (k=2 ; k<np1 ; k++) {
00573     int m = 2*(k/2);
00574     tuu  += m*nr ;
00575     for (j=m ; j<nt ; j++) {
00576         int ll = j ;
00577         double xl = - ll*(ll+1) ;
00578         for (i=0 ; i<nr ; i++) {
00579         tuu[i] *= xl ;
00580         }   // Fin de boucle sur r
00581         tuu  += nr ;
00582     }     // Fin de boucle sur theta
00583     }   // Fin de boucle sur phi    
00584         
00585     // base de developpement inchangee 
00586 }
00587             //----------------
00588             // cas T_LEG_MI --
00589             //----------------
00590 
00591 void _lapang_t_leg_mi(Mtbl_cf* mt, int l)
00592 {
00593 
00594     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00595     
00596     // Peut-etre rien a faire ?
00597     if (tb->get_etat() == ETATZERO) {
00598     return ;
00599     }
00600     
00601     int k, j, i ; 
00602     // Pour le confort
00603     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00604     int nt = mt->get_mg()->get_nt(l) ;   // de points
00605     int np = mt->get_mg()->get_np(l) ;   //     physiques
00606     
00607     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00608     
00609     double* tuu = tb->t ; 
00610 
00611     // k = 0  :
00612      
00613     for (j=0 ; j<nt ; j++) {
00614     int ll = j ;
00615     double xl = - ll*(ll+1) ;
00616     for (i=0 ; i<nr ; i++) {
00617         tuu[i] *= xl ;
00618     }   // Fin de boucle sur r
00619     tuu  += nr ;
00620     }     // Fin de boucle sur theta
00621 
00622     // On saute k = 1 : 
00623     tuu += nt*nr ; 
00624     
00625     // k=2,...
00626     for (k=2 ; k<np1 ; k++) {
00627     int m = 2*((k-1)/2) + 1;
00628     tuu  += m*nr ;
00629     for (j=m ; j<nt ; j++) {
00630         int ll = j ;
00631         double xl = - ll*(ll+1) ;
00632         for (i=0 ; i<nr ; i++) {
00633         tuu[i] *= xl ;
00634         }   // Fin de boucle sur r
00635         tuu  += nr ;
00636     }     // Fin de boucle sur theta
00637     }   // Fin de boucle sur phi    
00638         
00639     // base de developpement inchangee 
00640 }

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