20 #include "headcpp.hpp"
22 #include "utilities.hpp"
23 #include "spheric.hpp"
25 #include "tensor_impl.hpp"
26 #include "term_eq.hpp"
28 Array<double> mat_inv_leg_even (
int,
int) ;
29 Array<double> mat_inv_leg_odd (
int,
int) ;
30 Array<double> mat_leg_even (
int,
int) ;
31 Array<double> mat_leg_odd (
int,
int) ;
44 cerr <<
"Domain_shell::bc_waves only defined for a tensor" << endl ;
49 cerr <<
"Domain_shell::bc_waves only defined with respect to second order tensor (i.e. valence must be 2)" << endl ;
53 cerr <<
"Domain_shell::bc_waves only defined with respect to Cartesian tensorial basis" << endl ;
58 bool doder = ((gamma.
der_t==0x0) || (omega.
der_d==0x0)) ?
false :
true ;
74 for (
int m=0 ; m<nbrm ; m++)
75 for (
int l=0 ; l<nbrl ; l++) {
76 Rsh[m*nbrl+l] = (m==0) ?
new Term_eq (dom, pow(rmax, -(l+1)), 0) :
new Term_eq (bessel_jl(m*omega*rmax, l)) ;
77 Ish[m*nbrl+l] = (m==0) ?
new Term_eq (dom, pow(rmax, -(l+1)), 0) :
new Term_eq (bessel_yl(m*omega*rmax, l)) ;
78 dRsh[m*nbrl+l] = (m==0) ?
new Term_eq (dom, -(l+1)*pow(rmax, -(l+2)), 0) :
79 new Term_eq (m*omega*bessel_djl(m*omega*rmax, l)) ;
80 dIsh[m*nbrl+l] = (m==0) ?
new Term_eq (dom, -(l+1)*pow(rmax, -(l+2)), 0) :
81 new Term_eq (m*omega*bessel_dyl(m*omega*rmax, l)) ;
109 for (
int k=0 ; k<kkmax ; k+=2) {
116 int jmin = (mm%2==0) ?
int(mm/2) : int((mm-1)/2) ;
117 int jmax = (mm%2==0) ? jjmax : jjmax-1 ;
118 for (
int j=jmin ; j<jmax ; j++) {
120 int ll = (mm%2==0) ? 2*j : 2*j+1 ;
123 double Rvaldrxx =
multipoles_sym (k, j, OUTER_BC, (*gamma.
val_t)(1,1)(dom).der_r(), passage_even) ;
124 double Rvaldrxy =
multipoles_sym (k, j, OUTER_BC, (*gamma.
val_t)(1,2)(dom).der_r(), passage_even) ;
125 double Rvaldryy =
multipoles_sym (k, j, OUTER_BC, (*gamma.
val_t)(2,2)(dom).der_r(), passage_even) ;
126 double Rvaldrzz =
multipoles_sym (k, j, OUTER_BC, (*gamma.
val_t)(3,3)(dom).der_r(), passage_even) ;
128 double Ivaldrxx = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
val_t)(1,1)(dom).der_r(), passage_even) ;
129 double Ivaldrxy = ((k==kkmax-1) || (k==0))? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
val_t)(1,2)(dom).der_r(), passage_even) ;
130 double Ivaldryy = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
val_t)(2,2)(dom).der_r(), passage_even) ;
131 double Ivaldrzz = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
val_t)(3,3)(dom).der_r(), passage_even) ;
145 double Rderdrxx =
multipoles_sym (k, j, OUTER_BC, (*gamma.
der_t)(1,1)(dom).der_r(), passage_even) ;
146 double Rderdrxy =
multipoles_sym (k, j, OUTER_BC, (*gamma.
der_t)(1,2)(dom).der_r(), passage_even) ;
147 double Rderdryy =
multipoles_sym (k, j, OUTER_BC, (*gamma.
der_t)(2,2)(dom).der_r(), passage_even) ;
148 double Rderdrzz =
multipoles_sym (k, j, OUTER_BC, (*gamma.
der_t)(3,3)(dom).der_r(), passage_even) ;
150 double Iderdrxx = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
der_t)(1,1)(dom).der_r(), passage_even) ;
151 double Iderdrxy = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
der_t)(1,2)(dom).der_r(), passage_even) ;
152 double Iderdryy = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
der_t)(2,2)(dom).der_r(), passage_even) ;
153 double Iderdrzz = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_sym (k+1, j, OUTER_BC, (*gamma.
der_t)(3,3)(dom).der_r(), passage_even) ;
155 RdV1 =
new Term_eq (dom, Rvaldrxx-2*Ivaldrxy-Rvaldryy , Rderdrxx-2*Iderdrxy-Rderdryy) ;
156 RdV2 =
new Term_eq (dom, Rvaldrxx+2*Ivaldrxy-Rvaldryy , Rderdrxx+2*Iderdrxy-Rderdryy) ;
157 RdV3 =
new Term_eq (dom, Rvaldrxx+Rvaldryy, Rderdrxx+Rderdryy) ;
158 RdV6 =
new Term_eq (dom, Rvaldrzz, Rderdrzz) ;
160 IdV1 =
new Term_eq (dom, Ivaldrxx+2*Rvaldrxy-Ivaldryy , Iderdrxx+2*Rderdrxy-Iderdryy) ;
161 IdV2 =
new Term_eq (dom, Ivaldrxx-2*Rvaldrxy-Ivaldryy , Iderdrxx-2*Rderdrxy-Iderdryy) ;
162 IdV3 =
new Term_eq (dom, Ivaldrxx+Ivaldryy, Iderdrxx+Iderdryy) ;
163 IdV6 =
new Term_eq (dom, Ivaldrzz, Iderdrzz) ;
170 RdV1 =
new Term_eq (dom, Rvaldrxx-2*Ivaldrxy-Rvaldryy) ;
171 RdV2 =
new Term_eq (dom, Rvaldrxx+2*Ivaldrxy-Rvaldryy) ;
172 RdV3 =
new Term_eq (dom, Rvaldrxx+Rvaldryy) ;
173 RdV6 =
new Term_eq (dom, Rvaldrzz) ;
175 IdV1 =
new Term_eq (dom, Ivaldrxx+2*Rvaldrxy-Ivaldryy) ;
176 IdV2 =
new Term_eq (dom, Ivaldrxx-2*Rvaldrxy-Ivaldryy) ;
177 IdV3 =
new Term_eq (dom, Ivaldrxx+Ivaldryy) ;
178 IdV6 =
new Term_eq (dom, Ivaldrzz) ;
182 Term_eq RA1 ( *RdV1 / (*dRsh[(mm+2)*nbrl+ll])) ;
183 Term_eq RA2 ( *RdV2 / (*dRsh[abs(mm-2)*nbrl+ll])) ;
184 Term_eq RA3 ( *RdV3 / (*dRsh[mm*nbrl+ll])) ;
185 Term_eq RA6 ( *RdV6 / (*dRsh[mm*nbrl+ll])) ;
187 Term_eq IA1 ( *IdV1 / (*dIsh[(mm+2)*nbrl+ll])) ;
188 Term_eq IA2 ( *IdV2 / (*dIsh[abs(mm-2)*nbrl+ll])) ;
189 Term_eq IA3 ( *IdV3 / (*dIsh[mm*nbrl+ll])) ;
190 Term_eq IA6 ( *IdV6 / (*dIsh[mm*nbrl+ll])) ;
193 Term_eq Rxx (0.25*RA1*(*Rsh[(mm+2)*nbrl+ll]) + 0.25*RA2*(*Rsh[abs(mm-2)*nbrl+ll])
194 + 0.5*RA3*(*Rsh[mm*nbrl+ll])) ;
196 Term_eq Ixx (0.25*IA1*(*Ish[(mm+2)*nbrl+ll]) + 0.25*IA2*(*Ish[abs(mm-2)*nbrl+ll])
197 + 0.5*IA3*(*Ish[mm*nbrl+ll])) ;
199 Term_eq Rxy (0.25*IA1*(*Ish[(mm+2)*nbrl+ll]) - 0.25*IA2*(*Ish[abs(mm-2)*nbrl+ll])) ;
201 Term_eq Ixy (-0.25*RA1*(*Rsh[(mm+2)*nbrl+ll]) + 0.25*RA2*(*Rsh[abs(mm-2)*nbrl+ll])) ;
203 Term_eq Ryy (-0.25*RA1*(*Rsh[(mm+2)*nbrl+ll]) - 0.25*RA2*(*Rsh[abs(mm-2)*nbrl+ll])
204 + 0.5*RA3*(*Rsh[mm*nbrl+ll])) ;
206 Term_eq Iyy (-0.25*IA1*(*Ish[(mm+2)*nbrl+ll]) - 0.25*IA2*(*Ish[abs(mm-2)*nbrl+ll])
207 + 0.5*IA3*(*Ish[mm*nbrl+ll])) ;
209 Term_eq Rzz (RA6*(*Rsh[mm*nbrl+ll])) ;
211 Term_eq Izz (IA6*(*Ish[mm*nbrl+ll])) ;
219 for (
int inds=0 ; inds<
nbr_coefs(1) ; inds++) {
221 posylm.
set(1) = inds ;
237 if ((k!=kkmax-1) && (k!=0)) {
269 for (
int k=0 ; k<kkmax ; k+=2)
277 int jmin = (mm%2==0) ?
int(mm/2) : int((mm+1)/2) ;
279 for (
int j=jmin ; j<jmax ; j++) {
281 int ll = (mm%2==0) ? 2*j+1 : 2*j ;
284 double Rvaldrxz =
multipoles_asym (k, j, OUTER_BC, (*gamma.
val_t)(1,3)(dom).der_r(), passage_odd) ;
285 double Rvaldryz =
multipoles_asym (k, j, OUTER_BC, (*gamma.
val_t)(2,3)(dom).der_r(), passage_odd) ;
287 double Ivaldrxz = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_asym (k+1, j, OUTER_BC, (*gamma.
val_t)(1,3)(dom).der_r(), passage_odd) ;
288 double Ivaldryz = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_asym (k+1, j, OUTER_BC, (*gamma.
val_t)(2,3)(dom).der_r(), passage_odd) ;
297 double Rderdrxz =
multipoles_asym (k, j, OUTER_BC, (*gamma.
der_t)(1,3)(dom).der_r(), passage_odd) ;
298 double Rderdryz =
multipoles_asym (k, j, OUTER_BC, (*gamma.
der_t)(2,3)(dom).der_r(), passage_odd) ;
300 double Iderdrxz = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_asym (k+1, j, OUTER_BC, (*gamma.
der_t)(1,3)(dom).der_r(), passage_odd) ;
301 double Iderdryz = ((k==kkmax-1) || (k==0)) ? 0 :
multipoles_asym (k+1, j, OUTER_BC, (*gamma.
der_t)(2,3)(dom).der_r(), passage_odd) ;
303 RdV4 =
new Term_eq (dom, Rvaldrxz - Ivaldryz, Rderdrxz - Iderdryz) ;
304 RdV5 =
new Term_eq (dom, Rvaldrxz + Ivaldryz, Rderdrxz + Iderdryz) ;
306 IdV4 =
new Term_eq (dom, Ivaldrxz + Rvaldryz, Iderdrxz + Rderdryz) ;
307 IdV5 =
new Term_eq (dom, Ivaldrxz - Rvaldryz, Iderdrxz - Rderdryz) ;
310 RdV4 =
new Term_eq (dom, Rvaldrxz - Ivaldryz) ;
311 RdV5 =
new Term_eq (dom, Rvaldrxz + Ivaldryz) ;
313 IdV4 =
new Term_eq (dom, Ivaldrxz + Rvaldryz) ;
314 IdV5 =
new Term_eq (dom, Ivaldrxz - Rvaldryz) ;
317 Term_eq RA4 ( *RdV4 / (*dRsh[(mm+1)*nbrl+ll])) ;
318 Term_eq RA5 ( *RdV5 / (*dRsh[abs(mm-1)*nbrl+ll])) ;
320 Term_eq IA4 ( *IdV4 / (*dIsh[(mm+1)*nbrl+ll])) ;
321 Term_eq IA5 ( *IdV5 / (*dIsh[abs(mm-1)*nbrl+ll])) ;
327 Term_eq Rxz (0.5*RA4*(*Rsh[(mm+1)*nbrl+ll]) + 0.5*RA5*(*Rsh[abs(mm-1)*nbrl+ll])) ;
328 Term_eq Ixz (0.5*IA4*(*Ish[(mm+1)*nbrl+ll]) + 0.5*IA5*(*Ish[abs(mm-1)*nbrl+ll])) ;
330 Term_eq Ryz (0.5*IA4*(*Ish[(mm+1)*nbrl+ll]) - 0.5*IA5*(*Ish[abs(mm-1)*nbrl+ll])) ;
331 Term_eq Iyz (-0.5*RA4*(*Rsh[(mm+1)*nbrl+ll]) + 0.5*RA5*(*Rsh[abs(mm-1)*nbrl+ll])) ;
338 for (
int inds=0 ; inds<
nbr_coefs(1) ; inds++) {
340 posylm.
set(1) = inds ;
352 if ((k!=kkmax-1) && (k!=0)) {
373 for (
int i=0 ; i<nbrm*nbrl ; i++) {
385 return Term_eq (dom, valres, derres) ;
int get_basis(int nd) const
Read only the basis in a given domain.
virtual double multipoles_asym(int, int, int, const Val_domain &, const Array< double > &) const
Extraction of a given multipole, at some boundary, for a anti-symmetric scalar function.
virtual double multipoles_sym(int, int, int, const Val_domain &, const Array< double > &) const
Extraction of a given multipole, at some boundary, for a symmetric scalar function.
Term_eq bc_waves(const Term_eq &gamma, const Term_eq &omega) const
Gives an matching of the spatial metric, based on homogeneous solutions of outgoing waves.
Dim_array nbr_coefs
Number of coefficients.
Val_domain const & get_radius() const
Returns the generalized radius.
Dim_array nbr_points
Number of colocation points.
Class that gives the position inside a multi-dimensional Array.
int & set(int i)
Read/write of the position in a given dimension.
bool inc(int increm, int var=0)
Increments the position of the Index.
Val_domain & set_domain(int)
Read/write of a particular Val_domain.
virtual void std_base()
Sets the standard spectal bases of decomposition for each component.
Scalar & set(const Array< int > &ind)
Returns the value of a component (read/write version).
const Base_tensor & get_basis() const
Returns the vectorial basis (triad) on which the components are defined.
int get_n_comp() const
Returns the number of stored components.
virtual Array< int > indices(int pos) const
Gives the values of the indices corresponding to a location in the array used for storage of the comp...
int get_valence() const
Returns the valence.
This class is intended to describe the manage objects appearing in the equations.
Tensor * der_t
Pointer on the variation, if the Term_eq is a Tensor.
const int type_data
Flag describing the type of data :
double * val_d
Pointer on the value, if the Term_eq is a double.
double * der_d
Pointer on the variation if the Term_eq is a double.
Tensor * val_t
Pointer on the value, if the Term_eq is a Tensor.
double & set_coef(const Index &pos)
Read/write the value of the field in the coefficient space.
void allocate_coef()
Allocates the values in the coefficient space and destroys the values in the configuration space.