KADATH
domain_oned_ori.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 "utilities.hpp"
22 #include "oned.hpp"
23 #include "point.hpp"
24 #include "array_math.hpp"
25 #include "val_domain.hpp"
26 
27 namespace Kadath {
28 void coef_1d (int, Array<double>&) ;
29 void coef_i_1d (int, Array<double>&) ;
30 int der_1d (int, Array<double>&) ;
31 
32 // Standard constructor
33 Domain_oned_ori::Domain_oned_ori (int num, int ttype, double lim, const Dim_array& nbr) :
34  Domain(num, ttype, nbr), alpha(lim) {
35  assert (nbr.get_ndim()==1) ;
36  do_coloc() ;
37 }
38 
39 // Constructor by copy
40 Domain_oned_ori::Domain_oned_ori (const Domain_oned_ori& so) : Domain(so), alpha(so.alpha) {
41 }
42 
43 Domain_oned_ori::Domain_oned_ori (int num, FILE* fd) : Domain(num, fd) {
44  fread_be (&alpha, sizeof(double), 1, fd) ;
45  do_coloc() ;
46 }
47 
48 // Destructor
50 
51 void Domain_oned_ori::save (FILE* fd) const {
52  nbr_points.save(fd) ;
53  nbr_coefs.save(fd) ;
54  fwrite_be (&ndim, sizeof(int), 1, fd) ;
55  fwrite_be (&type_base, sizeof(int), 1, fd) ;
56  fwrite_be (&alpha, sizeof(double), 1, fd) ;
57 }
58 
59 ostream& Domain_oned_ori::print (ostream& o) const {
60  o << "One dimensional domain containing 0" << endl ;
61  o << "Rmax = " << alpha << endl ;
62  o << "Nbr pts = " << nbr_points << endl ;
63  o << endl ;
64  return o ;
65 }
66 
67 
68 Val_domain Domain_oned_ori::der_normal (const Val_domain& so, int bound) const {
69 
70  Val_domain res (so.der_var(1)) ;
71  switch (bound) {
72  case OUTER_BC :
73  res /= alpha ;
74  break ;
75  default:
76  cerr << "Unknown boundary case in Domain_oned_ori::der_normal" << endl ;
77  abort() ;
78  }
79 return res ;
80 }
81 
82 // Computes the cartesian coordinates
84  assert (coloc[0] != 0x0) ;
85  assert (absol[0] == 0x0) ;
86  absol[0] = new Val_domain(this) ;
87  absol[0]->allocate_conf() ;
88 
89  Index index (nbr_points) ;
90  do {
91  absol[0]->set(index) = alpha* ((*coloc[0])(index(0))) ;
92  }
93  while (index.inc()) ;
94 
95 }
96 
98 
99  assert (coloc[0] != 0x0) ;
100  assert (radius == 0x0) ;
101  radius = new Val_domain(this) ;
102  radius->allocate_conf() ;
103  Index index (nbr_points) ;
104  do
105  radius->set(index) = alpha* ((*coloc[0])(index(0))) ;
106  while (index.inc()) ;
107 }
108 
109 // Is a point inside this domain ?
110 bool Domain_oned_ori::is_in (const Point& xx, double prec) const {
111 
112  assert (xx.get_ndim()==1) ;
113  bool res = ((xx(1)>=-prec) && (xx(1) <= alpha+prec)) ? true : false ;
114  return res ;
115 }
116 
117 // Convert absolute coordinates to numerical ones
118 const Point Domain_oned_ori::absol_to_num(const Point& abs) const {
119 
120  assert (is_in(abs)) ;
121  Point num(1) ;
122  num.set(1) = abs(1)/alpha ;
123  return num ;
124 }
125 
126 double coloc_leg_parity(int, int) ;
128 
129  switch (type_base) {
130  case CHEB_TYPE:
132  del_deriv() ;
133  coloc[0] = new Array<double> (nbr_points(0)) ;
134  for (int i=0 ; i<nbr_points(0) ; i++)
135  coloc[0]->set(i) = sin(M_PI/2.*i/(nbr_points(0)-1)) ;
136  break ;
137  case LEG_TYPE:
139  del_deriv() ;
140  coloc[0] = new Array<double> (nbr_points(0)) ;
141  for (int i=0 ; i<nbr_points(0) ; i++)
142  coloc[0]->set(i) = coloc_leg_parity(i, nbr_points(0)) ;
143  break ;
144  default :
145  cerr << "Unknown type of basis in Domain_oned_ori::do_coloc" << endl ;
146  abort() ;
147  }
148 }
149 
150 // Base for a function symetric in z, using Chebyshev
152  assert (type_base == CHEB_TYPE) ;
153  base.allocate(nbr_coefs) ;
154 
155  base.def=true ;
156  base.bases_1d[0]->set(0) = CHEB_EVEN ;
157 }
158 
159 // Base for a function anti-symetric in z, using Chebyshev
161  assert (type_base == CHEB_TYPE) ;
162  base.allocate(nbr_coefs) ;
163 
164  base.def=true ;
165  base.bases_1d[0]->set(0) = CHEB_ODD ;
166 }
167 
168 // Base for a function symetric in z, using Legendre
170  assert (type_base == LEG_TYPE) ;
171  base.allocate(nbr_coefs) ;
172 
173  base.def=true ;
174  base.bases_1d[0]->set(0) = LEG_EVEN ;
175  }
176 
177 // Base for a function anti-symetric in z, using Legendre
179  assert (type_base == LEG_TYPE) ;
180  base.allocate(nbr_coefs) ;
181 
182  base.def=true ;
183  base.bases_1d[0]->set(0) = LEG_ODD ;
184  }
185 
186 // Computes the derivatives with respect to rho,Z as a function of the numerical ones.
187 void Domain_oned_ori::do_der_abs_from_der_var(const Val_domain *const *const der_var, Val_domain **const der_abs) const {
188  der_abs[0] = new Val_domain (*der_var[0]/alpha) ;
189 }
190 
191 // Rules for the multiplication of two basis.
193 
194  assert (a.ndim==1) ;
195  assert (b.ndim==1) ;
196 
197  Base_spectral res(1) ;
198  bool res_def = true ;
199 
200  if (!a.def)
201  res_def=false ;
202  if (!b.def)
203  res_def=false ;
204 
205  if (res_def) {
206 
207 
208  // Bases in theta :
209  res.bases_1d[0] = new Array<int> (a.bases_1d[0]->get_dimensions()) ;
210  switch ((*a.bases_1d[0])(0)) {
211  case CHEB_EVEN:
212  switch ((*b.bases_1d[0])(0)) {
213  case CHEB_EVEN:
214  res.bases_1d[0]->set(0) = CHEB_EVEN ;
215  break ;
216  case CHEB_ODD:
217  res.bases_1d[0]->set(0) = CHEB_ODD ;
218  break ;
219  default:
220  res_def = false ;
221  break ;
222  }
223  break ;
224 
225  case CHEB_ODD:
226  switch ((*b.bases_1d[0])(0)) {
227  case CHEB_EVEN:
228  res.bases_1d[0]->set(0) = CHEB_ODD ;
229  break ;
230  case CHEB_ODD:
231  res.bases_1d[0]->set(0) = CHEB_EVEN ;
232  break ;
233  default:
234  res_def = false ;
235  break ;
236  }
237  break ;
238  case LEG_EVEN:
239  switch ((*b.bases_1d[0])(0)) {
240  case LEG_EVEN:
241  res.bases_1d[0]->set(0) = LEG_EVEN ;
242  break ;
243  case LEG_ODD:
244  res.bases_1d[0]->set(0) = LEG_ODD ;
245  break ;
246  default:
247  res_def = false ;
248  break ;
249  }
250  break ;
251 
252  case LEG_ODD:
253  switch ((*b.bases_1d[0])(0)) {
254  case LEG_EVEN:
255  res.bases_1d[0]->set(0) = LEG_ODD ;
256  break ;
257  case LEG_ODD:
258  res.bases_1d[0]->set(0) = LEG_EVEN ;
259  break ;
260  default:
261  res_def = false ;
262  break ;
263  }
264  break ;
265  default:
266  res_def = false ;
267  break ;
268  }
269  }
270  if (!res_def)
271  for (int dim=0 ; dim<a.ndim ; dim++)
272  if (res.bases_1d[dim]!= 0x0) {
273  delete res.bases_1d[dim] ;
274  res.bases_1d[dim] = 0x0 ;
275  }
276  res.def = res_def ;
277  return res ;
278 }
279 
280 int Domain_oned_ori::give_place_var (char* p) const {
281  int res = -1 ;
282  if (strcmp(p,"X ")==0)
283  res = 0 ;
284  return res ;
285 }}
Class for storing the basis of decompositions of a field.
Bases_container bases_1d
Arrays containing the various basis of decomposition.
void allocate(const Dim_array &nbr_coefs)
Allocates the various arrays, for a given number of coefficients.
bool def
true if the Base_spectral is defined and false otherwise.
int ndim
Number of dimensions.
Class for storing the dimensions of an array.
Definition: dim_array.hpp:34
int get_ndim() const
Returns the number of dimensions.
Definition: dim_array.hpp:63
void save(FILE *) const
Save function.
Definition: dim_array.cpp:32
Class for a 1-dimensional spherical domain containing the origin.
Definition: oned.hpp:40
virtual void do_absol() const
Computes the absolute coordinates.
virtual void do_der_abs_from_der_var(const Val_domain *const *const der_var, Val_domain **const der_abs) const
Computes the derivative with respect to the absolute Cartesian coordinates from the derivative with r...
virtual int give_place_var(char *) const
Translates a name of a coordinate into its corresponding numerical name.
virtual const Point absol_to_num(const Point &) const
Computes the numerical coordinates from the physical ones.
virtual Base_spectral mult(const Base_spectral &, const Base_spectral &) const
Method for the multiplication of two Base_spectral.
virtual void save(FILE *) const
Saving function.
virtual bool is_in(const Point &xx, double prec=1e-13) const
Check whether a point lies inside Domain.
virtual void do_radius() const
Computes the generalized radius.
virtual void do_coloc()
Computes the colocation points.
virtual void set_legendre_base(Base_spectral &) const
Gives the standard base for Legendre polynomials.
virtual void set_cheb_base_odd(Base_spectral &) const
Gives the base using odd Chebyshev polynomials$.
double alpha
Relates the numerical radius to the physical one.
Definition: oned.hpp:43
virtual ostream & print(ostream &o) const
Delegate function to virtualize the << operator.
virtual void set_cheb_base(Base_spectral &) const
Gives the standard base for Chebyshev polynomials.
Domain_oned_ori(int num, int ttype, double radius, const Dim_array &nbr)
Standard constructor :
virtual void set_legendre_base_odd(Base_spectral &) const
Gives the base using odd Legendre polynomials$.
virtual ~Domain_oned_ori()
Destructor.
virtual Val_domain der_normal(const Val_domain &, int) const
Normal derivative with respect to a given surface.
Abstract class that implements the fonctionnalities common to all the type of domains.
Definition: space.hpp:60
virtual void del_deriv()
Destroys the derivated members (like coloc, cart and radius), when changing the type of colocation po...
Definition: domain.cpp:77
Val_domain * radius
The generalized radius.
Definition: space.hpp:78
Memory_mapped_array< Val_domain * > absol
Asbolute coordinates (if defined ; usually Cartesian-like)
Definition: space.hpp:76
int ndim
Number of dimensions.
Definition: space.hpp:64
Dim_array nbr_coefs
Number of coefficients.
Definition: space.hpp:66
Dim_array nbr_points
Number of colocation points.
Definition: space.hpp:65
int type_base
Type of colocation point :
Definition: space.hpp:73
Memory_mapped_array< Array< double > * > coloc
Colocation points in each dimension (stored in ndim 1d- arrays)
Definition: space.hpp:75
Class that gives the position inside a multi-dimensional Array.
Definition: index.hpp:38
bool inc(int increm, int var=0)
Increments the position of the Index.
Definition: index.hpp:99
The class Point is used to store the coordinates of a point.
Definition: point.hpp:30
const int & get_ndim() const
Returns the number of dimensions.
Definition: point.hpp:51
double & set(int i)
Read/write of a coordinate.
Definition: point.hpp:47
Class for storing the basis of decompositions of a field and its values on both the configuration and...
Definition: val_domain.hpp:69
double & set(const Index &pos)
Read/write the value of the field in the configuration space.
Definition: val_domain.cpp:171
Val_domain der_var(int i) const
Computes the derivative with respect to a numerical coordinate.
Definition: val_domain.cpp:670
void allocate_conf()
Allocates the values in the configuration space and destroys the values in the coefficients space.
Definition: val_domain.cpp:209