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 char 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 
101 namespace Lorene {
102 Base_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 }
#define T_LEG
fct. de Legendre associees
Definition: type_parite.h:236
#define T_LEG_MP
fct. de Legendre associees avec m pair
Definition: type_parite.h:238
#define P_COSSIN
dev. standart
Definition: type_parite.h:245
#define R_CHEBPI_I
Cheb. pair-impair suivant l impair pour l=0.
Definition: type_parite.h:174
#define T_LEG_MI
fct. de Legendre associees avec m impair
Definition: type_parite.h:240
Lorene prototypes.
Definition: app_hor.h:64
Base_val operator*(const Base_val &, const Base_val &)
This operator is used when calling multiplication or division of Valeur .
#define MSQ_P
Extraction de l&#39;info sur Phi.
Definition: type_parite.h:156
#define T_COS
dev. cos seulement
Definition: type_parite.h:196
#define T_COSSIN_SP
sin pair-cos impair alternes, sin pour m=0
Definition: type_parite.h:210
#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
int nzone
Number of domains (zones)
Definition: base_val.h:327
#define R_JACO02
base de Jacobi(0,2) ordinaire (finjac)
Definition: type_parite.h:188
#define T_SIN
dev. sin seulement
Definition: type_parite.h:198
#define T_LEG_I
fct. de Legendre associees impaires
Definition: type_parite.h:220
#define T_COS_I
dev. cos seulement, harmoniques impaires
Definition: type_parite.h:204
#define R_CHEBI
base de Cheb. impaire (rare) seulement
Definition: type_parite.h:170
#define R_CHEBP
base de Cheb. paire (rare) seulement
Definition: type_parite.h:168
#define T_COS_P
dev. cos seulement, harmoniques paires
Definition: type_parite.h:200
#define MSQ_T
Extraction de l&#39;info sur Theta.
Definition: type_parite.h:154
#define T_COSSIN_C
dev. cos-sin alternes, cos pour m=0
Definition: type_parite.h:192
int * b
Array (size: nzone ) of the spectral basis in each domain.
Definition: base_val.h:331
#define MSQ_R
Extraction de l&#39;info sur R.
Definition: type_parite.h:152
#define T_SIN_P
dev. sin seulement, harmoniques paires
Definition: type_parite.h:202
#define T_COSSIN_SI
sin impair-cos pair alternes, sin pour m=0
Definition: type_parite.h:214
#define R_CHEBPIM_I
Cheb. pair-impair suivant m, impair pour m=0.
Definition: type_parite.h:178
#define R_CHEBPIM_P
Cheb. pair-impair suivant m, pair pour m=0.
Definition: type_parite.h:176
Bases of the spectral expansions.
Definition: base_val.h:322
#define T_LEG_P
fct. de Legendre associees paires
Definition: type_parite.h:216
#define R_CHEBPI_P
Cheb. pair-impair suivant l pair pour l=0.
Definition: type_parite.h:172
#define T_COSSIN_CI
cos impair-sin pair alternes, cos pour m=0
Definition: type_parite.h:212
void set_base_nondef()
Sets the spectral bases to NONDEF.
Definition: base_val.C:326
#define P_COSSIN_I
dev. sur Phi = 2*phi, freq. impaires
Definition: type_parite.h:249
#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 T_SIN_I
dev. sin seulement, harmoniques impaires
Definition: type_parite.h:206
#define T_COSSIN_S
dev. cos-sin alternes, sin pour m=0
Definition: type_parite.h:194
#define R_LEG
base de Legendre ordinaire (fin)
Definition: type_parite.h:182
#define R_CHEB
base de Chebychev ordinaire (fin)
Definition: type_parite.h:166