LORENE
base_vect_spher.C
1/*
2 * Methods of class Base_vect_spher
3 *
4 * (see file base_vect.h for documentation)
5 *
6 */
7
8/*
9 * Copyright (c) 2000-2002 Eric Gourgoulhon
10 * Copyright (c) 2000-2001 Philippe Grandclement
11 *
12 * This file is part of LORENE.
13 *
14 * LORENE is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * LORENE is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with LORENE; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 *
28 */
29
30
31
32/*
33 * $Id: base_vect_spher.C,v 1.8 2016/12/05 16:17:44 j_novak Exp $
34 * $Log: base_vect_spher.C,v $
35 * Revision 1.8 2016/12/05 16:17:44 j_novak
36 * Suppression of some global variables (file names, loch, ...) to prevent redefinitions
37 *
38 * Revision 1.7 2014/10/13 08:52:39 j_novak
39 * Lorene classes and functions now belong to the namespace Lorene.
40 *
41 * Revision 1.6 2014/10/06 15:12:57 j_novak
42 * Modified #include directives to use c++ syntax.
43 *
44 * Revision 1.5 2002/10/16 14:36:31 j_novak
45 * Reorganization of #include instructions of standard C++, in order to
46 * use experimental version 3 of gcc.
47 *
48 * Revision 1.4 2002/07/03 12:31:08 j_novak
49 * cartesian<->spherical triad change for valence 2 Tenseur added (not completely tested)
50 *
51 * Revision 1.3 2002/01/15 09:09:49 e_gourgoulhon
52 * Suppression of cout printing in the comparison operator
53 *
54 * Revision 1.2 2001/12/04 21:27:52 e_gourgoulhon
55 *
56 * All writing/reading to a binary file are now performed according to
57 * the big endian convention, whatever the system is big endian or
58 * small endian, thanks to the functions fwrite_be and fread_be
59 *
60 * Revision 1.1.1.1 2001/11/20 15:19:28 e_gourgoulhon
61 * LORENE
62 *
63 * Revision 2.5 2000/09/19 16:09:40 phil
64 * *** empty log message ***
65 *
66 * Revision 2.4 2000/09/19 15:33:23 phil
67 * ajout passage de cartesinne en spherique
68 *
69 * Revision 2.3 2000/02/09 13:24:47 eric
70 * REFONTE COMPLETE DE LA CLASSE
71 * L'identification n'est plus base sur un membre statique (numero
72 * d'instance) mais sur les caracteres physiques (rot_phi, etc...)
73 * Ajout des membres ori_x, ori_y, ori_z
74 * Ajout des constructeurs par copie et lecture de fichier.
75 *
76 * Revision 2.2 2000/01/10 15:43:57 eric
77 * Methode change_basis.
78 *
79 * Revision 2.1 2000/01/10 13:27:09 eric
80 * Ajout de la fonction set_rot_phi.
81 *
82 * Revision 2.0 2000/01/10 12:43:33 eric
83 * *** empty log message ***
84 *
85 *
86 * $Header: /cvsroot/Lorene/C++/Source/Base_vect/base_vect_spher.C,v 1.8 2016/12/05 16:17:44 j_novak Exp $
87 *
88 */
89
90// Headers C
91#include <cmath>
92#include <cstdlib>
93
94// Headers Lorene
95#include "base_vect.h"
96#include "tenseur.h"
97#include "utilitaires.h"
98
99 //--------------//
100 // Constructors //
101 //--------------//
102
103// Standard constructor without name
104// ---------------------------------
105namespace Lorene {
106Base_vect_spher::Base_vect_spher(double xa0, double ya0, double za0,
107 double rot_phi_i)
108 : ori_x(xa0),
109 ori_y(ya0),
110 ori_z(za0),
111 rot_phi(rot_phi_i) {}
112
113
114
115
116
117// Standard constructor with name
118// ------------------------------
119Base_vect_spher::Base_vect_spher(double xa0, double ya0, double za0,
120 double rot_phi_i, const char* name_i)
121 : Base_vect(name_i),
122 ori_x(xa0),
123 ori_y(ya0),
124 ori_z(za0),
125 rot_phi(rot_phi_i) {}
126
127// Copy constructor
128// ----------------
130 : Base_vect(bi),
131 ori_x(bi.ori_x),
132 ori_y(bi.ori_y),
133 ori_z(bi.ori_z),
134 rot_phi(bi.rot_phi) {}
135
136// Constructor from file
137// ---------------------
139 : Base_vect(fich) {
140
141 fread_be(&ori_x, sizeof(double), 1, fich) ;
142 fread_be(&ori_y, sizeof(double), 1, fich) ;
143 fread_be(&ori_z, sizeof(double), 1, fich) ;
144 fread_be(&rot_phi, sizeof(double), 1, fich) ;
145
146}
147
148
149 //--------------//
150 // Destructor //
151 //--------------//
152
154
155 // does nothing
156
157}
158
159 //--------------//
160 // Mutators //
161 //--------------//
162
163// Assignment
164//-----------
166
167 set_name(bi.name) ;
168
169 ori_x = bi.ori_x ;
170 ori_y = bi.ori_y ;
171 ori_z = bi.ori_z ;
172 rot_phi = bi.rot_phi ;
173
174}
175
176// Change of the elements
177// ----------------------
178void Base_vect_spher::set_ori(double xa0, double ya0, double za0) {
179
180 ori_x = xa0 ;
181 ori_y = ya0 ;
182 ori_z = za0 ;
183
184}
185
186
187void Base_vect_spher::set_rot_phi(double rot_phi_i) {
188
189 rot_phi = rot_phi_i ;
190
191}
192
193 //-----------------------//
194 // Comparison operator //
195 //-----------------------//
196
197
199
200 bool resu = true ;
201
202 if ( bi.identify() != identify() ) {
203 // cout << "The second Base_vect is not of type Base_vect_spher !" << endl ;
204 resu = false ;
205 }
206 else{
207
208 const Base_vect_spher& bis = dynamic_cast<const Base_vect_spher&>( bi ) ;
209
210 if (bis.ori_x != ori_x) {
211 cout
212 << "The two Base_vect_spher have different X origin : " << ori_x
213 << " <-> " << bis.ori_x << endl ;
214 resu = false ;
215 }
216
217 if (bis.ori_y != ori_y) {
218 cout
219 << "The two Base_vect_spher have different Y origin : " << ori_y
220 << " <-> " << bis.ori_y << endl ;
221 resu = false ;
222 }
223
224 if (bis.ori_z != ori_z) {
225 cout
226 << "The two Base_vect_spher have different Z origin : " << ori_z
227 << " <-> " << bis.ori_z << endl ;
228 resu = false ;
229 }
230
231 if (bis.rot_phi != rot_phi) {
232 cout
233 << "The two Base_vect_spher have different rot_phi : " << rot_phi
234 << " <-> " << bis.rot_phi << endl ;
235 resu = false ;
236 }
237
238
239 }
240
241 return resu ;
242
243}
244
245 //------------//
246 // Outputs //
247 //------------//
248
249void Base_vect_spher::sauve(FILE* fich) const {
250
251 Base_vect::sauve(fich) ;
252
253 fwrite_be(&ori_x, sizeof(double), 1, fich) ;
254 fwrite_be(&ori_y, sizeof(double), 1, fich) ;
255 fwrite_be(&ori_z, sizeof(double), 1, fich) ;
256 fwrite_be(&rot_phi, sizeof(double), 1, fich) ;
257
258}
259
260ostream& Base_vect_spher::operator>>(ostream & ost) const {
261
262 ost << "Absolute coordinates (X,Y,Z) of the origin : "
263 << ori_x << " " << ori_y << " " << ori_z << endl ;
264 ost << "Azimuthal angle with respect to the Absolute frame : "
265 << rot_phi << endl ;
266
267 return ost ;
268
269}
270
271
272
273
274
275 //--------------------------------------//
276 // Change of basis //
277 //--------------------------------------//
278
280
281
282 assert(ti.get_etat() != ETATNONDEF) ;
283
284 const Base_vect* triad_i = ti.get_triad() ;
285
286 assert(triad_i != 0x0) ;
287
288 if (ti.get_etat() == ETATZERO) {
289 ti.set_triad(*this) ;
290 return ;
291 }
292
293 assert(ti.get_etat() == ETATQCQ) ;
294
295 const Base_vect_cart* bvc = dynamic_cast<const Base_vect_cart*>(triad_i) ;
296 const Base_vect_spher* bvs = dynamic_cast<const Base_vect_spher*>(triad_i) ;
297
298 // ---------------------------------------------
299 // Case where the input triad is a Cartesian one
300 // ---------------------------------------------
301 if (bvc != 0x0) {
302 assert(bvs == 0x0) ;
303
304 switch (ti.get_valence()) {
305
306 case 1 : { // vector
307
308 // The triads should be the same as that associated
309 // with the mapping :
310 const Map* mp = ti.get_mp() ;
311 assert( *this == mp->get_bvect_spher() ) ;
312 assert( *bvc == mp->get_bvect_cart() ) ;
313
314 Cmp vx = ti(0) ;
315 Cmp vy = ti(1) ;
316 Cmp vz = ti(2) ;
317
318 mp->comp_r_from_cartesian(vx, vy, vz, ti.set(0)) ;
319 mp->comp_t_from_cartesian(vx, vy, vz, ti.set(1)) ;
320 mp->comp_p_from_cartesian(vx, vy, ti.set(2)) ;
321
322 break ;
323 }
324
325 case 2 : {
326
327 // The triads should be the same as that associated
328 // with the mapping :
329 const Map* mp = ti.get_mp() ;
330 assert( *this == mp->get_bvect_spher() ) ;
331 assert( *bvc == mp->get_bvect_cart() ) ;
332 //Only for double-covariant tensors
333 for (int i=0; i<2; i++)
334 assert(ti.get_type_indice(i) == COV) ;
335
336 // Temporary storage of the components
337 // the Base_vect *this is not valid...
338 Tenseur tmp(*mp, 2, COV, *this) ;
339 tmp.allocate_all() ;
340 for (int i=0; i<3; i++) {
341 mp->comp_r_from_cartesian(ti(0,i), ti(1,i), ti(2,i)
342 , tmp.set(0,i) ) ;
343 mp->comp_t_from_cartesian(ti(0,i), ti(1,i), ti(2,i)
344 , tmp.set(1,i) ) ;
345 mp->comp_p_from_cartesian(ti(0,i), ti(1,i), tmp.set(2,i) ) ;
346 }
347 for (int i=0; i<3; i++) {
348 mp->comp_r_from_cartesian(tmp(i,0), tmp(i,1), tmp(i,2)
349 , ti.set(i,0) ) ;
350 mp->comp_t_from_cartesian(tmp(i,0), tmp(i,1), tmp(i,2)
351 , ti.set(i,1) ) ;
352 mp->comp_p_from_cartesian(tmp(i,0), tmp(i,1), ti.set(i,2) ) ;
353 }
354
355
356 break ;
357 }
358
359 default : {
360 cout <<
361 "Base_vect_sphere::change_basis : the case of valence "
362 << ti.get_valence() << " is not treated !" << endl ;
363 abort() ;
364 break ;
365 }
366 }
367 } // end of the Cartesian basis case
368
369
370 // ---------------------------------------------
371 // Case where the input triad is a spherical one
372 // ---------------------------------------------
373 if (bvs != 0x0) {
374
375 assert(bvc == 0x0) ;
376
377 cout << "Base_vect_spher::change_basis : case not treated yet !" << endl ;
378 abort() ;
379 } // end of the spherical basis case
380
381 ti.set_triad(*this) ;
382}
383}
Cartesian vectorial bases (triads).
Definition base_vect.h:201
double ori_y
Absolute coordinate Y of the origin.
Definition base_vect.h:314
virtual ~Base_vect_spher()
Destructor.
void operator=(const Base_vect_spher &)
Assignment to another Base_vect_spher.
double ori_x
Absolute coordinate X of the origin.
Definition base_vect.h:313
double ori_z
Absolute coordinate Z of the origin.
Definition base_vect.h:315
virtual bool operator==(const Base_vect &) const
Comparison operator (egality).
virtual void sauve(FILE *) const
Save in a file.
double rot_phi
Angle between the x –axis and the absolute frame X –axis.
Definition base_vect.h:318
void set_ori(double xa0, double ya0, double za0)
Sets a new origin.
void set_rot_phi(double rot_phi_i)
Sets a new value to the angle rot_phi between the x –axis and the absolute frame X –axis.
Base_vect_spher(double xa0, double ya0, double za0, double rot_phi_i)
Standard constructor.
virtual int identify() const
Returns a number to identify the sub-classe of Base_vect the object belongs to.
virtual void change_basis(Tenseur &) const
Change the basis in which the components of a tensor are expressed.
virtual ostream & operator>>(ostream &) const
Operator >>.
Base_vect()
Standard constructor.
Definition base_vect.C:90
virtual int identify() const =0
Returns a number to identify the sub-classe of Base_vect the object belongs to.
virtual void sauve(FILE *) const
Save in a file.
Definition base_vect.C:153
void set_name(const char *name_i)
Sets the basis name.
Definition base_vect.C:137
char name[100]
Name of the basis.
Definition base_vect.h:110
Component of a tensorial field *** DEPRECATED : use class Scalar instead ***.
Definition cmp.h:446
Tensor handling *** DEPRECATED : use class Tensor instead ***.
Definition tenseur.h:304
const Base_vect * get_triad() const
Returns the vectorial basis (triad) on which the components are defined.
Definition tenseur.h:707
Cmp & set()
Read/write for a scalar (see also operator=(const Cmp&) ).
Definition tenseur.C:830
void allocate_all()
Sets the logical state to ETATQCQ (ordinary state) and performs the memory allocation of all the elem...
Definition tenseur.C:663
int get_type_indice(int i) const
Returns the type of the index number i .
Definition tenseur.h:729
const Map * get_mp() const
Returns pointer on the mapping.
Definition tenseur.h:702
int get_valence() const
Returns the valence.
Definition tenseur.h:713
void set_triad(const Base_vect &new_triad)
Assigns a new vectorial basis (triad) of decomposition.
Definition tenseur.C:680
int get_etat() const
Returns the logical state.
Definition tenseur.h:710
int fread_be(int *aa, int size, int nb, FILE *fich)
Reads integer(s) from a binary file according to the big endian convention.
Definition fread_be.C:72
int fwrite_be(const int *aa, int size, int nb, FILE *fich)
Writes integer(s) into a binary file according to the big endian convention.
Definition fwrite_be.C:73
Lorene prototypes.
Definition app_hor.h:67
Map(const Mg3d &)
Constructor from a multi-domain 3D grid.
Definition map.C:142