poisson_angu.C

00001 /*
00002  *  Resolution of the angular Poisson equation. 
00003  *
00004  *
00005  */
00006 
00007 /*
00008  *   Copyright (c) 2003-2005 Eric Gourgoulhon & Jerome Novak
00009  *
00010  *
00011  *   This file is part of LORENE.
00012  *
00013  *   LORENE is free software; you can redistribute it and/or modify
00014  *   it under the terms of the GNU General Public License as published by
00015  *   the Free Software Foundation; either version 2 of the License, or
00016  *   (at your option) any later version.
00017  *
00018  *   LORENE is distributed in the hope that it will be useful,
00019  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00020  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021  *   GNU General Public License for more details.
00022  *
00023  *   You should have received a copy of the GNU General Public License
00024  *   along with LORENE; if not, write to the Free Software
00025  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00026  *
00027  */
00028 
00029 
00030 char poisson_angu_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/PDE/poisson_angu.C,v 1.7 2009/10/23 12:55:04 j_novak Exp $" ;
00031 
00032 
00033 /*
00034  * $Id: poisson_angu.C,v 1.7 2009/10/23 12:55:04 j_novak Exp $
00035  * $Log: poisson_angu.C,v $
00036  * Revision 1.7  2009/10/23 12:55:04  j_novak
00037  * New base T_LEG_MI
00038  *
00039  * Revision 1.6  2009/10/13 19:45:01  j_novak
00040  * New base T_LEG_MP.
00041  *
00042  * Revision 1.5  2005/04/08 07:36:20  f_limousin
00043  * Add #include <math.h> to avoid error in the compilation with gcc 3.3.1
00044  * (problem with fabs).
00045  *
00046  * Revision 1.4  2005/04/05 08:34:10  e_gourgoulhon
00047  * Treatment case l(l+1) = lambda.
00048  *
00049  * Revision 1.3  2005/04/04 21:33:37  e_gourgoulhon
00050  * Solving now for the generalized angular Poisson equation
00051  *    Lap_ang u + lambda u = source
00052  * with new parameter lambda.
00053  *
00054  * Revision 1.2  2004/12/17 13:35:03  m_forot
00055  * Add the case T_LEG
00056  *
00057  * Revision 1.1  2003/10/15 21:13:28  e_gourgoulhon
00058  * First version.
00059  *
00060  *
00061  * $Header: /cvsroot/Lorene/C++/Source/Non_class_members/PDE/poisson_angu.C,v 1.7 2009/10/23 12:55:04 j_novak Exp $
00062  *
00063  */
00064 
00065 // Headers C
00066 #include <stdlib.h>
00067 #include <math.h>
00068 
00069 // Headers Lorene
00070 #include "mtbl_cf.h"
00071 #include "grilles.h"
00072 #include "type_parite.h"
00073 
00074 
00075         //--------------------------------------
00076         // Routine pour les cas non prevus ----
00077         //------------------------------------
00078 
00079 void _poisangu_pas_prevu(Mtbl_cf* mt, int l, double) {
00080     cout << "Unknwon theta basis in the operator Mtbl_cf::poisson_angu() !" << endl ;
00081     cout << " basis : " << hex << (mt->base).b[l] << endl ; 
00082     abort () ;
00083 }
00084 
00085             //---------------
00086             // cas T_LEG --
00087             //---------------
00088 
00089 void _poisangu_t_leg(Mtbl_cf* mt, int l, double lambda)
00090 {
00091 
00092     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00093     
00094     // Peut-etre rien a faire ?
00095         if (tb->get_etat() == ETATZERO) {
00096         return ;
00097     }
00098     
00099     int k, j, i ; 
00100     // Pour le confort
00101     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00102     int nt = mt->get_mg()->get_nt(l) ;   // de points
00103     int np = mt->get_mg()->get_np(l) ;   //     physiques
00104     
00105     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00106     
00107     double* tuu = tb->t ; 
00108 
00109     // k = 0  :
00110      
00111     for (j=0 ; j<nt ; j++) {
00112         int ll = j ;
00113         double xl = - ll*(ll+1) + lambda ;
00114 
00115         if (fabs(xl) < 1.e-14) {
00116             for (i=0 ; i<nr ; i++) {
00117                 tuu[i] = 0 ;
00118             }   
00119         }
00120         else {
00121             for (i=0 ; i<nr ; i++) {
00122                 tuu[i] /= xl ;
00123             }   
00124         }
00125         tuu  += nr ;
00126     }     // Fin de boucle sur theta
00127 
00128     // On saute k = 1 : 
00129     tuu += nt*nr ; 
00130     
00131     // k=2,...
00132     for (k=2 ; k<np1 ; k++) {
00133     int m = k/2 ;
00134     tuu  += (m/2)*nr ;
00135     for (j=m/2 ; j<nt ; j++) {
00136         int ll = j ;
00137         double xl = - ll*(ll+1) + lambda ;
00138         
00139         if (fabs(xl) < 1.e-14) {
00140             for (i=0 ; i<nr ; i++) {
00141                 tuu[i] = 0 ;
00142             }   
00143         }
00144         else {
00145             for (i=0 ; i<nr ; i++) {
00146                 tuu[i] /= xl ;
00147             }   
00148         }
00149         tuu  += nr ;
00150     }     // Fin de boucle sur theta
00151     }   // Fin de boucle sur phi    
00152 
00153     // base de developpement inchangee 
00154 }
00155 
00156             //---------------
00157             // cas T_LEG_P --
00158             //---------------
00159 
00160 void _poisangu_t_leg_p(Mtbl_cf* mt, int l, double lambda)
00161 {
00162 
00163     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00164     
00165     // Peut-etre rien a faire ?
00166         if (tb->get_etat() == ETATZERO) {
00167         return ;
00168     }
00169     
00170     int k, j, i ; 
00171     // Pour le confort
00172     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00173     int nt = mt->get_mg()->get_nt(l) ;   // de points
00174     int np = mt->get_mg()->get_np(l) ;   //     physiques
00175     
00176     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00177     
00178     double* tuu = tb->t ; 
00179 
00180     // k = 0  :
00181      
00182     for (j=0 ; j<nt ; j++) {
00183         int ll = 2*j ;
00184         double xl = - ll*(ll+1) + lambda ;
00185 
00186         if (fabs(xl) < 1.e-14) {
00187             for (i=0 ; i<nr ; i++) {
00188                 tuu[i] = 0 ;
00189             }   
00190         }
00191         else {
00192             for (i=0 ; i<nr ; i++) {
00193                 tuu[i] /= xl ;
00194             }   
00195         }
00196         tuu  += nr ;
00197     }     // Fin de boucle sur theta
00198 
00199     // On saute k = 1 : 
00200     tuu += nt*nr ; 
00201     
00202     // k=2,...
00203     for (k=2 ; k<np1 ; k++) {
00204     int m = k/2 ;
00205     tuu  += (m/2)*nr ;
00206     for (j=m/2 ; j<nt ; j++) {
00207         int ll = 2*j + (m%2) ;
00208         double xl = - ll*(ll+1) + lambda ;
00209         
00210         if (fabs(xl) < 1.e-14) {
00211             for (i=0 ; i<nr ; i++) {
00212                 tuu[i] = 0 ;
00213             }   
00214         }
00215         else {
00216             for (i=0 ; i<nr ; i++) {
00217                 tuu[i] /= xl ;
00218             }   
00219         }
00220         tuu  += nr ;
00221     }     // Fin de boucle sur theta
00222     }   // Fin de boucle sur phi    
00223         
00224     // base de developpement inchangee 
00225 }
00226 
00227             //------------------
00228             // cas T_LEG_PP --
00229             //----------------
00230 
00231 void _poisangu_t_leg_pp(Mtbl_cf* mt, int l, double lambda)
00232 {
00233 
00234     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00235     
00236     // Peut-etre rien a faire ?
00237     if (tb->get_etat() == ETATZERO) {
00238     return ;
00239     }
00240     
00241     int k, j, i ; 
00242     // Pour le confort
00243     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00244     int nt = mt->get_mg()->get_nt(l) ;   // de points
00245     int np = mt->get_mg()->get_np(l) ;   //     physiques
00246     
00247     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00248     
00249     double* tuu = tb->t ; 
00250 
00251     // k = 0  :
00252      
00253     for (j=0 ; j<nt ; j++) {
00254         int ll = 2*j ;
00255         double xl = - ll*(ll+1) + lambda ;
00256 
00257         if (fabs(xl) < 1.e-14) {
00258             for (i=0 ; i<nr ; i++) {
00259                 tuu[i] = 0 ;
00260             }   
00261         }
00262         else {
00263             for (i=0 ; i<nr ; i++) {
00264                 tuu[i] /= xl ;
00265             }   
00266         }
00267     tuu  += nr ;
00268     }     // Fin de boucle sur theta
00269 
00270     // On saute k = 1 : 
00271     tuu += nt*nr ; 
00272     
00273     // k=2,...
00274     for (k=2 ; k<np1 ; k++) {
00275     int m = 2*(k/2);
00276     tuu  += (m/2)*nr ;
00277     for (j=m/2 ; j<nt ; j++) {
00278         int ll = 2*j ;
00279         double xl = - ll*(ll+1) + lambda ;
00280 
00281         if (fabs(xl) < 1.e-14) {
00282             for (i=0 ; i<nr ; i++) {
00283                 tuu[i] = 0 ;
00284             }   
00285         }
00286         else {
00287             for (i=0 ; i<nr ; i++) {
00288                 tuu[i] /= xl ;
00289             }   
00290         }
00291         tuu  += nr ;
00292     }     // Fin de boucle sur theta
00293     }   // Fin de boucle sur phi    
00294         
00295     // base de developpement inchangee 
00296 }
00297 
00298             //----------------
00299             // cas T_LEG_I --
00300             //---------------
00301 
00302 void _poisangu_t_leg_i(Mtbl_cf* mt, int l, double lambda)
00303 {
00304 
00305     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00306     
00307     // Peut-etre rien a faire ?
00308     if (tb->get_etat() == ETATZERO) {
00309     return ;
00310     }
00311     
00312     int k, j, i ; 
00313     // Pour le confort
00314     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00315     int nt = mt->get_mg()->get_nt(l) ;   // de points
00316     int np = mt->get_mg()->get_np(l) ;   //     physiques
00317     
00318     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00319     
00320     double* tuu = tb->t ; 
00321 
00322     // k = 0  :
00323      
00324     for (j=0 ; j<nt-1 ; j++) {
00325         int ll = 2*j+1 ;
00326         double xl = - ll*(ll+1) + lambda ;
00327 
00328         if (fabs(xl) < 1.e-14) {
00329             for (i=0 ; i<nr ; i++) {
00330                 tuu[i] = 0 ;
00331             }   
00332         }
00333         else {
00334             for (i=0 ; i<nr ; i++) {
00335                 tuu[i] /= xl ;
00336             }   
00337         }
00338     tuu  += nr ;
00339     }     // Fin de boucle sur theta
00340     tuu  += nr ; // On saute j=nt-1
00341 
00342     // On saute k = 1 : 
00343     tuu += nt*nr ; 
00344     
00345     // k=2,...
00346     for (k=2 ; k<np1 ; k++) {
00347     int m = k/2 ;
00348     tuu  += ((m+1)/2)*nr ;
00349     for (j=(m+1)/2 ; j<nt-1 ; j++) {
00350         int ll = 2*j + ((m+1)%2) ;
00351         double xl = - ll*(ll+1) + lambda ;
00352 
00353         if (fabs(xl) < 1.e-14) {
00354             for (i=0 ; i<nr ; i++) {
00355                 tuu[i] = 0 ;
00356             }   
00357         }
00358         else {
00359             for (i=0 ; i<nr ; i++) {
00360                 tuu[i] /= xl ;
00361             }   
00362         }
00363         tuu  += nr ;
00364     }     // Fin de boucle sur theta
00365     tuu  += nr ; // On saute j=nt-1
00366     }   // Fin de boucle sur phi    
00367         
00368     // base de developpement inchangee 
00369 }
00370 
00371             //------------------
00372             // cas T_LEG_IP --
00373             //----------------
00374 
00375 void _poisangu_t_leg_ip(Mtbl_cf* mt, int l, double lambda)
00376 {
00377 
00378     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00379     
00380     // Peut-etre rien a faire ?
00381     if (tb->get_etat() == ETATZERO) {
00382     return ;
00383     }
00384     
00385     int k, j, i ; 
00386     // Pour le confort
00387     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00388     int nt = mt->get_mg()->get_nt(l) ;   // de points
00389     int np = mt->get_mg()->get_np(l) ;   //     physiques
00390     
00391     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00392     
00393     double* tuu = tb->t ; 
00394 
00395     // k = 0  :
00396      
00397     for (j=0 ; j<nt-1 ; j++) {
00398         int ll = 2*j+1 ;
00399         double xl = - ll*(ll+1) + lambda ;
00400 
00401         if (fabs(xl) < 1.e-14) {
00402             for (i=0 ; i<nr ; i++) {
00403                 tuu[i] = 0 ;
00404             }   
00405         }
00406         else {
00407             for (i=0 ; i<nr ; i++) {
00408                 tuu[i] /= xl ;
00409             }   
00410         }
00411         tuu  += nr ;
00412     }     // Fin de boucle sur theta
00413     tuu  += nr ; // On saute j=nt-1
00414 
00415     // On saute k = 1 : 
00416     tuu += nt*nr ; 
00417     
00418     // k=2,...
00419     for (k=2 ; k<np1 ; k++) {
00420     int m = 2*(k/2);
00421     tuu  += (m/2)*nr ;
00422     for (j=m/2 ; j<nt-1 ; j++) {
00423         int ll = 2*j+1 ;
00424         double xl = - ll*(ll+1) + lambda ;
00425 
00426         if (fabs(xl) < 1.e-14) {
00427             for (i=0 ; i<nr ; i++) {
00428                 tuu[i] = 0 ;
00429             }   
00430         }
00431         else {
00432             for (i=0 ; i<nr ; i++) {
00433                 tuu[i] /= xl ;
00434             }   
00435         }
00436         tuu  += nr ;
00437     }     // Fin de boucle sur theta
00438     tuu  += nr ; // On saute j=nt-1
00439     }   // Fin de boucle sur phi    
00440 
00441 //## Verif
00442     assert (tuu == tb->t + (np+1)*nt*nr) ;
00443         
00444     // base de developpement inchangee 
00445 }
00446 
00447             //------------------
00448             // cas T_LEG_PI --
00449             //----------------
00450 
00451 void _poisangu_t_leg_pi(Mtbl_cf* mt, int l, double lambda)
00452 {
00453 
00454     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00455     
00456     // Peut-etre rien a faire ?
00457     if (tb->get_etat() == ETATZERO) {
00458     return ;
00459     }
00460     
00461     int k, j, i ; 
00462     // Pour le confort
00463     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00464     int nt = mt->get_mg()->get_nt(l) ;   // de points
00465     int np = mt->get_mg()->get_np(l) ;   //     physiques
00466     
00467     double* tuu = tb->t ; 
00468 
00469     // k = 0  :     cos(phi)
00470     // -----
00471      
00472     for (j=0 ; j<nt-1 ; j++) {
00473         int ll = 2*j+1 ;
00474         double xl = - ll*(ll+1) + lambda ;
00475 
00476         if (fabs(xl) < 1.e-14) {
00477             for (i=0 ; i<nr ; i++) {
00478                 tuu[i] = 0 ;
00479             }   
00480         }
00481         else {
00482             for (i=0 ; i<nr ; i++) {
00483                 tuu[i] /= xl ;
00484             }   
00485         }
00486         tuu  += nr ;
00487     }     // Fin de boucle sur theta
00488     tuu  += nr ; // On saute j=nt-1
00489 
00490     if (np==1) {
00491     return ; 
00492     }
00493 
00494     // k = 1 : on saute
00495     // -----
00496     tuu += nt*nr ; 
00497     
00498     // k = 2 :  sin(phi)
00499     // ------
00500     for (j=0 ; j<nt-1 ; j++) {
00501         int ll = 2*j+1 ;
00502         double xl = - ll*(ll+1) + lambda ;
00503 
00504         if (fabs(xl) < 1.e-14) {
00505             for (i=0 ; i<nr ; i++) {
00506                 tuu[i] = 0 ;
00507             }   
00508         }
00509         else {
00510             for (i=0 ; i<nr ; i++) {
00511                 tuu[i] /= xl ;
00512             }   
00513         }
00514         tuu  += nr ;
00515     }     // Fin de boucle sur theta
00516     tuu  += nr ; // On saute j=nt-1
00517 
00518     // 3 <= k <= np
00519     // ------------
00520     for (k=3 ; k<np+1 ; k++) {
00521     int m = (k%2 == 0) ? k-1 : k ;
00522     tuu  += (m-1)/2*nr ;
00523     for (j=(m-1)/2 ; j<nt-1 ; j++) {
00524         int ll = 2*j+1 ;
00525         double xl = - ll*(ll+1) + lambda ;
00526 
00527         if (fabs(xl) < 1.e-14) {
00528             for (i=0 ; i<nr ; i++) {
00529                 tuu[i] = 0 ;
00530             }   
00531         }
00532         else {
00533             for (i=0 ; i<nr ; i++) {
00534                 tuu[i] /= xl ;
00535             }   
00536         }
00537         tuu  += nr ;
00538     }     // Fin de boucle sur theta
00539     tuu  += nr ; // On saute j=nt-1
00540     }   // Fin de boucle sur phi    
00541 
00542 //## Verif
00543     assert (tuu == tb->t + (np+1)*nt*nr) ;
00544         
00545     // base de developpement inchangee 
00546 }
00547 
00548             //------------------
00549             // cas T_LEG_II --
00550             //----------------
00551 
00552 void _poisangu_t_leg_ii(Mtbl_cf* mt, int l, double lambda)
00553 {
00554 
00555     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00556     
00557     // Peut-etre rien a faire ?
00558     if (tb->get_etat() == ETATZERO) {
00559     return ;
00560     }
00561     
00562     int k, j, i ; 
00563     // Pour le confort
00564     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00565     int nt = mt->get_mg()->get_nt(l) ;   // de points
00566     int np = mt->get_mg()->get_np(l) ;   //     physiques
00567     
00568     double* tuu = tb->t ; 
00569 
00570     // k = 0  :     cos(phi)
00571     // -----
00572      
00573     for (j=0 ; j<nt-1 ; j++) {
00574         int ll = 2*j ;
00575         double xl = - ll*(ll+1) + lambda ;
00576 
00577         if (fabs(xl) < 1.e-14) {
00578             for (i=0 ; i<nr ; i++) {
00579                 tuu[i] = 0 ;
00580             }   
00581         }
00582         else {
00583             for (i=0 ; i<nr ; i++) {
00584                 tuu[i] /= xl ;
00585             }   
00586         }
00587         tuu  += nr ;
00588     }     // Fin de boucle sur theta
00589     tuu  += nr ; // On saute j=nt-1
00590 
00591     if (np==1) {
00592     return ; 
00593     }
00594 
00595     // k = 1 : on saute
00596     // -----
00597     tuu += nt*nr ; 
00598     
00599     // k = 2 :  sin(phi)
00600     // ------
00601     for (j=0 ; j<nt-1 ; j++) {
00602         int ll = 2*j+1 ;
00603         double xl = - ll*(ll+1) + lambda ;
00604 
00605         if (fabs(xl) < 1.e-14) {
00606             for (i=0 ; i<nr ; i++) {
00607                 tuu[i] = 0 ;
00608             }   
00609         }
00610         else {
00611             for (i=0 ; i<nr ; i++) {
00612                 tuu[i] /= xl ;
00613             }   
00614         }
00615         tuu  += nr ;
00616     }     // Fin de boucle sur theta
00617     tuu  += nr ; // On saute j=nt-1
00618 
00619     // 3 <= k <= np
00620     // ------------
00621     for (k=3 ; k<np+1 ; k++) {
00622     int m = (k%2 == 0) ? k-1 : k ;
00623     tuu  += (m+1)/2*nr ;
00624     for (j=(m+1)/2 ; j<nt-1 ; j++) {
00625         int ll = 2*j ;
00626         double xl = - ll*(ll+1) + lambda ;
00627 
00628         if (fabs(xl) < 1.e-14) {
00629             for (i=0 ; i<nr ; i++) {
00630                 tuu[i] = 0 ;
00631             }   
00632         }
00633         else {
00634             for (i=0 ; i<nr ; i++) {
00635                 tuu[i] /= xl ;
00636             }   
00637         }
00638         tuu  += nr ;
00639     }     // Fin de boucle sur theta
00640     tuu  += nr ; // On saute j=nt-1
00641     }   // Fin de boucle sur phi    
00642 
00643 //## Verif
00644     assert (tuu == tb->t + (np+1)*nt*nr) ;
00645         
00646     // base de developpement inchangee 
00647 }
00648 
00649             //------------------
00650             // cas T_LEG_MP --
00651             //----------------
00652 
00653 void _poisangu_t_leg_mp(Mtbl_cf* mt, int l, double lambda)
00654 {
00655 
00656     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00657     
00658     // Peut-etre rien a faire ?
00659     if (tb->get_etat() == ETATZERO) {
00660     return ;
00661     }
00662     
00663     int k, j, i ; 
00664     // Pour le confort
00665     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00666     int nt = mt->get_mg()->get_nt(l) ;   // de points
00667     int np = mt->get_mg()->get_np(l) ;   //     physiques
00668     
00669     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00670     
00671     double* tuu = tb->t ; 
00672 
00673     // k = 0  :
00674      
00675     for (j=0 ; j<nt ; j++) {
00676         int ll = j ;
00677         double xl = - ll*(ll+1) + lambda ;
00678 
00679         if (fabs(xl) < 1.e-14) {
00680             for (i=0 ; i<nr ; i++) {
00681                 tuu[i] = 0 ;
00682             }   
00683         }
00684         else {
00685             for (i=0 ; i<nr ; i++) {
00686                 tuu[i] /= xl ;
00687             }   
00688         }
00689     tuu  += nr ;
00690     }     // Fin de boucle sur theta
00691 
00692     // On saute k = 1 : 
00693     tuu += nt*nr ; 
00694     
00695     // k=2,...
00696     for (k=2 ; k<np1 ; k++) {
00697     int m = 2*(k/2);
00698     tuu  += m*nr ;
00699     for (j=m ; j<nt ; j++) {
00700         int ll = j ;
00701         double xl = - ll*(ll+1) + lambda ;
00702 
00703         if (fabs(xl) < 1.e-14) {
00704             for (i=0 ; i<nr ; i++) {
00705                 tuu[i] = 0 ;
00706             }   
00707         }
00708         else {
00709             for (i=0 ; i<nr ; i++) {
00710                 tuu[i] /= xl ;
00711             }   
00712         }
00713         tuu  += nr ;
00714     }     // Fin de boucle sur theta
00715     }   // Fin de boucle sur phi    
00716         
00717     // base de developpement inchangee 
00718 }
00719 
00720             //----------------
00721             // cas T_LEG_MI --
00722             //----------------
00723 
00724 void _poisangu_t_leg_mi(Mtbl_cf* mt, int l, double lambda)
00725 {
00726 
00727     Tbl* tb = mt->t[l] ;        // pt. sur tbl de travail
00728     
00729     // Peut-etre rien a faire ?
00730     if (tb->get_etat() == ETATZERO) {
00731     return ;
00732     }
00733     
00734     int k, j, i ; 
00735     // Pour le confort
00736     int nr = mt->get_mg()->get_nr(l) ;   // Nombre
00737     int nt = mt->get_mg()->get_nt(l) ;   // de points
00738     int np = mt->get_mg()->get_np(l) ;   //     physiques
00739     
00740     int np1 = ( np == 1 ) ? 1 : np+1 ; 
00741     
00742     double* tuu = tb->t ; 
00743 
00744     // k = 0  :
00745      
00746     for (j=0 ; j<nt-1 ; j++) {
00747         int ll = j ;
00748         double xl = - ll*(ll+1) + lambda ;
00749 
00750         if (fabs(xl) < 1.e-14) {
00751             for (i=0 ; i<nr ; i++) {
00752                 tuu[i] = 0 ;
00753             }   
00754         }
00755         else {
00756             for (i=0 ; i<nr ; i++) {
00757                 tuu[i] /= xl ;
00758             }   
00759         }
00760     tuu  += nr ;
00761     }     // Fin de boucle sur theta
00762     tuu  += nr ; // On saute j=nt-1
00763 
00764     // On saute k = 1 : 
00765     tuu += nt*nr ; 
00766     
00767     // k=2,...
00768     for (k=2 ; k<np1 ; k++) {
00769     int m = 2*((k-1)/2) + 1 ;
00770     tuu  += m*nr ;
00771     for (j=m ; j<nt-1 ; j++) {
00772         int ll = j ;
00773         double xl = - ll*(ll+1) + lambda ;
00774 
00775         if (fabs(xl) < 1.e-14) {
00776             for (i=0 ; i<nr ; i++) {
00777                 tuu[i] = 0 ;
00778             }   
00779         }
00780         else {
00781             for (i=0 ; i<nr ; i++) {
00782                 tuu[i] /= xl ;
00783             }   
00784         }
00785         tuu  += nr ;
00786     }     // Fin de boucle sur theta
00787     tuu  += nr ; // On saute j=nt-1
00788     }   // Fin de boucle sur phi    
00789         
00790     // base de developpement inchangee 
00791 }
00792 

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