base_val_quantum.C
/*
* Copyright (c) 2004 Philippe Grandclement
*
* This file is part of LORENE.
*
* LORENE is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* LORENE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with LORENE; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
char base_val_quantum_C[] = "$Header: /cvsroot/Lorene/C++/Source/Base_val/base_val_quantum.C,v 1.10 2014/10/13 08:52:39 j_novak Exp $" ;
/*
* $Id: base_val_quantum.C,v 1.10 2014/10/13 08:52:39 j_novak Exp $
* $Log: base_val_quantum.C,v $
* Revision 1.10 2014/10/13 08:52:39 j_novak
* Lorene classes and functions now belong to the namespace Lorene.
*
* Revision 1.9 2014/10/06 15:12:57 j_novak
* Modified #include directives to use c++ syntax.
*
* Revision 1.8 2013/01/11 08:20:11 j_novak
* New radial spectral bases with Legendre polynomials (R_LEG, R_LEGP, R_LEGI).
*
* Revision 1.7 2009/10/23 12:55:16 j_novak
* New base T_LEG_MI
*
* Revision 1.6 2009/10/08 16:20:13 j_novak
* Addition of new bases T_COS and T_SIN.
*
* Revision 1.5 2007/12/11 15:28:09 jl_cornou
* Jacobi(0,2) polynomials partially implemented
*
* Revision 1.4 2005/09/07 13:09:50 j_novak
* New method for determining the highest multipole that can be described on a 3D
* grid.
*
* Revision 1.3 2004/11/23 15:08:01 m_forot
* Added the bases for the cases without any equatorial symmetry
* (T_COSSIN_C, T_COSSIN_S, T_LEG, R_CHEBPI_P, R_CHEBPI_I).
*
* Revision 1.2 2004/08/30 16:27:59 r_prix
* added #include <stdlib.h> (got ERROR 'abort' is undefined without this...)
*
* Revision 1.1 2004/08/24 09:14:41 p_grandclement
* Addition of some new operators, like Poisson in 2d... It now requieres the
* GSL library to work.
*
* Also, the way a variable change is stored by a Param_elliptic is changed and
* no longer uses Change_var but rather 2 Scalars. The codes using that feature
* will requiere some modification. (It should concern only the ones about monopoles)
*
*
* $Header: /cvsroot/Lorene/C++/Source/Base_val/base_val_quantum.C,v 1.10 2014/10/13 08:52:39 j_novak Exp $
*
*/
// Headers C
#include <cstdio>
#include <cassert>
#include <cstdlib>
// Headers Lorene
#include "grilles.h"
#include "base_val.h"
#include "utilitaires.h"
namespace Lorene {
void Base_val::give_quant_numbers (int l, int k, int j,
int& m_quant, int& l_quant, int& base_r_1d) const {
int base_p = get_base_p(l) ;
int base_t = get_base_t(l) ;
int base_r = get_base_r(l) ;
switch (base_p) {
case P_COSSIN :
m_quant = k/2 ;
break;
case P_COSSIN_P :
if (k%2 == 0)
m_quant = k ;
else
m_quant = (k-1) ;
break;
case P_COSSIN_I :
m_quant = 2*( (k-1) / 2) + 1 ;
break;
default:
cout << "Unknown basis in phi in give_quant_numbers ..." << endl ;
abort() ;
break ;
}
switch (base_t) {
case T_COS_P :
l_quant = 2*j ;
break;
case T_SIN_P :
l_quant = 2*j ;
break;
case T_COS_I :
l_quant = 2*j+1 ;
break;
case T_SIN_I :
l_quant = 2*j+1 ;
break;
case T_COSSIN_CP :
if (m_quant%2 == 0)
l_quant = 2*j ;
else
l_quant = 2*j+1 ;
break ;
case T_COSSIN_SP :
if (m_quant%2 == 0)
l_quant = 2*j ;
else
l_quant = 2*j+1 ;
break ;
case T_COSSIN_CI :
if (m_quant%2 == 0)
l_quant = 2*j+1 ;
else
l_quant = 2*j ;
break ;
case T_COSSIN_SI :
if (m_quant%2 == 0)
l_quant = 2*j+1 ;
else
l_quant = 2*j ;
break ;
case T_COSSIN_C :
l_quant = j ;
break ;
case T_COSSIN_S :
l_quant = j ;
break ;
case T_COS :
l_quant = j ;
break ;
case T_LEG_P :
if (m_quant%2 == 0)
l_quant = 2*j ;
else
l_quant = 2*j+1 ;
break ;
case T_LEG_PP :
l_quant = 2*j ;
break ;
case T_LEG_I :
if (m_quant%2 == 0)
l_quant = 2*j+1 ;
else
l_quant = 2*j ;
break ;
case T_LEG_IP :
l_quant = 2*j+1 ;
break ;
case T_LEG_PI :
l_quant = 2*j+1 ;
break ;
case T_LEG_II :
l_quant = 2*j ;
break ;
case T_LEG :
l_quant = j ;
break ;
case T_LEG_MP :
l_quant = j ;
break ;
case T_LEG_MI :
l_quant = j ;
break ;
case T_CL_COS_P:
l_quant = 2*j ;
break ;
case T_CL_SIN_P:
l_quant = 2*j ;
break ;
case T_CL_COS_I:
l_quant = 2*j+1 ;
break ;
case T_CL_SIN_I:
l_quant = 2*j+1 ;
break ;
default:
cout << "Unknown basis in theta in give_quant_numbers ..." << endl ;
abort() ;
break ;
}
switch (base_r) {
case R_CHEB :
base_r_1d = R_CHEB ;
break ;
case R_CHEBP :
base_r_1d = R_CHEBP ;
break ;
case R_CHEBI :
base_r_1d = R_CHEBI ;
break ;
case R_LEG :
base_r_1d = R_LEG ;
break ;
case R_LEGP :
base_r_1d = R_LEGP ;
break ;
case R_LEGI :
base_r_1d = R_LEGI ;
break ;
case R_JACO02 :
base_r_1d = R_JACO02 ;
break ;
case R_CHEBPIM_P :
if (m_quant%2 == 0)
base_r_1d = R_CHEBP ;
else
base_r_1d = R_CHEBI ;
break ;
case R_CHEBPIM_I :
if (m_quant%2 == 0)
base_r_1d = R_CHEBI ;
else
base_r_1d = R_CHEBP ;
break ;
case R_CHEBPI_P :
if (l_quant%2 == 0)
base_r_1d = R_CHEBP ;
else
base_r_1d = R_CHEBI ;
break ;
case R_CHEBPI_I :
if (l_quant%2 == 0)
base_r_1d = R_CHEBI ;
else
base_r_1d = R_CHEBP ;
break ;
case R_CHEBU :
base_r_1d = R_CHEBU ;
break ;
default:
cout << "Unknown basis in r in give_quant_numbers ..." << endl ;
abort() ;
break ;
}
}
int Base_val::give_lmax(const Mg3d& mgrid, int lz) const {
#ifndef NDEBUG
int nz = mgrid.get_nzone() ;
assert (lz < nz) ;
#endif
int ntm1 = mgrid.get_nt(lz) - 1;
int base_t = get_base_t(lz) ;
bool m_odd = (mgrid.get_np(lz) > 2) ;
int l_max = 0 ;
switch (base_t) {
case T_COS_P :
l_max = 2*ntm1 ;
break;
case T_SIN_P :
l_max = 2*ntm1 ;
break;
case T_COS_I :
l_max = 2*ntm1+1 ;
break;
case T_SIN_I :
l_max = 2*ntm1+1 ;
break;
case T_COSSIN_CP :
if (!m_odd)
l_max = 2*ntm1 ;
else
l_max = 2*ntm1+1 ;
break ;
case T_COSSIN_SP :
if (!m_odd)
l_max = 2*ntm1 ;
else
l_max = 2*ntm1+1 ;
break ;
case T_COSSIN_CI :
if (!m_odd)
l_max = 2*ntm1+1 ;
else
l_max = 2*ntm1 ;
break ;
case T_COSSIN_SI :
if (!m_odd)
l_max = 2*ntm1+1 ;
else
l_max = 2*ntm1 ;
break ;
case T_COSSIN_C :
l_max = ntm1 ;
break ;
case T_COSSIN_S :
l_max = ntm1 ;
break ;
case T_COS :
l_max = ntm1 ;
break ;
case T_LEG_P :
if (!m_odd)
l_max = 2*ntm1 ;
else
l_max = 2*ntm1+1 ;
break ;
case T_LEG_PP :
l_max = 2*ntm1 ;
break ;
case T_LEG_I :
if (!m_odd)
l_max = 2*ntm1+1 ;
else
l_max = 2*ntm1 ;
break ;
case T_LEG_IP :
l_max = 2*ntm1+1 ;
break ;
case T_LEG_PI :
l_max = 2*ntm1+1 ;
break ;
case T_LEG_II :
l_max = 2*ntm1 ;
break ;
case T_LEG :
l_max = ntm1 ;
break ;
case T_LEG_MP :
l_max = ntm1 ;
break ;
case T_LEG_MI :
l_max = ntm1 ;
break ;
case T_CL_COS_P:
l_max = 2*ntm1 ;
break ;
case T_CL_SIN_P:
l_max = 2*ntm1 ;
break ;
case T_CL_COS_I:
l_max = 2*ntm1+1 ;
break ;
case T_CL_SIN_I:
l_max = 2*ntm1+1 ;
break ;
default:
cout << "Unknown basis in theta in Base_val::get_lmax ..."
<< endl ;
abort() ;
break ;
}
return l_max ;
}
}
Lorene::Base_val::give_lmax
int give_lmax(const Mg3d &mgrid, int lz) const
Returns the highest multipole for a given grid.
Definition base_val_quantum.C:294
Lorene::Base_val::get_base_p
int get_base_p(int l) const
Returns the expansion basis for functions in the domain of index l (e.g.
Definition base_val.h:422
Lorene::Base_val::get_base_r
int get_base_r(int l) const
Returns the expansion basis for r ( ) functions in the domain of index l (e.g.
Definition base_val.h:400
Lorene::Base_val::get_base_t
int get_base_t(int l) const
Returns the expansion basis for functions in the domain of index l (e.g.
Definition base_val.h:411
Lorene::Base_val::give_quant_numbers
void give_quant_numbers(int, int, int, int &, int &, int &) const
Computes the various quantum numbers and 1d radial base.
Definition base_val_quantum.C:81
Lorene::Mg3d
Multi-domain grid.
Definition grilles.h:273
Lorene::Mg3d::get_np
int get_np(int l) const
Returns the number of points in the azimuthal direction ( ) in domain no. l.
Definition grilles.h:462
Lorene::Mg3d::get_nt
int get_nt(int l) const
Returns the number of points in the co-latitude direction ( ) in domain no. l.
Definition grilles.h:457
Lorene::Mg3d::get_nzone
int get_nzone() const
Returns the number of domains.
Definition grilles.h:448
T_CL_COS_I
#define T_CL_COS_I
CL of odd cosines.
Definition type_parite.h:232
T_CL_SIN_I
#define T_CL_SIN_I
CL of odd sines.
Definition type_parite.h:234
T_LEG_MP
#define T_LEG_MP
fct. de Legendre associees avec m pair
Definition type_parite.h:238
P_COSSIN_P
#define P_COSSIN_P
dev. sur Phi = 2*phi, freq. paires
Definition type_parite.h:247
R_LEGP
#define R_LEGP
base de Legendre paire (rare) seulement
Definition type_parite.h:184
T_LEG_PI
#define T_LEG_PI
fct. de Legendre associees paires avec m impair
Definition type_parite.h:224
R_CHEBU
#define R_CHEBU
base de Chebychev ordinaire (fin), dev. en 1/r
Definition type_parite.h:180
R_JACO02
#define R_JACO02
base de Jacobi(0,2) ordinaire (finjac)
Definition type_parite.h:188
T_COSSIN_SP
#define T_COSSIN_SP
sin pair-cos impair alternes, sin pour m=0
Definition type_parite.h:210
R_LEGI
#define R_LEGI
base de Legendre impaire (rare) seulement
Definition type_parite.h:186
R_CHEBI
#define R_CHEBI
base de Cheb. impaire (rare) seulement
Definition type_parite.h:170
T_LEG
#define T_LEG
fct. de Legendre associees
Definition type_parite.h:236
T_SIN_P
#define T_SIN_P
dev. sin seulement, harmoniques paires
Definition type_parite.h:202
T_COSSIN_S
#define T_COSSIN_S
dev. cos-sin alternes, sin pour m=0
Definition type_parite.h:194
R_CHEBPIM_I
#define R_CHEBPIM_I
Cheb. pair-impair suivant m, impair pour m=0.
Definition type_parite.h:178
T_COSSIN_SI
#define T_COSSIN_SI
sin impair-cos pair alternes, sin pour m=0
Definition type_parite.h:214
R_CHEBPI_I
#define R_CHEBPI_I
Cheb. pair-impair suivant l impair pour l=0.
Definition type_parite.h:174
R_LEG
#define R_LEG
base de Legendre ordinaire (fin)
Definition type_parite.h:182
T_CL_SIN_P
#define T_CL_SIN_P
CL of even sines.
Definition type_parite.h:230
T_LEG_P
#define T_LEG_P
fct. de Legendre associees paires
Definition type_parite.h:216
T_LEG_IP
#define T_LEG_IP
fct. de Legendre associees impaires avec m pair
Definition type_parite.h:222
T_COS_P
#define T_COS_P
dev. cos seulement, harmoniques paires
Definition type_parite.h:200
T_COSSIN_CI
#define T_COSSIN_CI
cos impair-sin pair alternes, cos pour m=0
Definition type_parite.h:212
P_COSSIN
#define P_COSSIN
dev. standart
Definition type_parite.h:245
P_COSSIN_I
#define P_COSSIN_I
dev. sur Phi = 2*phi, freq. impaires
Definition type_parite.h:249
R_CHEBPIM_P
#define R_CHEBPIM_P
Cheb. pair-impair suivant m, pair pour m=0.
Definition type_parite.h:176
T_CL_COS_P
#define T_CL_COS_P
CL of even cosines.
Definition type_parite.h:228
T_LEG_MI
#define T_LEG_MI
fct. de Legendre associees avec m impair
Definition type_parite.h:240
T_COSSIN_CP
#define T_COSSIN_CP
cos pair-sin impair alternes, cos pour m=0
Definition type_parite.h:208
T_LEG_II
#define T_LEG_II
fct. de Legendre associees impaires avec m impair
Definition type_parite.h:226
R_CHEB
#define R_CHEB
base de Chebychev ordinaire (fin)
Definition type_parite.h:166
T_LEG_I
#define T_LEG_I
fct. de Legendre associees impaires
Definition type_parite.h:220
T_SIN_I
#define T_SIN_I
dev. sin seulement, harmoniques impaires
Definition type_parite.h:206
T_COS
#define T_COS
dev. cos seulement
Definition type_parite.h:196
R_CHEBP
#define R_CHEBP
base de Cheb. paire (rare) seulement
Definition type_parite.h:168
T_LEG_PP
#define T_LEG_PP
fct. de Legendre associees paires avec m pair
Definition type_parite.h:218
T_COS_I
#define T_COS_I
dev. cos seulement, harmoniques impaires
Definition type_parite.h:204
T_COSSIN_C
#define T_COSSIN_C
dev. cos-sin alternes, cos pour m=0
Definition type_parite.h:192
R_CHEBPI_P
#define R_CHEBPI_P
Cheb. pair-impair suivant l pair pour l=0.
Definition type_parite.h:172
Lorene
Lorene prototypes.
Definition app_hor.h:64