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