KADATH
domain_nucleus_symphi_ope.cpp
1 /*
2  Copyright 2017 Philippe Grandclement
3 
4  This file is part of Kadath.
5 
6  Kadath 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 3 of the License, or
9  (at your option) any later version.
10 
11  Kadath 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 Kadath. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "headcpp.hpp"
21 #include "spheric_symphi.hpp"
22 #include "val_domain.hpp"
23 #include "array_math.hpp"
24 namespace Kadath {
25 int mult_cos_1d (int, Array<double>&) ;
26 int mult_sin_1d (int, Array<double>&) ;
27 int div_sin_1d (int, Array<double>&) ;
28 int div_cos_1d (int, Array<double>&) ;
29 int div_x_1d (int, Array<double>&) ;
30 int mult_x_1d (int, Array<double>&) ;
31 int div_1mx2_1d (int, Array<double>&) ;
32 
34  so.coef() ;
35  Val_domain res(this) ;
36 
37  res.base= so.base ;
38 
39  res.cf = new Array<double> (so.base.ope_1d(mult_cos_1d, 2, *so.cf, res.base)) ;
40  res.in_coef = true ;
41  return res ;
42 }
43 
45  so.coef() ;
46  Val_domain res(this) ;
47 
48  res.base= so.base ;
49 
50  res.cf = new Array<double> (so.base.ope_1d(mult_sin_1d, 2, *so.cf, res.base)) ;
51  res.in_coef = true ;
52  return res ;
53 }
54 
56  so.coef() ;
57  Val_domain res(this) ;
58  res.base = so.base ;
59  res.cf = new Array<double> (so.base.ope_1d(mult_cos_1d, 1, *so.cf, res.base)) ;
60  res.in_coef = true ;
61  return res ;
62 }
63 
65 
66  so.coef() ;
67  Val_domain res(this) ;
68 
69  res.base= so.base ;
70  res.cf = new Array<double> (so.base.ope_1d(mult_sin_1d, 1, *so.cf, res.base)) ;
71  res.in_coef = true ;
72  return res ;
73 }
74 
76  so.coef() ;
77  Val_domain res(this) ;
78 
79  res.base = so.base ;
80 
81  res.cf = new Array<double> (so.base.ope_1d(div_sin_1d, 1, *so.cf, res.base)) ;
82  res.in_coef = true ;
83  return res ;
84 }
85 
87  so.coef() ;
88  Val_domain res(this) ;
89 
90  res.base = so.base ;
91 
92  res.cf = new Array<double> (so.base.ope_1d(div_cos_1d, 1, *so.cf, res.base)) ;
93  res.in_coef = true ;
94  return res ;
95 }
96 
98  so.coef() ;
99  Val_domain res(this) ;
100 
101  res.base= so.base ;
102 
103  res.cf = new Array<double> (so.base.ope_1d(div_x_1d, 0, *so.cf, res.base)) ;
104  res.in_coef = true ;
105  return res ;
106 }
107 
109  so.coef() ;
110  Val_domain res(this) ;
111 
112  res.base= so.base ;
113 
114  res.cf = new Array<double> (so.base.ope_1d(div_1mx2_1d, 0, *so.cf, res.base)) ;
115  res.in_coef = true ;
116  return res ;
117 }
118 
120  so.coef() ;
121  Val_domain res(this) ;
122 
123  res.base= so.base ;
124 
125  res.cf = new Array<double> (so.base.ope_1d(mult_x_1d, 0, *so.cf, res.base)) ;
126  *res.cf *= alpha ;
127  res.in_coef = true ;
128  return res ;
129 }
130 
132  so.coef() ;
133  Val_domain res(this) ;
134 
135  res.base= so.base ;
136 
137  res.cf = new Array<double> (so.base.ope_1d(div_x_1d, 0, *so.cf, res.base)) ;
138  *res.cf /= alpha ;
139  res.in_coef = true ;
140  return res ;
141 }
142 
144  return (so.der_var(1)/alpha) ;
145 }
146 
148  return (so.der_var(3).der_var(3)) ;
149 }
150 
152  return (div_x(so.der_var(1)) / alpha / alpha) ;
153 }
154 
155 double integral_1d (int, const Array<double>&) ;
156 double Domain_nucleus_symphi::integ_volume (const Val_domain& so) const { // compute int (so*r*r*sin(theta) dr dtheta dphi)
157 
158  if (so.check_if_zero())
159  return 0 ;
160  else {
161 
162  Val_domain integrant (mult_r(mult_r(mult_sin_theta(so)))*alpha) ;
163  integrant.coef() ;
164 
165  double val = 0 ;
166  int basep = (*integrant.get_base().bases_1d[2]) (0) ;
167  if (basep==COS_EVEN) {
168  // Only k = 0
169  int baset = (*integrant.get_base().bases_1d[1]) (0) ;
170  assert(baset==SIN_ODD) ;
171  Index pos (nbr_coefs) ;
172  for (int j=0 ; j<nbr_coefs(1) ; j++) {
173  pos.set(1) = j ;
174  int baser = (*integrant.get_base().bases_1d[0]) (j, 0) ;
175  assert (baser==CHEB_EVEN) ;
176 
177  Array<double> cf (nbr_coefs(0)) ;
178  for (int i=0 ; i<nbr_coefs(0) ; i++) {
179  pos.set(0) = i ;
180  cf.set(i) = integrant.get_coef(pos) ;
181  }
182  val += 2./(2.*j+1) * integral_1d(CHEB_EVEN, cf) ;
183  }
184  return (val * 2*M_PI) ;
185 }
186 else return 0 ;
187 }
188 }
189 }
reference set(const Index &pos)
Read/write of an element.
Definition: array.hpp:186
Bases_container bases_1d
Arrays containing the various basis of decomposition.
Array< double > ope_1d(int(*function)(int, Array< double > &), int var, const Array< double > &so, Base_spectral &base) const
One-dimensional operator acting in the coefficient space.
Definition: ope_1d.cpp:26
virtual Val_domain div_sin_theta(const Val_domain &) const
Division by .
virtual Val_domain div_cos_theta(const Val_domain &) const
Division by .
virtual Val_domain ddp(const Val_domain &) const
Compute the second derivative with respect to of a scalar field.
virtual Val_domain mult_sin_theta(const Val_domain &) const
Multiplication by .
virtual Val_domain div_x(const Val_domain &) const
Division by .
virtual Val_domain mult_cos_theta(const Val_domain &) const
Multiplication by .
virtual Val_domain mult_sin_phi(const Val_domain &) const
Multiplication by .
virtual Val_domain der_r(const Val_domain &) const
Compute the radial derivative of a scalar field.
virtual Val_domain srdr(const Val_domain &) const
Compute the of a scalar field .
virtual Val_domain mult_r(const Val_domain &) const
Multiplication by .
virtual Val_domain mult_cos_phi(const Val_domain &) const
Multiplication by .
double alpha
Relates the numerical to the physical radii.
virtual Val_domain div_r(const Val_domain &) const
Division by .
virtual Val_domain div_1mx2(const Val_domain &) const
Division by .
virtual double integ_volume(const Val_domain &so) const
Volume integral.
Dim_array nbr_coefs
Number of coefficients.
Definition: space.hpp:66
Class that gives the position inside a multi-dimensional Array.
Definition: index.hpp:38
int & set(int i)
Read/write of the position in a given dimension.
Definition: index.hpp:72
Class for storing the basis of decompositions of a field and its values on both the configuration and...
Definition: val_domain.hpp:69
Base_spectral base
Spectral basis of the field.
Definition: val_domain.hpp:72
bool check_if_zero() const
Check whether the logical state is zero or not.
Definition: val_domain.hpp:142
Array< double > * cf
Pointer on the Array of the values in the coefficients space.
Definition: val_domain.hpp:77
bool in_coef
Is the field known in the coefficient space ?
Definition: val_domain.hpp:79
void coef() const
Computes the coefficients.
Definition: val_domain.cpp:622
Val_domain der_var(int i) const
Computes the derivative with respect to a numerical coordinate.
Definition: val_domain.cpp:670
Array< double > get_coef() const
Definition: val_domain.hpp:136
const Base_spectral & get_base() const
Returns the basis of decomposition.
Definition: val_domain.hpp:122