LORENE
cfrjaco02.C
1 /*
2  * Copyright (c) 1999-2002 Eric Gourgoulhon
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  * Transformation de Jacobi (cas fin) sur le troisieme indice (indice
27  * correspondant a r) d'un tableau 3-D.
28  *
29  * Entree:
30  * -------
31  * int* deg : tableau du nombre effectif de degres de liberte dans chacune
32  * des 3 dimensions: le nombre de points de collocation
33  * en r est nr = deg[2] et doit etre de la forme
34  * nr = 2*p + 1
35  * int* dimf : tableau du nombre d'elements de ff dans chacune des trois
36  * dimensions.
37  * On doit avoir dimf[2] >= deg[2] = nr.
38  * NB: pour dimf[0] = 1 (un seul point en phi), la transformation
39  * est bien effectuee.
40  * pour dimf[0] > 1 (plus d'un point en phi), la
41  * transformation n'est effectuee que pour les indices (en phi)
42  * j != 1 et j != dimf[0]-1 (cf. commentaires sur borne_phi).
43  *
44  * double* ff : tableau des valeurs de la fonction aux nr points de
45  * de collocation
46  *
47  * x_i = pointsgausslobatto(nr-1)
48  *
49  * Les valeurs de la fonction doivent etre stockees dans le
50  * tableau ff comme suit
51  * f( x_i ) = ff[ dimf[1]*dimf[2] * j + dimf[2] * k + i ]
52  * ou j et k sont les indices correspondant a phi et theta
53  * respectivement.
54  * L'espace memoire correspondant a ce pointeur doit etre
55  * dimf[0]*dimf[1]*dimf[2] et doit avoir ete alloue avant
56  * l'appel a la routine.
57  *
58  * int* dimc : tableau du nombre d'elements de cf dans chacune des trois
59  * dimensions.
60  * On doit avoir dimc[2] >= deg[2] = nr.
61  *
62  * Sortie:
63  * -------
64  * double* cf : tableau des coefficients c_i de la fonction definis
65  * comme suit (a theta et phi fixes)
66  *
67  * f(x) = som_{i=0}^{nr-1} c_i J_i(x) ,
68  *
69  * ou J_i(x) designe le polynome de Jacobi d'indice (0,2)
70  * de degre i.
71  * Les coefficients c_i (0 <= i <= nr-1) sont stockees dans
72  * le tableau cf comme suit
73  * c_i = cf[ dimc[1]*dimc[2] * j + dimc[2] * k + i ]
74  * ou j et k sont les indices correspondant a phi et theta
75  * respectivement.
76  * L'espace memoire correspondant au pointeur cf doit etre
77  * dimc[0]*dimc[1]*dimc[2] et doit avoir ete alloue avant
78  * l'appel a la routine.
79  *
80  * NB: Si le pointeur ff est egal a cf, la routine ne travaille que sur un
81  * seul tableau, qui constitue une entree/sortie.
82  */
83 
84 // headers du C
85 #include <cstdlib>
86 #include <cassert>
87 
88 #include "tbl.h"
89 
90 // Prototypage des sous-routines utilisees:
91 namespace Lorene {
92 double* coeffjaco(int , double* ) ;
93 
94 //*****************************************************************************
95 
96 void cfrjaco02(const int* deg, const int* dimf, double* ff, const int* dimc,
97  double* cf)
98 
99 {
100 
101 int i, j, k ;
102 
103 // Dimensions des tableaux ff et cf :
104  int n1f = dimf[0] ;
105  int n2f = dimf[1] ;
106  int n3f = dimf[2] ;
107  int n1c = dimc[0] ;
108  int n2c = dimc[1] ;
109  int n3c = dimc[2] ;
110 
111 // Nombres de degres de liberte en r :
112  int nr = deg[2] ;
113 
114 // Tests de dimension:
115  if (nr > n3f) {
116  cout << "cfrjaco02: nr > n3f : nr = " << nr << " , n3f = "
117  << n3f << endl ;
118  abort () ;
119  exit(-1) ;
120  }
121  if (nr > n3c) {
122  cout << "cfrjaco02: nr > n3c : nr = " << nr << " , n3c = "
123  << n3c << endl ;
124  abort () ;
125  exit(-1) ;
126  }
127  if (n1f > n1c) {
128  cout << "cfrjaco02: n1f > n1c : n1f = " << n1f << " , n1c = "
129  << n1c << endl ;
130  abort () ;
131  exit(-1) ;
132  }
133  if (n2f > n2c) {
134  cout << "cfrjaco02: n2f > n2c : n2f = " << n2f << " , n2c = "
135  << n2c << endl ;
136  abort () ;
137  exit(-1) ;
138  }
139 
140 // Nombre de points en radial:
141  int nm1 = nr - 1 ;
142 
143 // boucle sur phi et theta
144 
145  int n2n3f = n2f * n3f ;
146  int n2n3c = n2c * n3c ;
147 
148 /*
149  * Borne de la boucle sur phi:
150  * si n1f = 1, on effectue la boucle une fois seulement.
151  * si n1f > 1, on va jusqu'a j = n1f-2 en sautant j = 1 (les coefficients
152  * j=n1f-1 et j=0 ne sont pas consideres car nuls).
153  */
154  int borne_phi = ( n1f > 1 ) ? n1f-1 : 1 ;
155 
156  for (j=0; j< borne_phi; j++) {
157 
158  if (j==1) continue ; // on ne traite pas le terme en sin(0 phi)
159 
160  for (k=0; k<n2f; k++) {
161 
162  int i0 = n2n3f * j + n3f * k ; // indice de depart
163  double* ff0 = ff + i0 ; // tableau des donnees a transformer
164 
165  i0 = n2n3c * j + n3c * k ; // indice de depart
166  double* cf0 = cf + i0 ; // tableau resultat
167 
168  double* aa = coeffjaco(nm1,ff0) ;
169  for ( i = 0; i < nr ; i++ ) {
170  cf0[i] = aa[i];
171  } // fin de la boucle sur r
172  delete [] aa ;
173  } // fin de la boucle sur theta
174  } // fin de la boucle sur phi
175 
176 }
177 }
Lorene prototypes.
Definition: app_hor.h:67