118 #include "metrique.h" 124 assert ((t1.
etat != ETATNONDEF) && (t2.
etat != ETATNONDEF)) ;
125 assert (t1.
mp == t2.
mp) ;
129 poids_res = (fabs(poids_res) < 1.e-10 ? 0. : poids_res) ;
130 const Metrique* met_res = 0x0 ;
131 if (poids_res != 0.) {
134 else met_res = t2.
metric ;
139 Tenseur scal(*t1.
mp, met_res, poids_res) ;
141 if ((t1.
etat == ETATZERO) || (t2.
etat == ETATZERO))
145 scal.
set() = t1() * t2() ;
152 Itbl tipe (val_res) ;
154 for (
int i=0 ; i<t1.
valence ; i++)
156 for (
int i=0 ; i<t2.
valence ; i++)
172 Tenseur res(*t1.
mp, val_res, tipe, triad_res, met_res, poids_res) ;
174 if ((t1.
etat == ETATZERO) || (t2.
etat == ETATZERO))
183 for (
int i=0 ; i<res.
n_comp ; i++) {
185 for (
int j=0 ; j<t1.
valence ; j++)
186 jeux_indice_t1.
set(j) = jeux_indice_res(j) ;
187 for (
int j=0 ; j<t2.
valence ; j++)
188 jeux_indice_t2.
set(j) = jeux_indice_res(j+t1.
valence) ;
190 res.
set(jeux_indice_res) = t1(jeux_indice_t1)*t2(jeux_indice_t2) ;
204 assert ((t1.
etat != ETATNONDEF) && (t2.
etat != ETATNONDEF)) ;
205 assert (t1.
mp == t2.
mp) ;
209 poids_res = (fabs(poids_res) < 1.e-10 ? 0. : poids_res) ;
210 const Metrique* met_res = 0x0 ;
211 if (poids_res != 0.) {
214 else met_res = t2.
metric ;
219 Tenseur scal(*t1.
mp, met_res, poids_res) ;
221 if ((t1.
etat == ETATZERO) || (t2.
etat == ETATZERO))
225 scal.
set() = t1() % t2() ;
232 Itbl tipe (val_res) ;
234 for (
int i=0 ; i<t1.
valence ; i++)
236 for (
int i=0 ; i<t2.
valence ; i++)
252 Tenseur res(*t1.
mp, val_res, tipe, triad_res, met_res, poids_res) ;
256 if ((t1.
etat == ETATZERO) || (t2.
etat == ETATZERO))
265 for (
int i=0 ; i<res.
n_comp ; i++) {
267 for (
int j=0 ; j<t1.
valence ; j++)
268 jeux_indice_t1.
set(j) = jeux_indice_res(j) ;
269 for (
int j=0 ; j<t2.
valence ; j++)
270 jeux_indice_t2.
set(j) = jeux_indice_res(j+t1.
valence) ;
272 res.
set(jeux_indice_res) = t1(jeux_indice_t1) %
286 assert (source.
etat != ETATNONDEF) ;
287 assert ((ind_1 >= 0) && (ind_1 < source.
valence)) ;
288 assert ((ind_2 >= 0) && (ind_2 < source.
valence)) ;
299 int val_res = source.
valence - 2 ;
301 Itbl tipe (val_res) ;
303 for (
int i=0 ; i<ind_1 ; i++)
305 for (
int i=ind_1 ; i<ind_2-1 ; i++)
307 for (
int i = ind_2-1 ; i<val_res ; i++)
314 if (source.
etat == ETATZERO) {
321 Cmp work(source.
mp) ;
328 for (
int i=0 ; i<res.
n_comp ; i++) {
330 for (
int j=0 ; j<ind_1 ; j++)
331 jeux_indice_source.
set(j) = jeux_indice_res(j) ;
332 for (
int j=ind_1+1 ; j<ind_2 ; j++)
333 jeux_indice_source.
set(j) = jeux_indice_res(j-1) ;
334 for (
int j=ind_2+1 ; j<source.
valence ; j++)
335 jeux_indice_source.
set(j) = jeux_indice_res(j-2) ;
339 for (
int j=0 ; j<3 ; j++) {
340 jeux_indice_source.
set(ind_1) = j ;
341 jeux_indice_source.
set(ind_2) = j ;
342 work = work + source(jeux_indice_source) ;
345 res.
set(jeux_indice_res) = work ;
353 assert ((t1.
etat != ETATNONDEF) && (t2.
etat != ETATNONDEF)) ;
355 assert ((ind1>=0) && (ind1<t1.
valence)) ;
356 assert ((ind2>=0) && (ind2<t2.
valence)) ;
357 assert (*(t1.
mp) == *(t2.
mp)) ;
367 poids_res = (fabs(poids_res) < 1.e-10 ? 0. : poids_res) ;
368 const Metrique* met_res = 0x0 ;
369 if (poids_res != 0.) {
372 else met_res = t2.
metric ;
376 for (
int i=0 ; i<ind1 ; i++)
378 for (
int i=ind1 ; i<t1.
valence-1 ; i++)
382 for (
int i = t1.
valence+ind2-1 ; i<val_res ; i++)
387 Tenseur res(*t1.
mp, val_res, tipe, triad_res, met_res, poids_res) ;
390 if ( (t1.
etat == ETATZERO) || (t2.
etat == ETATZERO) ) {
406 for (
int comp=0 ; comp<res.
n_comp ; comp++) {
408 for (
int i=0 ; i<ind1 ; i++)
409 jeux_indice_t1.
set(i) = jeux_indice_res(i) ;
410 for (
int i=ind1+1 ; i<t1.
valence ; i++)
411 jeux_indice_t1.
set(i) = jeux_indice_res(i-1) ;
412 for (
int i=0 ; i<ind2 ; i++)
413 jeux_indice_t2.
set(i) = jeux_indice_res(t1.
valence+i-1) ;
414 for (
int i=ind2+1 ; i<t2.
valence ; i++)
415 jeux_indice_t2.
set(i) = jeux_indice_res(t1.
valence+i-2) ;
420 for (
int j=0 ; j<3 ; j++) {
421 jeux_indice_t1.
set(ind1) = j ;
422 jeux_indice_t2.
set(ind2) = j ;
423 work = work + t1(jeux_indice_t1)*t2(jeux_indice_t2) ;
426 res.
set(jeux_indice_res) = work ;
431 Tenseur contract_desal (
const Tenseur& t1,
int ind1,
const Tenseur& t2,
int ind2) {
433 assert ((t1.etat != ETATNONDEF) && (t2.etat != ETATNONDEF)) ;
435 assert ((ind1>=0) && (ind1<t1.valence)) ;
436 assert ((ind2>=0) && (ind2<t2.valence)) ;
437 assert (t1.mp == t2.mp) ;
440 if ( (t1.valence != 0) && (t2.valence != 0) ) {
441 assert ( *(t1.get_triad()) == *(t2.get_triad()) ) ;
443 assert (t1.type_indice(ind1) != t2.type_indice(ind2)) ;
445 int val_res = t1.valence + t2.valence - 2;
446 double poids_res = t1.poids + t2.poids ;
447 poids_res = (fabs(poids_res) < 1.e-10 ? 0. : poids_res) ;
448 const Metrique* met_res = 0x0 ;
449 if (poids_res != 0.) {
451 if (t1.metric != 0x0) met_res = t1.metric ;
452 else met_res = t2.metric ;
455 tipe.set_etat_qcq() ;
456 for (
int i=0 ; i<ind1 ; i++)
457 tipe.set(i) = t1.type_indice(i) ;
458 for (
int i=ind1 ; i<t1.valence-1 ; i++)
459 tipe.set(i) = t1.type_indice(i+1) ;
460 for (
int i=t1.valence-1 ; i<t1.valence+ind2-1 ; i++)
461 tipe.set(i) = t2.type_indice(i-t1.valence+1) ;
462 for (
int i = t1.valence+ind2-1 ; i<val_res ; i++)
463 tipe.set(i) = t2.type_indice(i-t1.valence+2) ;
465 const Base_vect* triad_res = (val_res == 0) ? 0x0 : t1.get_triad() ;
467 Tenseur res(*t1.mp, val_res, tipe, triad_res, met_res, poids_res) ;
470 if ( (t1.etat == ETATZERO) || (t2.etat == ETATZERO) ) {
471 res.set_etat_zero() ;
481 Itbl jeux_indice_t1(t1.valence) ;
482 Itbl jeux_indice_t2(t2.valence) ;
483 jeux_indice_t1.set_etat_qcq() ;
484 jeux_indice_t2.set_etat_qcq() ;
486 for (
int comp=0 ; comp<res.n_comp ; comp++) {
487 Itbl jeux_indice_res (res.donne_indices(comp)) ;
488 for (
int i=0 ; i<ind1 ; i++)
489 jeux_indice_t1.set(i) = jeux_indice_res(i) ;
490 for (
int i=ind1+1 ; i<t1.valence ; i++)
491 jeux_indice_t1.set(i) = jeux_indice_res(i-1) ;
492 for (
int i=0 ; i<ind2 ; i++)
493 jeux_indice_t2.set(i) = jeux_indice_res(t1.valence+i-1) ;
494 for (
int i=ind2+1 ; i<t2.valence ; i++)
495 jeux_indice_t2.set(i) = jeux_indice_res(t1.valence+i-2) ;
499 work.set_etat_zero() ;
500 for (
int j=0 ; j<3 ; j++) {
501 jeux_indice_t1.set(ind1) = j ;
502 jeux_indice_t2.set(ind2) = j ;
503 work = work + t1(jeux_indice_t1)%t2(jeux_indice_t2) ;
506 res.set(jeux_indice_res) = work ;
514 assert (t1.
etat != ETATNONDEF) ;
515 assert (met.get_etat() != ETATNONDEF) ;
518 assert (valen != 0) ;
519 assert ((place >=0) && (place < valen)) ;
524 for (
int i=1 ; i<place+1 ; i++)
526 for (
int i=place+1 ; i<valen ; i++)
532 auxi =
contract (met.con(), 1, t1, place) ;
534 auxi =
contract (met.cov(), 1, t1, place) ;
538 for (
int i=0 ; i<valen ; i++)
540 tipe.
set(place) *= -1 ;
545 Itbl place_auxi(valen) ;
548 for (
int i=0 ; i<res.
n_comp ; i++) {
552 place_auxi.
set(0) = place_res(place) ;
553 for (
int j=1 ; j<place+1 ; j++)
554 place_auxi.
set(j) = place_res(j-1) ;
555 place_res.set(place) = place_auxi(0) ;
556 for (
int j=place+1 ; j<valen ; j++)
557 place_auxi.
set(j) = place_res(j);
560 res.
set(place_res) = auxi(place_auxi) ;
570 for (
int i=0 ; i<t1.
valence ; i++) {
573 auxi_old =
new Tenseur(*auxi) ;
587 assert (source.
etat != ETATNONDEF) ;
591 int val_res = source.
valence-1 ;
592 Itbl tipe (val_res) ;
594 for (
int i=0 ; i<val_res ; i++)
601 if (source.
etat == ETATZERO)
606 for (
int i=0 ; i<res.
n_comp ; i++) {
608 Itbl indices_so (val_res+1) ;
609 indices_so.set_etat_qcq() ;
610 for (
int j=0 ; j<val_res ; j++)
611 indices_so.set(j) = indices_res(j) ;
614 indices_so.set(val_res) = 0 ;
615 Cmp resu(source(indices_so)) ;
620 assert( dynamic_cast<const Map_radial*>(source.
get_mp()) != 0x0) ;
622 resu.
va = (resu.
va).mult_st() ;
623 resu.
va = (resu.
va).mult_cp() ;
627 indices_so.
set(val_res) = 1 ;
628 Cmp auxiliaire (source(indices_so)) ;
632 auxiliaire.
va = (auxiliaire.
va).mult_st() ;
633 auxiliaire.
va = (auxiliaire.
va).mult_sp() ;
635 resu = resu + auxiliaire ;
639 indices_so.
set(val_res) = 2 ;
640 auxiliaire = source(indices_so) ;
642 auxiliaire.mult_r() ;
644 auxiliaire.va = (auxiliaire.va).mult_ct() ;
646 resu = resu + auxiliaire ;
648 res.
set(indices_res) = resu ;
658 assert ((t1.
etat != ETATNONDEF) && (t2.
etat != ETATNONDEF)) ;
660 assert (t1.
mp == t2.
mp) ;
669 poids_res = (fabs(poids_res) < 1.e-10 ? 0. : poids_res) ;
670 const Metrique* met_res = 0x0 ;
671 if (poids_res != 0.) {
674 else met_res = t2.
metric ;
679 for (
int i=0 ; i<t1.
valence - 1 ; i++)
681 for (
int i = t1.
valence-1 ; i<val_res ; i++)
684 Tenseur res(*t1.
mp, val_res, tipe, t1.
triad, met_res, poids_res) ;
687 if ( (t1.
etat == ETATZERO) || (t2.
etat == ETATZERO) ) {
703 for (
int ir=0 ; ir<res.
n_comp ; ir++) {
710 for (
int i=0 ; i<t1.
valence - 1 ; i++) {
711 jeux_indice_t1.
set(i) = jeux_indice_res(i) ;
715 for (
int i=1 ; i<t2.
valence ; i++) {
716 jeux_indice_t2.
set(i) = jeux_indice_res(t1.
valence+i-2) ;
723 for (
int j=0 ; j<3 ; j++) {
725 jeux_indice_t2.
set(0) = j ;
726 work = work + t1(jeux_indice_t1)*t2(jeux_indice_t2) ;
729 res.
set(jeux_indice_res) = work ;
740 assert ((t1.
etat != ETATNONDEF) && (t2.
etat != ETATNONDEF)) ;
742 assert (t1.
mp == t2.
mp) ;
751 poids_res = (fabs(poids_res) < 1.e-10 ? 0. : poids_res) ;
752 const Metrique* met_res = 0x0 ;
753 if (poids_res != 0.) {
756 else met_res = t2.
metric ;
761 for (
int i=0 ; i<t1.
valence - 1 ; i++)
763 for (
int i = t1.
valence-1 ; i<val_res ; i++)
766 Tenseur res(*t1.
mp, val_res, tipe, t1.
triad, met_res, poids_res) ;
769 if ( (t1.
etat == ETATZERO) || (t2.
etat == ETATZERO) ) {
785 for (
int ir=0 ; ir<res.
n_comp ; ir++) {
792 for (
int i=0 ; i<t1.
valence - 1 ; i++) {
793 jeux_indice_t1.
set(i) = jeux_indice_res(i) ;
797 for (
int i=1 ; i<t2.
valence ; i++) {
798 jeux_indice_t2.
set(i) = jeux_indice_res(t1.
valence+i-2) ;
805 for (
int j=0 ; j<3 ; j++) {
807 jeux_indice_t2.
set(0) = j ;
808 work = work + t1(jeux_indice_t1) % t2(jeux_indice_t2) ;
811 res.
set(jeux_indice_res) = work ;
836 for (
int i=0 ; i<val ; i++)
853 for (
int i=0 ; i<val ; i++) {
857 Itbl indices_aux(val) ;
862 indices_aux.
set(val-1) = indices(i) ;
863 for (
int idx=0 ; idx<val-1 ; idx++)
865 indices_aux.
set(idx) = indices(idx) ;
867 indices_aux.
set(idx) = indices(idx+1) ;
869 resu.
set(indices) += (*auxi)(indices_aux) ;
875 Itbl indices_aux(val) ;
882 indices_aux.
set(val-1) = indices(i) ;
883 for (
int idx=0 ; idx<val-1 ; idx++)
885 indices_aux.
set(idx) = indices(idx) ;
887 indices_aux.
set(idx) = indices(idx+1) ;
888 resu.
set(indices) -= (*auxi)(indices_aux) ;
895 resu = resu + poids*
contract(dx,0,1)*t ;
902 assert(t.
get_etat() != ETATNONDEF) ;
903 assert(metre.get_etat() != ETATNONDEF) ;
907 if (resu.get_etat() == ETATZERO)
return resu ;
908 assert(resu.get_etat() == ETATQCQ) ;
914 mix.
set(0) = (t0 == t1 ? -t0 : t0) ;
929 resu = resu - 1./3.*trace * metre.cov() ;
933 resu = resu - 1./3.*trace * metre.con() ;
937 cout <<
"Erreur bizarre dans sans_trace!" << endl ;
946 for (
int i=0; i<3; i++)
947 for (
int j=i; j<3; j++)
948 delta.set(i,j) = (i==j ? 1 : 0) ;
949 resu = resu - trace/3. * delta ;
Itbl type_indice
Array of size valence contening the type of each index, COV for a covariant one and CON for a contrav...
const Map *const mp
Reference mapping.
double get_poids() const
Returns the weight.
const Base_vect * triad
Vectorial basis (triad) with respect to which the tensor components are defined.
int get_type_indice(int i) const
Returns the type of the index number i .
Component of a tensorial field *** DEPRECATED : use class Scalar instead ***.
int & set(int i)
Read/write of a particular element (index i ) (1D case)
int n_comp
Number of components, depending on the symmetry.
void set_std_base()
Set the standard spectal basis of decomposition for each component.
Class intended to describe tensors with a symmetry on the two last indices *** DEPRECATED : use class...
Base_val operator*(const Base_val &, const Base_val &)
This operator is used when calling multiplication or division of Valeur .
int etat
Logical state ETATZERO , ETATQCQ or ETATNONDEF.
Tenseur flat_scalar_prod(const Tenseur &t1, const Tenseur &t2)
Scalar product of two Tenseur when the metric is : performs the contraction of the last index of t1 w...
virtual Itbl donne_indices(int place) const
Returns the indices of a component given by its position in the Cmp 1-D array c . ...
Basic integer array class.
Cmp operator%(const Cmp &, const Cmp &)
Cmp * Cmp with desaliasing.
Vectorial bases (triads) with respect to which the tensorial components are defined.
int get_valence() const
Returns the valence.
void mult_r()
Multiplication by r everywhere.
void set_etat_zero()
Sets the logical state to ETATZERO (zero).
Cmp & set()
Read/write for a scalar (see also operator=(const Cmp&) ).
const Map * get_mp() const
Returns pointer on the mapping.
Tenseur flat_scalar_prod_desal(const Tenseur &t1, const Tenseur &t2)
Same as flat_scalar_prod but with desaliasing.
Tenseur skxk(const Tenseur &)
Contraction of the last index of (*this) with or , depending on the type of S .
const Metrique * get_metric() const
Returns a pointer on the metric defining the conformal factor for tensor densities.
const Base_vect * get_triad() const
Returns the vectorial basis (triad) on which the components are defined.
Tenseur lie_derive(const Tenseur &t, const Tenseur &x, const Metrique *=0x0)
Lie Derivative of t with respect to x .
double poids
For tensor densities: the weight.
virtual int identify() const =0
Returns a number to identify the sub-classe of Base_vect the object belongs to.
int get_etat() const
Returns the logical state.
void set_etat_qcq()
Sets the logical state to ETATQCQ (ordinary state).
Tenseur contract(const Tenseur &, int id1, int id2)
Self contraction of two indices of a Tenseur .
int get_n_comp() const
Returns the number of components.
Tenseur sans_trace(const Tenseur &tens, const Metrique &metre)
Computes the traceless part of a Tenseur of valence 2.
Tbl & set(int l)
Read/write of the value in a given domain.
const Base_vect_cart & get_bvect_cart() const
Returns the Cartesian basis associated with the coordinates (x,y,z) of the mapping, i.e.
const Metrique * metric
For tensor densities: the metric defining the conformal factor.
void set_etat_qcq()
Sets the logical state to ETATQCQ (ordinary state).
const Tenseur & derive_cov(const Metrique &met) const
Returns the covariant derivative of *this , with respect to met .
void set_etat_zero()
Sets the logical state to ETATZERO (zero state).
Valeur va
The numerical value of the Cmp.
Tensor handling *** DEPRECATED : use class Tensor instead ***.
const Tenseur & gradient() const
Returns the gradient of *this (Cartesian coordinates)
Tbl & set(int l)
Read/write of the value in a given domain (configuration space).
Tenseur manipule(const Tenseur &, const Metrique &, int idx)
Raise or lower the index idx depending on its type, using the given Metrique .