LORENE
base_val_mult.C
1/*
2 * Copyright (c) 1999-2001 Philippe Grandclement
3 * Copyright (c) 2001 Eric Gourgoulhon
4 * Copyright (c) 2001 Keisuke Taniguchi
5 *
6 * This file is part of LORENE.
7 *
8 * LORENE is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * LORENE is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with LORENE; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23
24
25
26
27/*
28 * $Id: base_val_mult.C,v 1.12 2016/12/05 16:17:44 j_novak Exp $
29 * $Log: base_val_mult.C,v $
30 * Revision 1.12 2016/12/05 16:17:44 j_novak
31 * Suppression of some global variables (file names, loch, ...) to prevent redefinitions
32 *
33 * Revision 1.11 2014/10/13 08:52:38 j_novak
34 * Lorene classes and functions now belong to the namespace Lorene.
35 *
36 * Revision 1.10 2014/10/06 15:12:56 j_novak
37 * Modified #include directives to use c++ syntax.
38 *
39 * Revision 1.9 2013/01/11 08:20:11 j_novak
40 * New radial spectral bases with Legendre polynomials (R_LEG, R_LEGP, R_LEGI).
41 *
42 * Revision 1.8 2009/10/23 12:55:16 j_novak
43 * New base T_LEG_MI
44 *
45 * Revision 1.7 2009/10/08 16:20:13 j_novak
46 * Addition of new bases T_COS and T_SIN.
47 *
48 * Revision 1.6 2008/08/27 08:46:30 jl_cornou
49 * Added R_JACO02 base (Jacobi(0,2) polynomials)
50 *
51 * Revision 1.5 2004/11/23 15:08:00 m_forot
52 * Added the bases for the cases without any equatorial symmetry
53 * (T_COSSIN_C, T_COSSIN_S, T_LEG, R_CHEBPI_P, R_CHEBPI_I).
54 *
55 * Revision 1.4 2002/10/16 14:36:30 j_novak
56 * Reorganization of #include instructions of standard C++, in order to
57 * use experimental version 3 of gcc.
58 *
59 * Revision 1.3 2002/08/02 15:07:41 j_novak
60 * Member function determinant has been added to the class Metrique.
61 * A better handling of spectral bases is now implemented for the class Tenseur.
62 *
63 * Revision 1.2 2002/02/07 14:55:07 e_gourgoulhon
64 * Add more cases in theta and phi
65 *
66 * Revision 1.1.1.1 2001/11/20 15:19:28 e_gourgoulhon
67 * LORENE
68 *
69 * Revision 2.3 2001/08/29 09:31:00 keisuke
70 * Addition of the cases T_COSSIN_SP * T_COSSIN_SP,
71 * T_COSSIN_SI * T_COSSIN_SI, etc.
72 *
73 * Revision 2.2 2001/08/27 14:59:27 keisuke
74 * Ajout du cas T_COSSIN_CP * T_COSSIN_SI
75 *
76 * Revision 2.1 2001/08/27 13:40:18 eric
77 * Ajout du cas T_COSSIN_CP * T_COSSIN_SP
78 *
79 * Revision 2.0 1999/10/26 14:42:47 phil
80 * *** empty log message ***
81 *
82 *
83 * $Header: /cvsroot/Lorene/C++/Source/Base_val/base_val_mult.C,v 1.12 2016/12/05 16:17:44 j_novak Exp $
84 *
85 */
86
87// Fichier includes
88#include <cstdlib>
89#include <cstdio>
90#include <cassert>
91
92#include "headcpp.h"
93#include "type_parite.h"
94#include "base_val.h"
95
96/*
97 * Routine calculant le produit de deux bases spectrales en utilisant en fait
98 * le produit des symetries par rapport au plan z=0
99 *
100 * Si le resultat n'est pas defini le resultat est dans etat == ETATNONDEF
101 *
102 */
103
104namespace Lorene {
105Base_val operator* (const Base_val& b1, const Base_val& b2) {
106
107 assert (b1.nzone == b2.nzone) ;
108
109 Base_val res(b1.nzone) ;
110
111 int base, indic_r, indic_t, indic_p ;
112 int b1_r, b2_r, b1_t, b2_t, b1_p, b2_p ; // Confort ;
113
114 int indic_total = 1 ;
115
116 //Boucle sur les zones :
117 for (int l=0 ; l<b1.nzone ; l++) {
118
119 indic_r = -1 ;
120 indic_t = -1 ;
121 indic_p = -1 ;
122
123 b1_r = b1.b[l] & MSQ_R ;
124 b1_t = b1.b[l] & MSQ_T ;
125 b1_p = b1.b[l] & MSQ_P ;
126 b2_r = b2.b[l] & MSQ_R ;
127 b2_t = b2.b[l] & MSQ_T ;
128 b2_p = b2.b[l] & MSQ_P ;
129
130 base = 0 ;
131
132 switch (b1_p) {
133 case P_COSSIN :
134 switch (b2_p) {
135 case P_COSSIN :
136 base = P_COSSIN ;
137 indic_p = 1 ;
138 break ;
139 default :
140 break ;
141 }
142 break ;
143
144 case P_COSSIN_P :
145 switch (b2_p) {
146 case P_COSSIN_P :
147 base = P_COSSIN_P ;
148 indic_p = 1 ;
149 break ;
150
151 case P_COSSIN_I :
152 base = P_COSSIN_I ;
153 indic_p = 1 ;
154 break ;
155
156 default :
157 break ;
158 }
159 break ;
160
161 case P_COSSIN_I :
162 switch (b2_p) {
163 case P_COSSIN_P :
164 base = P_COSSIN_I ;
165 indic_p = 1 ;
166 break ;
167
168 case P_COSSIN_I :
169 base = P_COSSIN_P ;
170 indic_p = 1 ;
171 break ;
172
173 default :
174 break ;
175 }
176 break ;
177
178 default :
179 break ;
180 }
181
182 switch (b1_t) {
183
184 case T_COSSIN_CP :
185 switch (b2_t) {
186 case T_COSSIN_CP :
187 base = base | T_COSSIN_CP ;
188 indic_t = 1 ;
189 break ;
190
191 case T_COSSIN_CI :
192 base = base | T_COSSIN_CI ;
193 indic_t = 1 ;
194 break ;
195
196 case T_COSSIN_SP :
197 base = base | T_COSSIN_SP ;
198 indic_t = 1 ;
199 break ;
200
201 case T_COSSIN_SI :
202 base = base | T_COSSIN_SI ;
203 indic_t = 1 ;
204 break ;
205
206 default :
207 break ;
208 }
209 break ;
210
211 case T_COSSIN_CI :
212 switch (b2_t) {
213 case T_COSSIN_CP :
214 base = base | T_COSSIN_CI ;
215 indic_t = 1 ;
216 break ;
217
218 case T_COSSIN_CI :
219 base = base | T_COSSIN_CP ;
220 indic_t = 1 ;
221 break ;
222
223 case T_COSSIN_SP :
224 base = base | T_COSSIN_SI ;
225 indic_t = 1 ;
226 break ;
227
228 case T_COSSIN_SI :
229 base = base | T_COSSIN_SP ;
230 indic_t = 1 ;
231 break ;
232
233 default :
234 break ;
235 }
236 break ;
237
238 case T_COSSIN_SP :
239 switch (b2_t) {
240 case T_COSSIN_CP :
241 base = base | T_COSSIN_SP ;
242 indic_t = 1 ;
243 break ;
244
245 case T_COSSIN_CI :
246 base = base | T_COSSIN_SI ;
247 indic_t = 1 ;
248 break ;
249
250 case T_COSSIN_SP :
251 base = base | T_COSSIN_CP ;
252 indic_t = 1 ;
253 break ;
254
255 case T_COSSIN_SI :
256 base = base | T_COSSIN_CI ;
257 indic_t = 1 ;
258 break ;
259
260 default :
261 break ;
262 }
263 break ;
264
265 case T_COSSIN_SI :
266 switch (b2_t) {
267 case T_COSSIN_CP :
268 base = base | T_COSSIN_SI ;
269 indic_t = 1 ;
270 break ;
271
272 case T_COSSIN_CI :
273 base = base | T_COSSIN_SP ;
274 indic_t = 1 ;
275 break ;
276
277 case T_COSSIN_SP :
278 base = base | T_COSSIN_CI ;
279 indic_t = 1 ;
280 break ;
281
282 case T_COSSIN_SI :
283 base = base | T_COSSIN_CP ;
284 indic_t = 1 ;
285 break ;
286
287 default :
288 break ;
289 }
290 break ;
291
292 case T_COS_P :
293 switch (b2_t) {
294 case T_COS_P :
295 base = base | T_COS_P ;
296 indic_t = 1 ;
297 break ;
298
299 case T_COS_I :
300 base = base | T_COS_I ;
301 indic_t = 1 ;
302 break ;
303
304 case T_SIN_I :
305 base = base | T_SIN_I ;
306 indic_t = 1 ;
307 break ;
308
309 case T_SIN_P :
310 base = base | T_SIN_P ;
311 indic_t = 1 ;
312 break ;
313
314 default :
315 break ;
316 }
317 break ;
318
319 case T_COS_I :
320 switch (b2_t) {
321 case T_COS_P :
322 base = base | T_COS_I ;
323 indic_t = 1 ;
324 break ;
325
326 case T_COS_I :
327 base = base | T_COS_P ;
328 indic_t = 1 ;
329 break ;
330
331 case T_SIN_I :
332 base = base | T_SIN_P ;
333 indic_t = 1 ;
334 break ;
335
336 case T_SIN_P :
337 base = base | T_SIN_I ;
338 indic_t = 1 ;
339 break ;
340
341 default :
342 break ;
343 }
344 break ;
345
346 case T_SIN_P :
347 switch (b2_t) {
348 case T_SIN_P :
349 base = base | T_COS_P ;
350 indic_t = 1 ;
351 break ;
352
353 case T_COS_P :
354 base = base | T_SIN_P ;
355 indic_t = 1 ;
356 break ;
357
358 case T_COS_I :
359 base = base | T_SIN_I ;
360 indic_t = 1 ;
361 break ;
362
363 case T_SIN_I :
364 base = base | T_COS_I ;
365 indic_t = 1 ;
366 break ;
367
368 default :
369 break ;
370 }
371 break ;
372
373 case T_SIN_I :
374 switch (b2_t) {
375 case T_SIN_I :
376 base = base | T_COS_P ;
377 indic_t = 1 ;
378 break ;
379
380 case T_COS_I :
381 base = base | T_SIN_P ;
382 indic_t = 1 ;
383 break ;
384
385 case T_COS_P :
386 base = base | T_SIN_I ;
387 indic_t = 1 ;
388 break ;
389
390 case T_SIN_P :
391 base = base | T_COS_I ;
392 indic_t = 1 ;
393 break ;
394
395 default :
396 break ;
397 }
398 break ;
399
400 case T_COSSIN_C :
401 switch (b2_t) {
402 case T_COSSIN_C :
403 base = base | T_COSSIN_C ;
404 indic_t = 1 ;
405 break ;
406
407 case T_COSSIN_S :
408 base = base | T_COSSIN_S ;
409 indic_t = 1 ;
410 break ;
411
412 default :
413 break ;
414 }
415 break ;
416
417 case T_COSSIN_S :
418 switch (b2_t) {
419 case T_COSSIN_C :
420 base = base | T_COSSIN_S ;
421 indic_t = 1 ;
422 break ;
423
424 case T_COSSIN_S :
425 base = base | T_COSSIN_C ;
426 indic_t = 1 ;
427 break ;
428
429 default :
430 break ;
431 }
432 break ;
433
434 case T_LEG_P :
435 switch (b2_t) {
436 case T_LEG_P :
437 base = base | T_LEG_P ;
438 indic_t = 1 ;
439 break ;
440 case T_LEG_I :
441 base = base | T_LEG_I ;
442 indic_t = 1 ;
443 break ;
444 default :
445 break ;
446 }
447 break ;
448
449 case T_COS :
450 switch (b2_t) {
451 case T_COS :
452 base = base | T_COS ;
453 indic_t = 1 ;
454 break ;
455
456 case T_SIN :
457 base = base | T_SIN ;
458 indic_t = 1 ;
459 break ;
460
461 default :
462 break ;
463 }
464 break ;
465
466 case T_SIN :
467 switch (b2_t) {
468 case T_SIN :
469 base = base | T_COS ;
470 indic_t = 1 ;
471 break ;
472
473 case T_COS :
474 base = base | T_SIN ;
475 indic_t = 1 ;
476 break ;
477
478 default :
479 break ;
480 }
481 break ;
482
483 case T_LEG_I :
484 switch (b2_t) {
485 case T_LEG_P :
486 base = base | T_LEG_I ;
487 indic_t = 1 ;
488 break ;
489 case T_LEG_I :
490 base = base | T_LEG_P ;
491 indic_t = 1 ;
492 break ;
493 default :
494 break ;
495 }
496 break ;
497
498
499 case T_LEG :
500 switch (b2_t) {
501 case T_LEG :
502 base = base | T_LEG ;
503 indic_t = 1 ;
504 break ;
505
506 default :
507 break ;
508 }
509 break ;
510
511 case T_LEG_MP :
512 switch (b2_t) {
513 case T_LEG_MP :
514 base = base | T_LEG_MP ;
515 indic_t = 1 ;
516 break ;
517
518 case T_LEG_MI :
519 base = base | T_LEG_MI ;
520 indic_t = 1 ;
521 break ;
522
523 default :
524 break ;
525 }
526 break ;
527
528 case T_LEG_MI :
529 switch (b2_t) {
530 case T_LEG_MP :
531 base = base | T_LEG_MI ;
532 indic_t = 1 ;
533 break ;
534
535 case T_LEG_MI :
536 base = base | T_LEG_MP ;
537 indic_t = 1 ;
538 break ;
539
540 default :
541 break ;
542 }
543 break ;
544
545
546 default :
547 break ;
548 }
549
550 switch (b1_r) {
551
552 case R_CHEB :
553 switch (b2_r) {
554 case R_CHEB :
555 base = base | R_CHEB ;
556 indic_r = 1 ;
557 break ;
558
559 default :
560 break ;
561 }
562 break ;
563
564 case R_LEG :
565 switch (b2_r) {
566 case R_LEG :
567 base = base | R_LEG ;
568 indic_r = 1 ;
569 break ;
570
571 default :
572 break ;
573 }
574 break ;
575
576 case R_JACO02 :
577 switch (b2_r) {
578 case R_JACO02 :
579 base = base | R_JACO02 ;
580 indic_r = 1 ;
581 break ;
582
583 default :
584 break ;
585 }
586 break ;
587
588 case R_CHEBU :
589 switch (b2_r) {
590 case R_CHEBU :
591 base = base | R_CHEBU ;
592 indic_r = 1 ;
593 break ;
594
595 default :
596 break ;
597 }
598 break ;
599
600 case R_CHEBPIM_P :
601 switch (b2_r) {
602 case R_CHEBPIM_P :
603 base = base | R_CHEBPIM_P ;
604 indic_r = 1 ;
605 break ;
606
607 case R_CHEBPIM_I :
608 base = base | R_CHEBPIM_I ;
609 indic_r = 1 ;
610 break ;
611
612 default :
613 break ;
614 }
615 break ;
616
617 case R_CHEBPIM_I :
618 switch (b2_r) {
619 case R_CHEBPIM_P :
620 base = base | R_CHEBPIM_I ;
621 indic_r = 1 ;
622 break ;
623
624 case R_CHEBPIM_I :
625 base = base | R_CHEBPIM_P ;
626 indic_r = 1 ;
627 break ;
628
629 default :
630 break ;
631 }
632 break ;
633
634 case R_CHEBPI_I :
635 switch (b2_r) {
636 case R_CHEBPI_P :
637 base = base | R_CHEBPI_I ;
638 indic_r = 1 ;
639 break ;
640
641 case R_CHEBPI_I :
642 base = base | R_CHEBPI_P ;
643 indic_r = 1 ;
644 break ;
645
646 default :
647 break ;
648 }
649 break ;
650
651 case R_CHEBPI_P :
652 switch (b2_r) {
653 case R_CHEBPI_P :
654 base = base | R_CHEBPI_P ;
655 indic_r = 1 ;
656 break ;
657
658 case R_CHEBPI_I :
659 base = base | R_CHEBPI_I ;
660 indic_r = 1 ;
661 break ;
662
663 default :
664 break ;
665 }
666 break ;
667
668 case R_CHEBP :
669 switch (b2_r) {
670 case R_CHEBP :
671 base = base | R_CHEBP ;
672 indic_r = 1 ;
673 break ;
674
675 case R_CHEBI :
676 base = base | R_CHEBI ;
677 indic_r = 1 ;
678 break ;
679
680 default :
681 break ;
682 }
683 break ;
684
685 case R_CHEBI :
686 switch (b2_r) {
687 case R_CHEBP :
688 base = base | R_CHEBI ;
689 indic_r = 1 ;
690 break ;
691
692 case R_CHEBI :
693 base = base | R_CHEBP ;
694 indic_r = 1 ;
695 break ;
696
697 default :
698 break ;
699 }
700 break ;
701
702 case R_LEGP :
703 switch (b2_r) {
704 case R_LEGP :
705 base = base | R_LEGP ;
706 indic_r = 1 ;
707 break ;
708
709 case R_LEGI :
710 base = base | R_LEGI ;
711 indic_r = 1 ;
712 break ;
713
714 default :
715 break ;
716 }
717 break ;
718
719 case R_LEGI :
720 switch (b2_r) {
721 case R_LEGP :
722 base = base | R_LEGI ;
723 indic_r = 1 ;
724 break ;
725
726 case R_LEGI :
727 base = base | R_LEGP ;
728 indic_r = 1 ;
729 break ;
730
731 default :
732 break ;
733 }
734 break ;
735
736 default :
737 break ;
738 }
739
740 if (indic_r*indic_t*indic_p == -1)
741 indic_total = -1 ;
742
743 res.b[l] = base ;
744 }
745
746 if (indic_total == -1)
747 res.set_base_nondef() ;
748
749 return res ;
750}
751}
Base_val(int nb_of_domains)
Standard constructor.
Definition base_val.C:153
int * b
Array (size: nzone ) of the spectral basis in each domain.
Definition base_val.h:334
int nzone
Number of domains (zones).
Definition base_val.h:330
void set_base_nondef()
Sets the spectral bases to NONDEF.
Definition base_val.C:329
Base_val operator*(const Base_val &, const Base_val &)
This operator is used when calling multiplication or division of Valeur .
#define T_LEG_MP
fct. de Legendre associees avec m pair
#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_JACO02
base de Jacobi(0,2) ordinaire (finjac)
#define T_COSSIN_SP
sin pair-cos impair alternes, sin pour m=0
#define R_LEGI
base de Legendre impaire (rare) seulement
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define T_LEG
fct. de Legendre associees
#define T_SIN_P
dev. sin seulement, harmoniques paires
#define MSQ_R
Extraction de l'info sur R.
#define T_COSSIN_S
dev. cos-sin alternes, sin pour m=0
#define R_CHEBPIM_I
Cheb. pair-impair suivant m, impair pour m=0.
#define T_COSSIN_SI
sin impair-cos pair alternes, sin pour m=0
#define R_CHEBPI_I
Cheb. pair-impair suivant l impair pour l=0.
#define R_LEG
base de Legendre ordinaire (fin)
#define T_LEG_P
fct. de Legendre associees paires
#define T_COS_P
dev. cos seulement, harmoniques paires
#define T_COSSIN_CI
cos impair-sin pair alternes, cos pour m=0
#define P_COSSIN
dev. standart
#define P_COSSIN_I
dev. sur Phi = 2*phi, freq. impaires
#define R_CHEBPIM_P
Cheb. pair-impair suivant m, pair pour m=0.
#define T_LEG_MI
fct. de Legendre associees avec m impair
#define MSQ_T
Extraction de l'info sur Theta.
#define T_COSSIN_CP
cos pair-sin impair alternes, cos pour m=0
#define R_CHEB
base de Chebychev ordinaire (fin)
#define T_LEG_I
fct. de Legendre associees impaires
#define T_SIN_I
dev. sin seulement, harmoniques impaires
#define T_COS
dev. cos seulement
#define R_CHEBP
base de Cheb. paire (rare) seulement
#define MSQ_P
Extraction de l'info sur Phi.
#define T_SIN
dev. sin seulement
#define T_COS_I
dev. cos seulement, harmoniques impaires
#define T_COSSIN_C
dev. cos-sin alternes, cos pour m=0
#define R_CHEBPI_P
Cheb. pair-impair suivant l pair pour l=0.
Lorene prototypes.
Definition app_hor.h:67