map_af_integ_surf.C

00001 /*
00002  *   Copyright (c) 2000-2001 Philippe Grandclement
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 map_af_integ_surf_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_af_integ_surf.C,v 1.5 2009/10/08 16:20:47 j_novak Exp $" ;
00024 
00025 /*
00026  * $Id: map_af_integ_surf.C,v 1.5 2009/10/08 16:20:47 j_novak Exp $
00027  * $Log: map_af_integ_surf.C,v $
00028  * Revision 1.5  2009/10/08 16:20:47  j_novak
00029  * Addition of new bases T_COS and T_SIN.
00030  *
00031  * Revision 1.4  2007/10/05 15:56:19  j_novak
00032  * Addition of new bases for the non-symmetric case in theta.
00033  *
00034  * Revision 1.3  2004/03/10 12:43:06  jl_jaramillo
00035  * Treatment of case ETATUN in surface integrals for Scalar's.
00036  *
00037  * Revision 1.2  2004/01/29 08:50:03  p_grandclement
00038  * Modification of Map::operator==(const Map&) and addition of the surface
00039  * integrales using Scalar.
00040  *
00041  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00042  * LORENE
00043  *
00044  * Revision 1.7  2001/02/19  11:40:27  phil
00045  * correction indices
00046  *
00047  * Revision 1.6  2001/02/12  14:14:29  phil
00048  * *** empty log message ***
00049  *
00050  * Revision 1.5  2001/02/12  14:00:52  phil
00051  * on prends tous les coefficients now
00052  *
00053  * Revision 1.4  2001/02/12  12:35:34  phil
00054  * gestion des bases angulaires plus proprement
00055  *
00056  * Revision 1.3  2001/01/02  10:52:27  phil
00057  * ajout calcul a l'infini
00058  *
00059  * Revision 1.2  2000/09/19  13:54:14  phil
00060  * *** empty log message ***
00061  *
00062  * Revision 1.1  2000/09/19  13:09:32  phil
00063  * Initial revision
00064  *
00065  *
00066  * $Header: /cvsroot/Lorene/C++/Source/Map/map_af_integ_surf.C,v 1.5 2009/10/08 16:20:47 j_novak Exp $
00067  *
00068  */
00069 
00070 
00071 #include <stdlib.h>
00072 #include <math.h>
00073 
00074 #include "map.h"
00075 #include "cmp.h"
00076 #include "proto.h"
00077 #include "scalar.h"
00078 
00079                       //=============
00080                      // Cmp version
00081                     //===============  
00082 
00083 double Map_af::integrale_surface (const Cmp& ci, double rayon) const {
00084     
00085     assert (ci.get_etat() != ETATNONDEF) ;
00086     assert (rayon > 0) ;
00087     if (ci.get_etat() == ETATZERO)
00088     return 0 ;
00089     
00090     assert (ci.get_etat() == ETATQCQ) ;
00091     
00092     int l ;
00093     double xi ;
00094     val_lx (rayon, 0, 0, l, xi) ;
00095     
00096     if (l == get_mg()->get_nzone()-1) {
00097     ci.check_dzpuis(0) ;
00098     }
00099     
00100     ci.va.coef() ;
00101     int nr = get_mg()->get_nr(l) ;
00102     int nt = get_mg()->get_nt(l) ;
00103     
00104     int base_r = ci.va.base.get_base_r(l) ;
00105     int base_t = ci.va.base.get_base_t(l) ;
00106     int base_p = ci.va.base.get_base_p(l) ;
00107     
00108     double result = 0 ;
00109     double* coef = new double [nr] ;
00110     double* auxi = new double[1] ;
00111      
00112     bool odd_theta = false ;
00113     double c_cos = 2 ;
00114     switch (base_t) {
00115     case T_COS_P : case T_COSSIN_CP :
00116         break ;
00117     case T_COS_I : case T_COSSIN_CI :
00118         odd_theta = true ;
00119         break ;
00120     case T_COS : case T_COSSIN_C :
00121         c_cos = 1. ;
00122         break ;
00123     default :
00124         cout << "base_t cas non prevu dans Map_af::integrale_surface" << endl ;
00125         abort() ;
00126         break ;
00127     }
00128     
00129     if (!odd_theta) {
00130     for (int j=0 ; j<nt ; j++) {
00131         for (int i=0 ; i<nr ; i++)
00132         coef[i] = (*ci.va.c_cf)(l, 0, j, i) ;
00133     
00134         switch (base_r) {
00135         
00136         case R_CHEB :
00137             som_r_cheb (coef, nr, 1, 1, xi, auxi) ;
00138             break ;
00139         case R_CHEBP :
00140             som_r_chebp (coef, nr, 1, 1, xi, auxi) ;
00141             break ;
00142         case R_CHEBI :
00143             som_r_chebi (coef, nr, 1, 1, xi, auxi) ;
00144             break ;
00145         case R_CHEBU :
00146             som_r_chebu (coef, nr, 1, 1, xi, auxi) ;
00147             break ;
00148         case R_CHEBPI_P :
00149             som_r_chebpi_p (coef, nr, 1, 1, xi, auxi) ;
00150             break ;
00151         case R_CHEBPI_I :
00152             som_r_chebpi_i (coef, nr, 1, 1, xi, auxi) ;
00153             break ;
00154         case R_CHEBPIM_P :
00155             som_r_chebpim_p (coef, nr, 1, 1, xi, auxi) ;
00156             break ;
00157         case R_CHEBPIM_I :
00158             som_r_chebpim_i (coef, nr, 1, 1, xi, auxi) ;
00159             break ;
00160         default :
00161             som_r_pas_prevu (coef, nr, 1, 1, xi, auxi) ;
00162             break ;
00163         }
00164         result += 2 * (*auxi)/(1-c_cos*c_cos*j*j) ;
00165         if (c_cos == 1.) j++ ;
00166     }
00167     }
00168     delete [] auxi ;
00169     delete [] coef ;
00170     
00171      switch (base_p) {
00172     case P_COSSIN :
00173         result *= 2*rayon*rayon*M_PI ;
00174         break ;
00175     case P_COSSIN_P :
00176         result *= 2*rayon*rayon*M_PI ;
00177         break ;
00178     default :
00179         cout << "base_p cas non prevu dans Map_af::integrale_surface" << endl ;
00180         abort() ;
00181         break ;
00182     }
00183 
00184     return result ;
00185 }
00186 
00187 
00188 // Integrale a l'infini
00189 double Map_af::integrale_surface_infini (const Cmp& ci) const {
00190     
00191     assert (ci.get_etat() != ETATNONDEF) ;
00192     assert (ci.check_dzpuis(2));
00193     
00194     if (ci.get_etat() == ETATZERO)
00195     return 0 ;
00196     
00197     assert (ci.get_etat() == ETATQCQ) ;
00198     
00199     int nz = ci.get_mp()->get_mg()->get_nzone() ;
00200     
00201     ci.va.coef() ;
00202     int nr = get_mg()->get_nr(nz-1) ;
00203     int nt = get_mg()->get_nt(nz-1) ;
00204     
00205     int base_r = ci.va.base.get_base_r(nz-1) ;
00206     int base_t = ci.va.base.get_base_t(nz-1) ;
00207     int base_p = ci.va.base.get_base_p(nz-1) ;
00208     
00209     double result = 0 ;
00210     double* coef = new double [nr] ;
00211     double* auxi = new double[1] ;
00212       
00213     bool odd_theta = false ;
00214     double c_cos = 2. ;
00215     switch (base_t) {
00216     case T_COS_P : case T_COSSIN_CP :
00217         break ;
00218     case T_COS_I : case T_COSSIN_CI :
00219         odd_theta = true ;
00220         break ;
00221     case T_COS : case T_COSSIN_C :
00222         c_cos = 1. ;
00223         break ;
00224     default :
00225         cout << "base_t cas non prevu dans Map_af::integrale_surface" << endl ;
00226         abort() ;
00227         break ;
00228     }
00229     
00230     if (!odd_theta) {
00231     for (int j=0 ; j<nt ; j++) {
00232         for (int i=0 ; i<nr ; i++)
00233         coef[i] = (*ci.va.c_cf)(nz-1, 0, j, i) ;
00234         
00235         switch (base_r) {
00236         case R_CHEBU :
00237             som_r_chebu (coef, nr, 1, 1, 1, auxi) ;
00238             break ;
00239         default :
00240             som_r_pas_prevu (coef, nr, 1, 1, 1, auxi) ;
00241             break ;
00242         }
00243         result += 2 * (*auxi)/(1-c_cos*c_cos*j*j) ;
00244         if (c_cos == 1.) j++ ;
00245     }
00246     }
00247     delete [] auxi ;
00248     delete [] coef ;
00249     
00250     switch (base_p) {
00251     case P_COSSIN :
00252         result *= 2*M_PI ;
00253         break ;
00254     case P_COSSIN_P :
00255         result *= 2*M_PI ;
00256         break ;
00257     default :
00258         cout << "base_p cas non prevu dans Map_af::integrale_surface_infini" << endl ;
00259         abort() ;
00260         break ;
00261     }
00262     
00263     return result ;
00264 }
00265 
00266                       //=============
00267                      // Scalar version
00268                     //===============  
00269 
00270 double Map_af::integrale_surface (const Scalar& ci, double rayon) const {
00271     
00272     assert (ci.get_etat() != ETATNONDEF) ;
00273     assert (rayon > 0) ;
00274     if (ci.get_etat() == ETATZERO)
00275     return 0 ;
00276     
00277     assert ( (ci.get_etat() == ETATQCQ) ||  (ci.get_etat() == ETATUN) ) ;
00278     
00279     int l ;
00280     double xi ;
00281     val_lx (rayon, 0, 0, l, xi) ;
00282     
00283     if (l == get_mg()->get_nzone()-1) {
00284     ci.check_dzpuis(0) ;
00285     }
00286     
00287     ci.get_spectral_va().coef() ;
00288     int nr = get_mg()->get_nr(l) ;
00289     int nt = get_mg()->get_nt(l) ;
00290     
00291     int base_r = ci.get_spectral_va().base.get_base_r(l) ;
00292     int base_t = ci.get_spectral_va().base.get_base_t(l) ;
00293     int base_p = ci.get_spectral_va().base.get_base_p(l) ;
00294     
00295     double result = 0 ;
00296     double* coef = new double [nr] ;
00297     double* auxi = new double[1] ;
00298 
00299     bool odd_theta = false ;
00300     double c_cos = 2. ;
00301      
00302     switch (base_t) {
00303     case T_COS_P : case T_COSSIN_CP :
00304         break ;
00305     case T_COS_I: case T_COSSIN_CI :
00306         odd_theta = true ; 
00307         break ;
00308     case T_COS : case T_COSSIN_C :
00309         c_cos = 1. ;
00310         break ;
00311     default :
00312         cout << "base_t cas non prevu dans Map_af::integrale_surface" << endl ;
00313         abort() ;
00314         break ;
00315     }
00316     
00317     if (!odd_theta) {
00318     for (int j=0 ; j<nt ; j++) {
00319         for (int i=0 ; i<nr ; i++)
00320         coef[i] = (*ci.get_spectral_va().c_cf)(l, 0, j, i) ;
00321         
00322         switch (base_r) {
00323         
00324         case R_CHEB :
00325             som_r_cheb (coef, nr, 1, 1, xi, auxi) ;
00326             break ;
00327         case R_CHEBP :
00328             som_r_chebp (coef, nr, 1, 1, xi, auxi) ;
00329             break ;
00330         case R_CHEBI :
00331             som_r_chebi (coef, nr, 1, 1, xi, auxi) ;
00332             break ;
00333         case R_CHEBU :
00334             som_r_chebu (coef, nr, 1, 1, xi, auxi) ;
00335             break ;
00336         case R_CHEBPI_P :
00337             som_r_chebpi_p (coef, nr, 1, 1, xi, auxi) ;
00338             break ;
00339         case R_CHEBPI_I :
00340             som_r_chebpi_i (coef, nr, 1, 1, xi, auxi) ;
00341             break ;
00342         case R_CHEBPIM_P :
00343             som_r_chebpim_p (coef, nr, 1, 1, xi, auxi) ;
00344             break ;
00345         case R_CHEBPIM_I :
00346             som_r_chebpim_i (coef, nr, 1, 1, xi, auxi) ;
00347             break ;
00348         default :
00349             som_r_pas_prevu (coef, nr, 1, 1, xi, auxi) ;
00350             break ;
00351         }
00352         result += 2 * (*auxi)/(1-c_cos*c_cos*j*j) ;
00353         if (c_cos == 1.) j++ ;
00354     }
00355     }
00356     
00357     delete [] auxi ;
00358     delete [] coef ;
00359     
00360      switch (base_p) {
00361     case P_COSSIN :
00362         result *= 2*rayon*rayon*M_PI ;
00363         break ;
00364     case P_COSSIN_P :
00365         result *= 2*rayon*rayon*M_PI ;
00366         break ;
00367     default :
00368         cout << "base_p cas non prevu dans Map_af::integrale_surface" << endl ;
00369         abort() ;
00370         break ;
00371     }
00372 
00373     return result ;
00374 }
00375 
00376 
00377 // Integrale a l'infini
00378 double Map_af::integrale_surface_infini (const Scalar& ci) const {
00379     
00380     assert (ci.get_etat() != ETATNONDEF) ;
00381     assert (ci.check_dzpuis(2));
00382     
00383     if (ci.get_etat() == ETATZERO)
00384     return 0 ;
00385     
00386     assert ( (ci.get_etat() == ETATQCQ) ||  (ci.get_etat() == ETATUN) ) ; 
00387    
00388     int nz = ci.get_mp().get_mg()->get_nzone() ;
00389     
00390     ci.get_spectral_va().coef() ;
00391     int nr = get_mg()->get_nr(nz-1) ;
00392     int nt = get_mg()->get_nt(nz-1) ;
00393     
00394     int base_r = ci.get_spectral_va().base.get_base_r(nz-1) ;
00395     int base_t = ci.get_spectral_va().base.get_base_t(nz-1) ;
00396     int base_p = ci.get_spectral_va().base.get_base_p(nz-1) ;
00397     
00398     double result = 0 ;
00399     double* coef = new double [nr] ;
00400     double* auxi = new double[1] ;
00401       
00402     bool odd_theta = false ;
00403     double c_cos = 2. ;
00404      
00405     switch (base_t) {
00406     case T_COS_P : case T_COSSIN_CP :
00407         break ;
00408     case T_COS_I: case T_COSSIN_CI :
00409         odd_theta = true ; 
00410         break ;
00411     case T_COS : case T_COSSIN_C :
00412         c_cos = 1. ;
00413         break ;
00414     default :
00415         cout << "base_t cas non prevu dans Map_af::integrale_surface" << endl ;
00416         abort() ;
00417         break ;
00418     }
00419     
00420     if (!odd_theta) {
00421     for (int j=0 ; j<nt ; j++) {
00422         for (int i=0 ; i<nr ; i++)
00423         coef[i] = (*ci.get_spectral_va().c_cf)(nz-1, 0, j, i) ;
00424         
00425         switch (base_r) {
00426         case R_CHEBU :
00427             som_r_chebu (coef, nr, 1, 1, 1, auxi) ;
00428             break ;
00429         default :
00430             som_r_pas_prevu (coef, nr, 1, 1, 1, auxi) ;
00431             break ;
00432         }
00433         result += 2 * (*auxi)/(1-c_cos*c_cos*j*j) ;
00434         if (c_cos == 1.) j++ ;
00435     }
00436     }
00437     
00438     delete [] auxi ;
00439     delete [] coef ;
00440     
00441      switch (base_p) {
00442     case P_COSSIN :
00443         result *= 2*M_PI ;
00444         break ;
00445     case P_COSSIN_P :
00446         result *= 2*M_PI ;
00447         break ;
00448     default :
00449         cout << "base_p cas non prevu dans Map_af::integrale_surface_infini" << endl ;
00450         abort() ;
00451         break ;
00452     }
00453     
00454     return result ;
00455 }

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