KADATH
metric_nophi_AADS_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_nophi.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 {
30 
32  Metric_nophi_AADS(met, conf) {
33 }
34 
36  Metric_nophi_AADS (*so.p_met, so.conformal) {
37 }
38 
39 Metric_nophi_AADS_const::~Metric_nophi_AADS_const() {
40 }
41 
42 void Metric_nophi_AADS_const::set_system (System_of_eqs& ss, const char* name_met) {
43 
44  syst = &ss ;
45 
46  if (ss.met!=0x0) {
47  cerr << "Metric already set for the system" << endl ;
48  abort() ;
49  }
50 
51  // Position in the system :
52  place_syst = ss.ndom*ss.ncst ;
53 
54  ss.add_cst (0x0, *p_met) ;
55 
56  ss.met = this ;
57  ss.name_met = new char[LMAX] ;
58  trim_spaces (ss.name_met, name_met) ;
59 }
60 
61 
62 
64 
65  int dim = espace.get_ndim() ;
66  if (dim!=3) {
67  cerr << "Function only implemented for dimension 3" << endl ;
68  abort() ;
69  }
70 
71  int place = place_syst + (dd-syst->dom_min) ;
72 
73  // Right storage : simple copy.
74  if (type_tensor==COV) {
75 
76  if (p_met_cov[dd]==0x0)
77  p_met_cov[dd] = new Term_eq(*syst->cst[place]) ;
78  else
79  *p_met_cov[dd] = Term_eq(*syst->cst[place]) ;
80  }
81  else {
82  Term_eq** res = new Term_eq* [p_met->get_n_comp()] ;
83 
84 
85  Scalar val (espace) ;
86  Val_domain cmpval(espace.get_domain(dd)) ;
87 
88  Val_domain detval (espace.get_domain(dd)) ;
89  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)
90  + (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)
91  + (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
92  - (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
93  - (*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,1)(dd)
94  - (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
95 
96  // Compo 1 1
97  cmpval = (*syst->cst[place]->val_t)(2,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
98  -(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
99  val.set_domain(dd) = cmpval / detval ;
100  res[0] = new Term_eq (dd, val) ;
101 
102 
103  // Compo 1 2
104  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
105  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
106  val.set_domain(dd) = cmpval / detval ;
107  res[1] = new Term_eq (dd, val) ;
108 
109  // Compo 1 3
110  cmpval = (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
111  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd) ;
112  val.set_domain(dd) = cmpval / detval ;
113  res[2] = new Term_eq (dd, val) ;
114 
115 
116  // Compo 2 2
117  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
118  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd) ;
119  val.set_domain(dd) = cmpval /detval ;
120  res[3] = new Term_eq (dd, val) ;
121 
122  // Compo 2 3
123  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)
124  -(*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
125  val.set_domain(dd) = cmpval / detval ;
126  res[4] = new Term_eq (dd, val) ;
127 
128 
129  // Compo 3 3
130  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
131  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd) ;
132  val.set_domain(dd) = cmpval /detval ;
133  res[5] = new Term_eq (dd, val) ;
134 
135 
136  // Value field :
137  Metric_tensor resval (espace, COV, basis) ;
138  resval.set(1,1) = res[0]->get_val_t() ;
139  resval.set(1,2) = res[1]->get_val_t() ;
140  resval.set(1,3) = res[2]->get_val_t() ;
141  resval.set(2,2) = res[3]->get_val_t() ;
142  resval.set(2,3) = res[4]->get_val_t() ;
143  resval.set(3,3) = res[5]->get_val_t() ;
144 
145  Metric_tensor zero (espace, COV, basis) ;
146  for (int i=1 ; i<=3 ; i++)
147  for (int j=i ; j<=3 ; j++)
148  zero.set(i,j) = 0 ;
149 
150  if (p_met_cov[dd]==0x0)
151  p_met_cov[dd] = new Term_eq(dd, resval, zero) ;
152  else
153  *p_met_cov[dd] = Term_eq(dd, resval, zero) ;
154  for (int i=0 ; i<p_met->get_n_comp() ; i++)
155  delete res [i] ;
156  delete [] res ;
157  }
158 }
159 
160 
162  int dim = espace.get_ndim() ;
163  if (dim!=3) {
164  cerr << "Function only implemented for dimension 3" << endl ;
165  abort() ;
166  }
167 
168  int place = place_syst + (dd-syst->dom_min) ;
169 
170  // Right storage : simple copy.
171  if (type_tensor==CON) {
172 
173  if (p_met_con[dd]==0x0)
174  p_met_con[dd] = new Term_eq(*syst->cst[place]) ;
175  else
176  *p_met_con[dd] = Term_eq(*syst->cst[place]) ;
177  }
178  else {
179 
180  Term_eq** res = new Term_eq* [p_met->get_n_comp()] ;
181 
182 
183  Scalar val (espace) ;
184  Val_domain cmpval(espace.get_domain(dd)) ;
185  Val_domain detval (espace.get_domain(dd)) ;
186  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)
187  + (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)
188  + (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
189  - (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
190  - (*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(1,1)(dd)
191  - (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
192 
193  // Compo 1 1
194  cmpval = (*syst->cst[place]->val_t)(2,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
195  -(*syst->cst[place]->val_t)(2,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
196  val.set_domain(dd) = cmpval /detval ;
197  res[0] = new Term_eq (dd, val) ;
198 
199  // Compo 1 2
200  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
201  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(3,3)(dd) ;
202  val.set_domain(dd) = cmpval /detval;
203  res[1] = new Term_eq (dd, val) ;
204 
205  // Compo 1 3
206  cmpval = (*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(2,3)(dd)
207  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(2,2)(dd) ;
208  val.set_domain(dd) = cmpval /detval;
209  res[2] = new Term_eq (dd, val) ;
210 
211  // Compo 2 2
212  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(3,3)(dd)
213  -(*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,3)(dd) ;
214  val.set_domain(dd) = cmpval/detval ;
215  res[3] = new Term_eq (dd, val) ;
216 
217  // Compo 2 3
218  cmpval = (*syst->cst[place]->val_t)(1,3)(dd)*(*syst->cst[place]->val_t)(1,2)(dd)
219  -(*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,3)(dd) ;
220  val.set_domain(dd) = cmpval /detval;
221  res[4] = new Term_eq (dd, val) ;
222 
223  // Compo 3 3
224  cmpval = (*syst->cst[place]->val_t)(1,1)(dd)*(*syst->cst[place]->val_t)(2,2)(dd)
225  -(*syst->cst[place]->val_t)(1,2)(dd)*(*syst->cst[place]->val_t)(1,2)(dd) ;
226  val.set_domain(dd) = cmpval /detval;
227  res[5] = new Term_eq (dd, val) ;
228 
229  // Value field :
230  Metric_tensor resval (espace, CON, basis) ;
231  resval.set(1,1) = res[0]->get_val_t() ;
232  resval.set(1,2) = res[1]->get_val_t() ;
233  resval.set(1,3) = res[2]->get_val_t() ;
234  resval.set(2,2) = res[3]->get_val_t() ;
235  resval.set(2,3) = res[4]->get_val_t() ;
236  resval.set(3,3) = res[5]->get_val_t() ;
237 
238  Metric_tensor zero (espace, CON, basis) ;
239  for (int i=1 ; i<=3 ; i++)
240  for (int j=i ; j<=3 ; j++)
241  zero.set(i,j) = 0 ;
242 
243  if (p_met_con[dd]==0x0)
244  p_met_con[dd] = new Term_eq(dd, resval, zero) ;
245  else
246  *p_met_con[dd] = Term_eq(dd, resval, zero) ;
247  for (int i=0 ; i<p_met->get_n_comp() ; i++)
248  delete res [i] ;
249  delete [] res ;
250  }
251 }}
Class to deal with a metric independant of with a conformal decomposition and constant.
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_nophi_AADS_const(Metric_tensor &, const Scalar &)
Constructor from a Metric_tensor.
virtual void compute_cov(int) const
Computes the covariant representation, in a given Domain.
Class to deal with a metric independant of with a conformal decomposition (mainly used for AADS spac...
Metric_tensor * p_met
Pointer on the Metric_tensor describing the coformal metric.
const Base_tensor & basis
The tensorial basis used.
int place_syst
Gives the location of the metric amongst the various unknowns of the associated System_of_eqs.
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