KADATH
metric_const.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 "space.hpp"
21 #include "tensor.hpp"
22 #include "metric.hpp"
23 #include "term_eq.hpp"
24 #include "scalar.hpp"
25 #include "tensor_impl.hpp"
26 #include "system_of_eqs.hpp"
27 #include "metric_tensor.hpp"
28 #include "name_tools.hpp"
29 namespace Kadath {
31  Metric_general(met) {
32 }
33 
35  Metric_general (*so.p_met) {
36 }
37 
38 Metric_const::~Metric_const() {
39 }
40 
41 void Metric_const::set_system (System_of_eqs& ss, const char* name_met) {
42 
43  syst = &ss ;
44 
45  if (ss.met!=0x0) {
46  cerr << "Metric already set for the system" << endl ;
47  abort() ;
48  }
49 
50  // Position in the system :
51  place_syst = ss.ndom*ss.ncst ;
52 
53  ss.add_cst (0x0, *p_met) ;
54 
55  ss.met = this ;
56  ss.name_met = new char[LMAX] ;
57  trim_spaces (ss.name_met, name_met) ;
58 }
59 
60 
61 
62 void Metric_const::compute_cov (int dd) const {
63 
64  int dim = espace.get_ndim() ;
65  if (dim!=3) {
66  cerr << "Function only implemented for dimension 3" << endl ;
67  abort() ;
68  }
69 
70  int place = place_syst + (dd-syst->dom_min) ;
71 
72  // Right storage : simple copy.
73  if (type_tensor==COV) {
74 
75  if (p_met_cov[dd]==0x0)
76  p_met_cov[dd] = new Term_eq(*syst->cst[place]) ;
77  else
78  *p_met_cov[dd] = Term_eq(*syst->cst[place]) ;
79  }
80  else {
81  Term_eq** res = new Term_eq* [p_met->get_n_comp()] ;
82 
83 
84  Scalar val (espace) ;
85  Val_domain cmpval(espace.get_domain(dd)) ;
86 
87  Val_domain detval (espace.get_domain(dd)) ;
88  detval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
89  + (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)
90  + (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
91  - (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
92  - (*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,1)(dd)
93  - (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
94 
95  // Compo 1 1
96  cmpval = (*syst->cst[place]->val_t)(2,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
97  -(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
98  val.set_domain(dd) = cmpval / detval ;
99  res[0] = new Term_eq (dd, val) ;
100 
101 
102  // Compo 1 2
103  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
104  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
105  val.set_domain(dd) = cmpval / detval ;
106  res[1] = new Term_eq (dd, val) ;
107 
108  // Compo 1 3
109  cmpval = (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
110  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd) ;
111  val.set_domain(dd) = cmpval / detval ;
112  res[2] = new Term_eq (dd, val) ;
113 
114 
115  // Compo 2 2
116  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
117  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd) ;
118  val.set_domain(dd) = cmpval /detval ;
119  res[3] = new Term_eq (dd, val) ;
120 
121  // Compo 2 3
122  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)
123  -(*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
124  val.set_domain(dd) = cmpval / detval ;
125  res[4] = new Term_eq (dd, val) ;
126 
127 
128  // Compo 3 3
129  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
130  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd) ;
131  val.set_domain(dd) = cmpval /detval ;
132  res[5] = new Term_eq (dd, val) ;
133 
134 
135  // Value field :
136  Metric_tensor resval (espace, COV, basis) ;
137  resval.set(1,1) = res[0]->get_val_t() ;
138  resval.set(1,2) = res[1]->get_val_t() ;
139  resval.set(1,3) = res[2]->get_val_t() ;
140  resval.set(2,2) = res[3]->get_val_t() ;
141  resval.set(2,3) = res[4]->get_val_t() ;
142  resval.set(3,3) = res[5]->get_val_t() ;
143 
144  Metric_tensor zero (espace, COV, basis) ;
145  for (int i=1 ; i<=3 ; i++)
146  for (int j=i ; j<=3 ; j++)
147  zero.set(i,j) = 0 ;
148 
149  if (p_met_cov[dd]==0x0)
150  p_met_cov[dd] = new Term_eq(dd, resval, zero) ;
151  else
152  *p_met_cov[dd] = Term_eq(dd, resval, zero) ;
153  for (int i=0 ; i<p_met->get_n_comp() ; i++)
154  delete res [i] ;
155  delete [] res ;
156  }
157 }
158 
159 
160 void Metric_const::compute_con (int dd) const {
161  int dim = espace.get_ndim() ;
162  if (dim!=3) {
163  cerr << "Function only implemented for dimension 3" << endl ;
164  abort() ;
165  }
166 
167  int place = place_syst + (dd-syst->dom_min) ;
168 
169  // Right storage : simple copy.
170  if (type_tensor==CON) {
171 
172  if (p_met_con[dd]==0x0)
173  p_met_con[dd] = new Term_eq(*syst->cst[place]) ;
174  else
175  *p_met_con[dd] = Term_eq(*syst->cst[place]) ;
176  }
177  else {
178 
179  Term_eq** res = new Term_eq* [p_met->get_n_comp()] ;
180 
181 
182  Scalar val (espace) ;
183  Val_domain cmpval(espace.get_domain(dd)) ;
184  Val_domain detval (espace.get_domain(dd)) ;
185  detval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
186  + (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)
187  + (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
188  - (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
189  - (*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,1)(dd)
190  - (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
191 
192  // Compo 1 1
193  cmpval = (*syst->cst[place]->val_t)(2,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
194  -(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
195  val.set_domain(dd) = cmpval /detval ;
196  res[0] = new Term_eq (dd, val) ;
197 
198  // Compo 1 2
199  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
200  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
201  val.set_domain(dd) = cmpval /detval;
202  res[1] = new Term_eq (dd, val) ;
203 
204  // Compo 1 3
205  cmpval = (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
206  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd) ;
207  val.set_domain(dd) = cmpval /detval;
208  res[2] = new Term_eq (dd, val) ;
209 
210  // Compo 2 2
211  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
212  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd) ;
213  val.set_domain(dd) = cmpval/detval ;
214  res[3] = new Term_eq (dd, val) ;
215 
216  // Compo 2 3
217  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)
218  -(*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
219  val.set_domain(dd) = cmpval /detval;
220  res[4] = new Term_eq (dd, val) ;
221 
222  // Compo 3 3
223  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
224  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd) ;
225  val.set_domain(dd) = cmpval /detval;
226  res[5] = new Term_eq (dd, val) ;
227 
228  // Value field :
229  Metric_tensor resval (espace, CON, basis) ;
230  resval.set(1,1) = res[0]->get_val_t() ;
231  resval.set(1,2) = res[1]->get_val_t() ;
232  resval.set(1,3) = res[2]->get_val_t() ;
233  resval.set(2,2) = res[3]->get_val_t() ;
234  resval.set(2,3) = res[4]->get_val_t() ;
235  resval.set(3,3) = res[5]->get_val_t() ;
236 
237  Metric_tensor zero (espace, CON, basis) ;
238  for (int i=1 ; i<=3 ; i++)
239  for (int j=i ; j<=3 ; j++)
240  zero.set(i,j) = 0 ;
241 
242  if (p_met_con[dd]==0x0)
243  p_met_con[dd] = new Term_eq(dd, resval, zero) ;
244  else
245  *p_met_con[dd] = Term_eq(dd, resval, zero) ;
246  for (int i=0 ; i<p_met->get_n_comp() ; i++)
247  delete res [i] ;
248  delete [] res ;
249  }
250 }}
Class to deal with arbitrary type of metric but that is constant.
Definition: metric.hpp:416
virtual void compute_cov(int) const
Computes the covariant representation, in a given Domain.
virtual void set_system(System_of_eqs &syst, const char *name)
Associate the metric to a given system of equations.
virtual void compute_con(int) const
Computes the contravariant representation, in a given Domain.
Metric_const(Metric_tensor &)
Constructor from a Metric_tensor.
Class to deal with arbitrary type of metric.
Definition: metric.hpp:379
Metric_tensor * p_met
Pointer on the Metric_tensor describing the metric.
Definition: metric.hpp:382
int place_syst
Gives the location of the metric amongst the various unknowns of the associated System_of_eqs.
Definition: metric.hpp:385
const Base_tensor & basis
The tensorial basis used.
Definition: metric.hpp:383
Particular type of Tensor, dedicated to the desription of metrics.
int type_tensor
States if one works in the CON or COV representation.
Definition: metric.hpp:86
const Space & espace
The associated Space.
Definition: metric.hpp:42
MMPtr_array< Term_eq > p_met_cov
Array of pointers on various Term_eq.
Definition: metric.hpp:50
MMPtr_array< Term_eq > p_met_con
Array of pointers on various Term_eq.
Definition: metric.hpp:55
const System_of_eqs * syst
Pointer of the system of equations where the metric is used (only one for now).
Definition: metric.hpp:44
The class Scalar does not really implements scalars in the mathematical sense but rather tensorial co...
Definition: scalar.hpp:67
Val_domain & set_domain(int)
Read/write of a particular Val_domain.
Definition: scalar.hpp:555
const Domain * get_domain(int i) const
returns a pointer on the domain.
Definition: space.hpp:1385
int get_ndim() const
Returns the number of dimensions.
Definition: space.hpp:1373
Class used to describe and solve a system of equations.
virtual void add_cst(const char *name, double cst)
Addition of a constant (number case)
int ndom
Number of domains used.
MMPtr_array< Term_eq > cst
Pointers on the Term_eq coming from the constants passed by the user.
char * name_met
Name by which the metric is recognized.
int ncst
Number of constants passed by the user.
int dom_min
Smallest domain number.
Metric * met
Pointer on the associated Metric, if defined.
Scalar & set(const Array< int > &ind)
Returns the value of a component (read/write version).
Definition: tensor_impl.hpp:91
int get_n_comp() const
Returns the number of stored components.
Definition: tensor.hpp:514
This class is intended to describe the manage objects appearing in the equations.
Definition: term_eq.hpp:62
Tensor const & get_val_t() const
Definition: term_eq.hpp:355
Class for storing the basis of decompositions of a field and its values on both the configuration and...
Definition: val_domain.hpp:69