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 
104 namespace Lorene {
105 Base_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 }
#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:67
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:330
#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:334
#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:325
#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:329
#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