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 
23 
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.3 2016/12/05 16:18:02 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
49 namespace Lorene {
50 int 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
225 int 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
dev. standart
Definition: type_parite.h:245
Lorene prototypes.
Definition: app_hor.h:67
#define T_COS
dev. cos seulement
Definition: type_parite.h:196
#define R_LEGP
base de Legendre paire (rare) seulement
Definition: type_parite.h:184
#define R_LEGI
base de Legendre impaire (rare) seulement
Definition: type_parite.h:186
#define T_COS_P
dev. cos seulement, harmoniques paires
Definition: type_parite.h:200
#define T_COSSIN_C
dev. cos-sin alternes, cos pour m=0
Definition: type_parite.h:192
#define R_CHEBU
base de Chebychev ordinaire (fin), dev. en 1/r
Definition: type_parite.h:180
#define P_COSSIN_P
dev. sur Phi = 2*phi, freq. paires
Definition: type_parite.h:247
#define T_COSSIN_CP
cos pair-sin impair alternes, cos pour m=0
Definition: type_parite.h:208
#define R_LEG
base de Legendre ordinaire (fin)
Definition: type_parite.h:182