LORENE
leg_base_scal.C
1/*
2 * Copyright (c) 2013 Jerome Novak
3 *
4 * This file is part of LORENE.
5 *
6 * LORENE is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * LORENE is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with LORENE; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22
23char leg_base_scal_C[] = "$Header $" ;
24
25/*
26 * Ensemble des routines de manipulation de base spectrales dans
27 * le cas scalaire, avec base radiale Legendre .
28 *
29 */
30
31/*
32 * $Id: leg_base_scal.C,v 1.2 2014/10/13 08:53:12 j_novak Exp $
33 * $Log $
34 *
35 */
36//C headers
37#include<cstdlib>
38
39// Lorene
40#include "headcpp.h"
41#include "type_parite.h"
42
43
44 //------------------------------//
45 // Le plus simple: cas une zone //
46 //------------------------------//
47
48// Cree la base standart pour une zone
49namespace Lorene {
50int leg_base_scal_1z(int type_r, int type_t, int type_p) {
51
52 // Base d'echantillonnage en (r,theta,phi) a determiner :
53 int base_l = 0 ;
54
55 // proccess phi
56 switch ( type_p ) {
57 case NONSYM :
58 // Cas sans symetrie sur phi : phi dans [0, 2 pi[
59 base_l = P_COSSIN ; // developpement en cos,sin(m*phi)
60 // Base en theta:
61 switch ( type_t ) {
62 case NONSYM :
63 // pas de symetrie en theta : theta dans [0,pi]
64 base_l = base_l | T_COSSIN_C ; // developpement en
65 // cos(l*theta) pour m pair
66 // sin(l*theta) pour m impair
67
68
69 // Base en r :
70 switch ( type_r ) {
71 case FIN :
72 // echantillonnage fin
73 base_l = base_l | R_LEG ; // developpement en P_k(x)
74 break ;
75
76 // case RARE :
77 // // echantillonnage rarefie
78 // base_l = base_l | R_LEGPI_P ; // developpement en
79 // // P_{2k}(x) pour l pair
80 // // P_{2k+1}(x) pour l impair
81 // break ;
82
83 case UNSURR :
84 // echantillonnage fin (1/r)
85 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
86 break ;
87
88 default :
89 cout <<
90 "leg_base_scal : le cas type_p, type_t, type_r = "
91 << type_p << " " << type_t << " " << type_r << endl ;
92 cout << " n'est pas prevu ! " << endl ;
93 abort () ;
94 }
95 break ; // fin du cas type_t = NONSYM
96
97 case SYM : // en theta
98 // symetrie theta -> pi - theta : theta dans [0, pi/2]
99 base_l = base_l | T_COSSIN_CP ; // developpement en
100 // cos(2*l*theta) pour m pair
101 // sin((2*l+1)*theta) pour m impair
102 // Base en r :
103 switch ( type_r ) {
104 case FIN :
105 // echantillonnage fin
106 base_l = base_l | R_LEG ; // developpement en T_k(x)
107 break ;
108
109 // case RARE :
110 // // echantillonnage rarefie
111 // base_l = base_l | R_LEGPIM_P ; // developpement en
112 // // T_{2k}(x) pour m pair
113 // // T_{2k+1}(x) pour m impair
114 // break ;
115
116 case UNSURR :
117 // echantillonnage fin (1/r)
118 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
119 break ;
120
121 default :
122 cout <<
123 "leg_base_scal : le cas type_p, type_t, type_r = "
124 << type_p<< " " << type_t<< " " <<type_r << endl ;
125 cout << " n'est pas prevu ! " << endl ;
126 abort () ;
127 }
128 break ; // fin du cas type_t = SYM
129
130 default :
131 cout <<
132 "leg_base_scal : le cas type_p, type_t = "
133 << type_p<< " " <<type_t << endl ;
134 cout << " n'est pas prevu ! " << endl ;
135 abort () ;
136 } // fin des cas sur type_t
137 break ; // fin du cas sans symetrie pour phi
138
139
140 case SYM : // en phi
141 // Cas symetrie phi -> phi + pi : phi in [0, pi]
142 base_l = P_COSSIN_P ; // developpement en cos,sin(2*m*phi)
143 // Base en theta:
144 switch ( type_t ) {
145 case NONSYM :
146 // pas de symetrie en theta : theta dans [0,pi]
147 base_l = base_l | T_COS ; // developpement en cos(l*theta) seulement
148 // (puisque m est toujours pair)
149 // Base en r :
150 switch ( type_r ) {
151 case FIN : // echantillonnage fin
152 base_l = base_l | R_LEG ; // developpement en P_k(x)
153 break ;
154
155 // case RARE : // echantillonnage rarefie
156 // base_l = base_l | R_LEGPI_P ; // developpement en
157 // // P_{2k}(x) pour l pair
158 // // P_{2k+1}(x) pour l impair
159 // break ;
160
161 case UNSURR : // echantillonnage fin (1/r)
162 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
163 break ;
164
165 default :
166 cout <<
167 "leg_base_scal : le cas type_p, type_t, type_r = "
168 << type_p<< " " <<type_t<< " " <<type_r << endl ;
169 cout << " n'est pas prevu ! " << endl ;
170 abort () ;
171 }
172 break ; // fin du cas type_t = NONSYM
173
174 case SYM : // symetrie theta -> pi - theta : theta dans [0, pi/2]
175 base_l = base_l | T_COS_P ; // developpement en cos(2*l*theta)
176 // (puisque m est toujours pair)
177 // Base en r :
178 switch ( type_r ) {
179 case FIN : // echantillonnage fin
180 base_l = base_l | R_LEG ; // developpement en P_k(x)
181 break ;
182
183 case RARE : // echantillonnage rarefie
184 base_l = base_l | R_LEGP ; // developpement en P_{2k}(x)
185 break ;
186
187 case UNSURR : // echantillonnage fin (1/r)
188 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
189 break ;
190
191 default :
192 cout <<
193 "leg_base_scal : le cas type_p, type_t, type_r = "
194 << type_p<< " " <<type_t<< " " <<type_r << endl ;
195 cout << " n'est pas prevu ! " << endl ;
196 abort () ;
197 }
198 break ; // fin du cas type_t = SYM
199
200 default :
201 cout <<
202 "leg_base_scal : le cas type_p, type_t = "
203 << type_p<< " " <<type_t << endl ;
204 cout << " n'est pas prevu ! " << endl ;
205 abort () ;
206 } // fin des cas sur type_t
207 break ; // fin du cas symetrie phi -> phi + pi
208
209 default :
210 cout <<
211 "leg_base_scal : le cas type_p = " << type_p << endl ;
212 cout << " n'est pas prevu ! " << endl ;
213 abort () ;
214 } // Fin des cas en phi
215
216 // On range le resultat
217 return base_l ;
218}
219
220 //----------------------------------------//
221 // Le plus simple: cas une zone cas impair //
222 //----------------------------------------//
223
224// Cree la base standart pour une zone
225int leg_base_scal_odd_1z(int type_r, int type_t, int type_p) {
226
227 // Base d'echantillonnage en (r,theta,phi) a determiner :
228 int base_l = 0 ;
229
230 // proccess phi
231 switch ( type_p ) {
232 case NONSYM :
233 // Cas sans symetrie sur phi : phi dans [0, 2 pi[
234 base_l = P_COSSIN ; // developpement en cos,sin(m*phi)
235 // Base en theta:
236 switch ( type_t ) {
237 case NONSYM :
238 // pas de symetrie en theta : theta dans [0,pi]
239 base_l = base_l | T_COSSIN_C ; // developpement en
240 // cos(l*theta) pour m pair
241 // sin(l*theta) pour m impair
242
243
244 // Base en r :
245 switch ( type_r ) {
246 case FIN :
247 // echantillonnage fin
248 base_l = base_l | R_LEG ; // developpement en P_k(x)
249 break ;
250
251 // case RARE :
252 // // echantillonnage rarefie
253 // base_l = base_l | R_LEGPI_I ; // developpement en
254 // // P_{2k}(x) pour l impair
255 // // P_{2k+1}(x) pour l pair
256 // break ;
257
258 case UNSURR :
259 // echantillonnage fin (1/r)
260 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
261 break ;
262
263 default :
264 cout <<
265 "leg_base_scal_odd : le cas type_p, type_t, type_r = "
266 << type_p << " " << type_t << " " << type_r << endl ;
267 cout << " n'est pas prevu ! " << endl ;
268 abort () ;
269 }
270 break ; // fin du cas type_t = NONSYM
271
272 case SYM : // en theta
273 // symetrie theta -> pi - theta : theta dans [0, pi/2]
274 base_l = base_l | T_COSSIN_CP ; // developpement en
275 // cos(2*l*theta) pour m pair
276 // sin((2*l+1)*theta) pour m impair
277 // Base en r :
278 switch ( type_r ) {
279 case FIN :
280 // echantillonnage fin
281 base_l = base_l | R_LEG ; // developpement en P_k(x)
282 break ;
283
284 // case RARE :
285 // // echantillonnage rarefie
286 // base_l = base_l | R_LEGPIM_I ; // developpement en
287 // // P_{2k}(x) pour m impair
288 // // P_{2k+1}(x) pour m pair
289 // break ;
290
291 case UNSURR :
292 // echantillonnage fin (1/r)
293 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
294 break ;
295
296 default :
297 cout <<
298 "leg_base_scal_odd : le cas type_p, type_t, type_r = "
299 << type_p<< " " << type_t<< " " <<type_r << endl ;
300 cout << " n'est pas prevu ! " << endl ;
301 abort () ;
302 }
303 break ; // fin du cas type_t = SYM
304
305 default :
306 cout <<
307 "leg_base_scal_odd : le cas type_p, type_t = "
308 << type_p<< " " <<type_t << endl ;
309 cout << " n'est pas prevu ! " << endl ;
310 abort () ;
311 } // fin des cas sur type_t
312 break ; // fin du cas sans symetrie pour phi
313
314
315 case SYM : // en phi
316 // Cas symetrie phi -> phi + pi : phi in [0, pi]
317 base_l = P_COSSIN_P ; // developpement en cos,sin(2*m*phi)
318 // Base en theta:
319 switch ( type_t ) {
320 case NONSYM :
321 // pas de symetrie en theta : theta dans [0,pi]
322 base_l = base_l | T_COS ; // developpement en cos(l*theta) seulement
323 // (puisque m est toujours pair)
324 // Base en r :
325 switch ( type_r ) {
326 case FIN : // echantillonnage fin
327 base_l = base_l | R_LEG ; // developpement en P_k(x)
328 break ;
329
330 // case RARE : // echantillonnage rarefie
331 // base_l = base_l | R_LEGPI_I ; // developpement en
332 // // P_{2k}(x) pour l impair
333 // // P_{2k+1}(x) pour l pair
334 // break ;
335
336 case UNSURR : // echantillonnage fin (1/r)
337 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
338 break ;
339
340 default :
341 cout <<
342 "leg_base_scal_odd : le cas type_p, type_t, type_r = "
343 << type_p<< " " <<type_t<< " " <<type_r << endl ;
344 cout << " n'est pas prevu ! " << endl ;
345 abort () ;
346 }
347 break ; // fin du cas type_t = NONSYM
348
349 case SYM : // symetrie theta -> pi - theta : theta dans [0, pi/2]
350 base_l = base_l | T_COS_P ; // developpement en cos(2*l*theta)
351 // (puisque m est toujours pair)
352 // Base en r :
353 switch ( type_r ) {
354 case FIN : // echantillonnage fin
355 base_l = base_l | R_LEG ; // developpement en T_k(x)
356 break ;
357
358 case RARE : // echantillonnage rarefie
359 base_l = base_l | R_LEGI ; // developpement en T_{2k+1}(x)
360 break ;
361
362 case UNSURR : // echantillonnage fin (1/r)
363 base_l = base_l | R_CHEBU ; // developpement en T_k(x)
364 break ;
365
366 default :
367 cout <<
368 "leg_base_scal_odd : le cas type_p, type_t, type_r = "
369 << type_p<< " " <<type_t<< " " <<type_r << endl ;
370 cout << " n'est pas prevu ! " << endl ;
371 abort () ;
372 }
373 break ; // fin du cas type_t = SYM
374
375 default :
376 cout <<
377 "leg_base_scal_odd : le cas type_p, type_t = "
378 << type_p<< " " <<type_t << endl ;
379 cout << " n'est pas prevu ! " << endl ;
380 abort () ;
381 } // fin des cas sur type_t
382 break ; // fin du cas symetrie phi -> phi + pi
383
384 default :
385 cout <<
386 "leg_base_scal_odd : le cas type_p = " << type_p << endl ;
387 cout << " n'est pas prevu ! " << endl ;
388 abort () ;
389 } // Fin des cas en phi
390
391 // On range le resultat
392 return base_l ;
393}
394
395}
#define P_COSSIN_P
dev. sur Phi = 2*phi, freq. paires
#define R_LEGP
base de Legendre paire (rare) seulement
#define R_CHEBU
base de Chebychev ordinaire (fin), dev. en 1/r
#define R_LEGI
base de Legendre impaire (rare) seulement
#define R_LEG
base de Legendre ordinaire (fin)
#define T_COS_P
dev. cos seulement, harmoniques paires
#define P_COSSIN
dev. standart
#define T_COSSIN_CP
cos pair-sin impair alternes, cos pour m=0
#define T_COS
dev. cos seulement
#define T_COSSIN_C
dev. cos-sin alternes, cos pour m=0
Lorene prototypes.
Definition app_hor.h:64