00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef __TENSOR_H_
00033 #define __TENSOR_H_
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 #define COV -1
00245 #define CON +1
00246
00247 #define N_MET_MAX 5
00248
00249
00250 #include "itbl.h"
00251 #include "base_vect.h"
00252 #include "map.h"
00253
00254 class Scalar ;
00255 class Vector ;
00256 class Tensor_sym ;
00257 class Sym_tensor ;
00258 class Metric ;
00259
00260
00261
00262
00263
00264
00278 class Tensor {
00279
00280
00281
00282 protected:
00283
00285 const Map* const mp ;
00286
00288 int valence ;
00289
00293 const Base_vect* triad ;
00294
00300 Itbl type_indice ;
00301
00302 int n_comp ;
00303
00305 Scalar** cmp ;
00306
00307
00308
00309
00310 protected:
00317 mutable const Metric* met_depend[N_MET_MAX] ;
00318
00325 mutable Tensor* p_derive_cov[N_MET_MAX];
00326
00333 mutable Tensor* p_derive_con[N_MET_MAX];
00334
00341 mutable Tensor* p_divergence[N_MET_MAX];
00342
00343
00344
00345
00346
00347 public:
00348
00364 Tensor(const Map& map, int val, const Itbl& tipe,
00365 const Base_vect& triad_i) ;
00366
00383 Tensor(const Map& map, int val, const Itbl& tipe,
00384 const Base_vect* triad_i) ;
00385
00395 Tensor(const Map& map, int val, int tipe,
00396 const Base_vect& triad_i) ;
00397
00398 Tensor(const Tensor&) ;
00399
00410 Tensor(const Map& map, const Base_vect& triad_i, FILE* fich) ;
00411
00412 protected:
00418 explicit Tensor(const Map& map) ;
00419
00441 Tensor(const Map& map, int val, const Itbl& tipe, int n_comp_i,
00442 const Base_vect& triad_i) ;
00443
00458 Tensor(const Map& map, int val, int tipe, int n_comp_i,
00459 const Base_vect& triad_i) ;
00460
00461
00462 public:
00463
00464 virtual ~Tensor() ;
00465
00466
00467
00468 protected:
00469 virtual void del_deriv() const ;
00470
00472 void set_der_0x0() const ;
00473
00478 virtual void del_derive_met(int) const ;
00479
00484 void set_der_met_0x0(int) const ;
00485
00495 void set_dependance (const Metric&) const ;
00496
00502 int get_place_met(const Metric&) const ;
00503
00504
00505
00506 public:
00511 virtual void set_etat_nondef() ;
00512
00517 virtual void set_etat_zero() ;
00518
00523 virtual void set_etat_qcq() ;
00524
00533 virtual void allocate_all() ;
00534
00538 virtual void change_triad(const Base_vect& new_triad) ;
00539
00546 void set_triad(const Base_vect& new_triad) ;
00547
00548
00549 virtual void operator=(const Tensor&) ;
00550
00562 Scalar& set(const Itbl& ind) ;
00563
00573 Scalar& set(int i1, int i2) ;
00574
00575
00586 Scalar& set(int i1, int i2, int i3) ;
00587
00600 Scalar& set(int i1, int i2, int i3, int i4) ;
00601
00607 void annule_domain(int l) ;
00608
00620 virtual void annule(int l_min, int l_max) ;
00621
00633 void annule_extern_cn(int l_0, int deg) ;
00634
00639 virtual void std_spectral_base() ;
00640
00645 virtual void std_spectral_base_odd() ;
00646
00651 virtual void dec_dzpuis(int dec = 1) ;
00652
00657 virtual void inc_dzpuis(int inc = 1) ;
00658
00663 virtual void exponential_filter_r(int lzmin, int lzmax, int p,
00664 double alpha= -16.) ;
00665
00670 virtual void exponential_filter_ylm(int lzmin, int lzmax, int p,
00671 double alpha= -16.) ;
00672
00673
00674
00675
00676 protected:
00681 void compute_derive_lie(const Vector& v, Tensor& resu) const ;
00682
00683
00684 public:
00707 const Tensor& derive_cov(const Metric& gam) const ;
00708
00714 const Tensor& derive_con(const Metric& gam) const ;
00715
00733 const Tensor& divergence(const Metric& gam) const ;
00734
00735
00739 Tensor derive_lie(const Vector& v) const ;
00740
00753 Tensor up(int ind, const Metric& gam) const ;
00754
00767 Tensor down(int ind, const Metric& gam) const ;
00768
00776 Tensor up_down(const Metric& gam) const ;
00777
00786 Tensor trace(int ind1, int ind2) const ;
00787
00798 Tensor trace(int ind1, int ind2, const Metric& gam) const ;
00799
00802 Scalar trace() const ;
00803
00808 Scalar trace(const Metric& gam) const ;
00809
00810
00811
00812
00813 public:
00829 virtual int position(const Itbl& ind) const ;
00830
00847 virtual Itbl indices(int pos) const ;
00848
00849 public:
00851 const Map& get_mp() const {return *mp ;} ;
00852
00856 const Base_vect* get_triad() const {return triad;} ;
00857
00859 int get_valence() const {return valence ; } ;
00860
00862 int get_n_comp() const {return n_comp ;} ;
00863
00876 int get_index_type(int i) const {return type_indice(i) ;};
00877
00886 Itbl get_index_type() const {return type_indice ; } ;
00887
00899 int& set_index_type(int i) {return type_indice.set(i) ;};
00900
00908 Itbl& set_index_type() {return type_indice ; } ;
00909
00910
00922 const Scalar& operator()(const Itbl& ind) const ;
00923
00933 const Scalar& operator()(int i1, int i2) const ;
00934
00945 const Scalar& operator()(int i1, int i2, int i3) const ;
00946
00958 const Scalar& operator()(int i1, int i2, int i3, int i4) const ;
00959
00960
00961
00962 public:
00963 void operator+=(const Tensor &) ;
00964 void operator-=(const Tensor &) ;
00965
00966
00967
00968 public:
00969 virtual void sauve(FILE *) const ;
00970
00981 virtual void spectral_display(const char* comment = 0x0,
00982 double threshold = 1.e-7, int precision = 4,
00983 ostream& ostr = cout) const ;
00984
00985 friend ostream& operator<<(ostream& , const Tensor & ) ;
00986
00987
00988
00989
00990 friend class Scalar ;
00991 friend class Vector ;
00992 friend class Sym_tensor ;
00993 friend class Tensor_sym ;
00994 friend class Metric ;
00995
00996
00997
00998
00999 friend Scalar operator+(const Tensor&, const Scalar&) ;
01000 friend Scalar operator+(const Scalar&, const Tensor&) ;
01001 friend Scalar operator-(const Tensor&, const Scalar&) ;
01002 friend Scalar operator-(const Scalar&, const Tensor&) ;
01003 friend Tensor operator*(const Tensor&, const Tensor&) ;
01004 friend Tensor_sym operator*(const Tensor&, const Tensor_sym&) ;
01005 friend Tensor_sym operator*(const Tensor_sym&, const Tensor&) ;
01006 friend Tensor_sym operator*(const Tensor_sym&, const Tensor_sym&) ;
01007
01008 };
01009
01010
01011
01012
01013
01014
01015
01027 class Tensor_sym : public Tensor {
01028
01029
01030
01031 protected:
01032
01034 int id_sym1 ;
01035
01039 int id_sym2 ;
01040
01041
01042
01043
01044
01045 public:
01046
01066 Tensor_sym(const Map& map, int val, const Itbl& tipe,
01067 const Base_vect& triad_i, int index_sym1,
01068 int index_sym2) ;
01069
01083 Tensor_sym(const Map& map, int val, int tipe, const Base_vect& triad_i,
01084 int index_sym1, int index_sym2) ;
01085
01099 Tensor_sym(const Map& map, int tipe0, int tipe1, int tipe2,
01100 const Base_vect& triad_i,
01101 int index_sym1, int index_sym2) ;
01102
01103 Tensor_sym(const Tensor_sym& a) ;
01104
01115 Tensor_sym(const Map& map, const Base_vect& triad_i, FILE* fich) ;
01116
01117 public:
01118
01119 virtual ~Tensor_sym() ;
01120
01121
01122
01123 public:
01124
01126 virtual void operator=(const Tensor_sym& a) ;
01127
01132 virtual void operator=(const Tensor& a) ;
01133
01134
01135
01136
01137 public:
01139 int sym_index1() const {return id_sym1;} ;
01140
01144 int sym_index2() const {return id_sym2;} ;
01145
01161 virtual int position(const Itbl& ind) const ;
01162
01179 virtual Itbl indices(int pos) const ;
01180
01181
01182
01183
01184 public:
01185 virtual void sauve(FILE *) const ;
01186
01187
01188
01189
01190 public:
01191
01206 const Tensor_sym& derive_cov(const Metric& gam) const ;
01207
01213 const Tensor_sym& derive_con(const Metric& gam) const ;
01214
01218 Tensor_sym derive_lie(const Vector& v) const ;
01219
01220
01221
01222
01223
01224 friend Tensor_sym operator*(const Tensor&, const Tensor_sym&) ;
01225 friend Tensor_sym operator*(const Tensor_sym&, const Tensor&) ;
01226
01227 };
01228
01229
01230
01237
01238 Tensor operator*(const Tensor& a, const Tensor& b) ;
01239
01241 Tensor_sym operator*(const Tensor& a, const Tensor_sym& b) ;
01242
01244 Tensor_sym operator*(const Tensor_sym& a, const Tensor& b) ;
01245
01254 Tensor_sym operator*(const Tensor_sym& a, const Tensor_sym& b) ;
01255
01256
01276 Tensor contract(const Tensor& t1, int ind1, const Tensor& t2, int ind2,
01277 bool desaliasing = false) ;
01278
01305 Tensor contract(const Tensor& t1, int ind_i1, int ind_j1,
01306 const Tensor& t2, int ind_i2, int ind_j2,
01307 bool desaliasing = false) ;
01308
01309
01325 Tensor contract(const Tensor& t1, int ind1, int ind2) ;
01326
01327
01339 Tbl max(const Tensor& aa, const char* comment = 0x0, ostream& ost = cout) ;
01340
01341
01353 Tbl min(const Tensor& aa, const char* comment = 0x0, ostream& ost = cout) ;
01354
01366 Tbl maxabs(const Tensor& aa, const char* comment = 0x0, ostream& ost = cout,
01367 bool verb = true) ;
01368
01369
01384 Tbl diffrel(const Tensor& aa, const Tensor& bb, const char* comment = 0x0,
01385 ostream& ost = cout) ;
01386
01401 Tbl diffrelmax(const Tensor& aa, const Tensor& bb, const char* comment = 0x0,
01402 ostream& ost = cout) ;
01403
01414 Tbl central_value(const Tensor& aa, const char* comment = 0x0, ostream& ost = cout) ;
01415
01428 Tbl max_all_domains(const Tensor& aa, int l_excluded = -1, const char* comment = 0x0,
01429 ostream& ost = cout) ;
01430
01431
01444 Tbl min_all_domains(const Tensor& aa, int l_excluded = -1, const char* comment = 0x0,
01445 ostream& ost = cout) ;
01446
01459 Tbl maxabs_all_domains(const Tensor& aa, int l_excluded = -1, const char* comment = 0x0,
01460 ostream& ost = cout, bool verb = true) ;
01461
01462
01463
01473 Tensor operator+(const Tensor& ) ;
01474 Tensor operator-(const Tensor& ) ;
01475 Tensor operator+(const Tensor& a, const Tensor& b) ;
01476
01478 Scalar operator+(const Tensor& a, const Scalar& b) ;
01479
01481 Scalar operator+(const Scalar& a, const Tensor& b) ;
01482
01483 Tensor operator-(const Tensor& a, const Tensor& b) ;
01484
01486 Scalar operator-(const Tensor& a, const Scalar& b) ;
01487
01489 Scalar operator-(const Scalar& a, const Tensor& b) ;
01490
01491 Tensor operator*(const Scalar& a , const Tensor& b) ;
01492 Tensor operator*(const Tensor& a, const Scalar& b) ;
01493 Tensor operator*(double , const Tensor&) ;
01494 Tensor operator* (const Tensor&, double) ;
01495 Tensor operator*(int, const Tensor &) ;
01496 Tensor operator*(const Tensor&, int) ;
01497 Tensor operator/(const Tensor&, const Scalar&) ;
01498 Tensor operator/(const Tensor&, double) ;
01499 Tensor operator/(const Tensor&, int) ;
01500
01502
01510 Tensor_sym operator+(const Tensor_sym&) ;
01511
01515 Tensor_sym operator-(const Tensor_sym&) ;
01516
01521 Tensor_sym operator+(const Tensor_sym&, const Tensor_sym&) ;
01522
01527 Tensor_sym operator-(const Tensor_sym&, const Tensor_sym&) ;
01528
01532 Tensor_sym operator*(const Scalar& a, const Tensor_sym& b) ;
01533
01537 Tensor_sym operator*(const Tensor_sym& a, const Scalar& b) ;
01538
01542 Tensor_sym operator*(double, const Tensor_sym&) ;
01543
01547 Tensor_sym operator*(const Tensor_sym&, double) ;
01548
01552 Tensor_sym operator*(int, const Tensor_sym&) ;
01553
01557 Tensor_sym operator*(const Tensor_sym&, int) ;
01558
01562 Tensor_sym operator/(const Tensor_sym&, const Scalar&) ;
01563
01567 Tensor_sym operator/(const Tensor_sym&, double) ;
01568
01572 Tensor_sym operator/(const Tensor_sym&, int) ;
01573
01577 #include "scalar.h"
01578
01579 #include "vector.h"
01580
01581 #include "sym_tensor.h"
01582
01583
01584 #endif