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 #ifndef __TENSEUR_H_
00032 #define __TENSEUR_H_
00033
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
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 #define COV -1
00260 #define CON +1
00261
00262 #define N_MET_MAX 5
00263
00264
00265 #include "cmp.h"
00266 #include "itbl.h"
00267 #include "base_vect.h"
00268
00269 class Metrique ;
00270 class Tenseur_sym ;
00271
00272
00273
00274
00275
00276
00294 class Tenseur {
00295
00296
00297
00298 protected:
00299 const Map* const mp ;
00300 int valence ;
00301
00305 const Base_vect* triad ;
00306
00311 Itbl type_indice ;
00312
00313 int n_comp ;
00314 int etat ;
00315 Cmp** c ;
00316 double poids ;
00317
00318 const Metrique* metric ;
00319
00320
00321
00322 protected:
00330 const Metrique** met_depend ;
00331
00336 mutable Tenseur* p_gradient ;
00337
00343 mutable Tenseur* p_gradient_spher ;
00344
00351 Tenseur** p_derive_cov ;
00352
00358 Tenseur** p_derive_con ;
00359
00365 Tenseur** p_carre_scal ;
00366
00367
00368
00369 protected:
00371 bool verif() const ;
00372
00378 void new_der_met() ;
00379
00380 public:
00381 explicit Tenseur (const Map& map, const Metrique* met = 0x0,
00382 double weight = 0) ;
00383
00385 explicit Tenseur (const Cmp& cmp, const Metrique* met = 0x0,
00386 double weight = 0) ;
00387
00405 Tenseur (const Map& map, int val, const Itbl& tipe,
00406 const Base_vect& triad_i, const Metrique* met = 0x0,
00407 double weight = 0) ;
00408
00427 Tenseur (const Map& map, int val, const Itbl& tipe,
00428 const Base_vect* triad_i, const Metrique* met = 0x0,
00429 double weight = 0) ;
00430
00443 Tenseur (const Map& map, int val, int tipe, const
00444 Base_vect& triad_i, const Metrique* met = 0x0,
00445 double weight = 0) ;
00446
00447 Tenseur (const Tenseur&) ;
00448
00450 explicit Tenseur (const Tenseur_sym&) ;
00451
00464 Tenseur (const Map& map, const Base_vect& triad_i, FILE* fich,
00465 const Metrique* met = 0x0) ;
00466
00476 Tenseur (const Map& map, FILE* fich, const Metrique* met = 0x0) ;
00477
00478
00479 protected:
00499 Tenseur (const Map& map, int val, const Itbl& tipe, int n_comp,
00500 const Base_vect& triad_i, const Metrique* met = 0x0,
00501 double weight = 0) ;
00502
00517 Tenseur (const Map&, int val, int tipe, int n_comp,
00518 const Base_vect& triad_i, const Metrique* met = 0x0,
00519 double weight = 0) ;
00520
00521
00522 public:
00523
00524 virtual ~Tenseur() ;
00525
00526
00527
00528 protected:
00529 void del_t() ;
00530
00535 void del_derive_met(int i) const ;
00536
00540 void del_derive() const ;
00541
00547 void set_der_met_0x0(int i) const ;
00548
00553 void set_der_0x0() const ;
00554
00555
00556
00557 public:
00562 void set_etat_nondef() ;
00563
00568 void set_etat_zero() ;
00569
00574 void set_etat_qcq() ;
00575
00585 void allocate_all() ;
00586
00590 void change_triad(const Base_vect& new_triad) ;
00591
00598 void set_triad(const Base_vect& new_triad) ;
00599 void set_poids(double weight) ;
00600
00601 void set_metric(const Metrique& met) ;
00602
00604 virtual void operator=(const Tenseur& tens) ;
00605
00607 void operator=(const Cmp& field) ;
00608
00610 void operator=(double ) ;
00611
00613 void operator=(int ) ;
00614
00616 Cmp& set () ;
00617 Cmp& set (int) ;
00618 Cmp& set (int, int) ;
00619 Cmp& set (int, int, int) ;
00620 Cmp& set (const Itbl&) ;
00621
00627 void annule(int l) ;
00628
00640 void annule(int l_min, int l_max) ;
00641
00647 void set_std_base() ;
00648
00649 void dec_dzpuis() ;
00650 void inc_dzpuis() ;
00651 void dec2_dzpuis() ;
00652 void inc2_dzpuis() ;
00653 void mult_r_zec() ;
00654
00659 Tenseur inverse_poisson_vect (double lambda) const ;
00660
00661
00662
00663 public:
00674 virtual int donne_place (const Itbl& idx) const ;
00675
00689 virtual Itbl donne_indices (int place) const ;
00690
00692 const Map* get_mp() const {return mp ;} ;
00693
00697 const Base_vect* get_triad() const {return triad;} ;
00698
00700 int get_etat() const {return etat ;} ;
00701
00703 int get_valence() const {return valence ; } ;
00704
00706 int get_n_comp() const {return n_comp ;} ;
00707
00719 int get_type_indice (int i) const {return type_indice(i) ;};
00720
00728 Itbl get_type_indice () const {return type_indice ; } ;
00729
00731 double get_poids() const {return poids ; } ;
00732
00738 const Metrique* get_metric() const {return metric ; } ;
00739
00740 const Cmp& operator()() const ;
00741 const Cmp& operator()(int) const ;
00742 const Cmp& operator()(int, int) const ;
00743 const Cmp& operator()(int, int, int) const ;
00744 const Cmp& operator()(const Itbl&) const ;
00745
00746
00747
00748 public:
00749 void sauve(FILE *) const ;
00750 friend ostream& operator<<(ostream& , const Tenseur & ) ;
00751
00752
00753
00754 protected:
00759 virtual void fait_gradient () const ;
00760
00766 void fait_gradient_spher () const ;
00767
00773 virtual void fait_derive_cov (const Metrique& met, int i) const ;
00774
00780 virtual void fait_derive_con (const Metrique&, int i) const ;
00781
00787 void fait_carre_scal (const Metrique&, int i) const ;
00788
00798 void set_dependance (const Metrique& met) const ;
00799
00805 int get_place_met(const Metrique& metre) const ;
00806
00807
00808
00809 public:
00811 const Tenseur& gradient() const ;
00812
00816 const Tenseur& gradient_spher() const ;
00817
00822 const Tenseur& derive_cov (const Metrique& met) const ;
00823
00828 const Tenseur& derive_con (const Metrique&) const ;
00829
00834 const Tenseur& carre_scal (const Metrique&) const ;
00835
00836
00862 void poisson_vect(double lambda, Param& par, Tenseur& shift, Tenseur& vect
00863 , Tenseur& scal) const ;
00864
00865
00866
00867
00868 void poisson_vect_tau(double lambda, Param& par, Tenseur& shift, Tenseur& vect
00869 , Tenseur& scal) const ;
00870
00871 void poisson_vect_falloff(double lambda, Param& par, Tenseur& shift,
00872 Tenseur& vect, Tenseur& scal, int* k_falloff) const ;
00873
00874 void poisson_vect_ylm(double lambda, Param& para, Tenseur& shift,
00875 Tenseur& vecteur, Tenseur& scalaire, int nylm,
00876 double* intvec) const ;
00877
00905 Tenseur poisson_vect(double lambda, Tenseur& vect , Tenseur& scal ) const ;
00906
00907
00908
00909
00910 Tenseur poisson_vect_tau(double lambda, Tenseur& vect , Tenseur& scal ) const ;
00911
00912 Tenseur poisson_vect_falloff(double lambda, Tenseur& vect ,
00913 Tenseur& scal, int* k_falloff ) const ;
00914
00915 Tenseur poisson_vect_ylm(double lambda, Tenseur& vecteur,
00916 Tenseur& scalaire, int nylm, double* intvec) const ;
00917
00943 void poisson_vect_oohara(double lambda, Param& par, Tenseur& shift,
00944 Tenseur& scal) const ;
00945
00946
00947
00948
00949 void poisson_vect_oohara_tau(double lambda, Param& par, Tenseur& shift,
00950 Tenseur& scal) const ;
00951
00980 Tenseur poisson_vect_oohara(double lambda, Tenseur& scal) const ;
00981
00982
00983
00984 Tenseur poisson_vect_oohara_tau(double lambda, Tenseur& scal) const ;
00985
01014 void poisson_vect_regu(int k_div, int nzet, double unsgam1,
01015 double lambda, Param& par, Tenseur& shift,
01016 Tenseur& vect, Tenseur& scal) const ;
01017
01018
01020
01021 void compare( const Tenseur& tens, const char* name ) ;
01022 void compare( FILE* fich, const char* name_i ) ;
01023
01024
01025
01026
01027
01028 friend class Tenseur_sym ;
01029 friend class Metrique ;
01030
01031
01032
01033
01034 friend Tenseur operator* (const Tenseur&, const Tenseur&) ;
01035 friend Tenseur operator% (const Tenseur&, const Tenseur&) ;
01036 friend Tenseur contract(const Tenseur&, int id1, int id2) ;
01037 friend Tenseur contract(const Tenseur&, int id1, const Tenseur&,
01038 int id2) ;
01039 friend Tenseur contract_desal(const Tenseur&, int id1, const Tenseur&,
01040 int id2) ;
01041 friend Tenseur flat_scalar_prod(const Tenseur& t1, const Tenseur& t2) ;
01042 friend Tenseur flat_scalar_prod_desal(const Tenseur& t1,
01043 const Tenseur& t2) ;
01044 friend Tenseur manipule(const Tenseur&, const Metrique&, int idx) ;
01045 friend Tenseur manipule(const Tenseur&, const Metrique&) ;
01046 friend Tenseur skxk (const Tenseur&) ;
01047 friend Tenseur lie_derive(const Tenseur& , const Tenseur& ,
01048 const Metrique* ) ;
01049
01050 };
01051
01052
01059
01060 Tenseur operator*(const Tenseur&, const Tenseur&) ;
01061
01063 Tenseur operator%(const Tenseur&, const Tenseur&) ;
01064
01087 Tenseur contract(const Tenseur&, int id1, int id2) ;
01088
01111 Tenseur contract(const Tenseur&, int id1, const Tenseur&, int id2) ;
01112
01119 Tenseur flat_scalar_prod(const Tenseur& t1, const Tenseur& t2) ;
01120
01124 Tenseur flat_scalar_prod_desal(const Tenseur& t1, const Tenseur& t2) ;
01125
01130 Tenseur manipule(const Tenseur&, const Metrique&, int idx) ;
01131
01136 Tenseur manipule(const Tenseur&, const Metrique&) ;
01137
01145 Tenseur skxk (const Tenseur&) ;
01146
01153 Tenseur lie_derive (const Tenseur& t, const Tenseur& x, const Metrique* = 0x0);
01154
01163 Tenseur sans_trace(const Tenseur& tens, const Metrique& metre) ;
01164
01165
01174 Tenseur operator+(const Tenseur& ) ;
01175 Tenseur operator-(const Tenseur& ) ;
01176 Tenseur operator+(const Tenseur&, const Tenseur &) ;
01177
01179 Tenseur operator+(const Tenseur&, double ) ;
01180
01182 Tenseur operator+(double, const Tenseur& ) ;
01183
01185 Tenseur operator+(const Tenseur&, int ) ;
01186
01188 Tenseur operator+(int, const Tenseur& ) ;
01189
01190 Tenseur operator-(const Tenseur &, const Tenseur &) ;
01191
01193 Tenseur operator-(const Tenseur&, double ) ;
01194
01196 Tenseur operator-(double, const Tenseur& ) ;
01197
01199 Tenseur operator-(const Tenseur&, int ) ;
01200
01202 Tenseur operator-(int, const Tenseur& ) ;
01203
01205 Tenseur operator*(const Tenseur&, double ) ;
01206
01208 Tenseur operator*(double, const Tenseur& ) ;
01209
01211 Tenseur operator*(const Tenseur&, int ) ;
01212
01214 Tenseur operator*(int, const Tenseur& ) ;
01215
01217 Tenseur operator/(const Tenseur& a, const Tenseur& b) ;
01218
01219 Tenseur operator/(const Tenseur&, double ) ;
01220
01222 Tenseur operator/(double, const Tenseur &) ;
01223
01224 Tenseur operator/(const Tenseur&, int ) ;
01225
01227 Tenseur operator/(int, const Tenseur &) ;
01228
01229 Tenseur exp(const Tenseur& ) ;
01230 Tenseur log(const Tenseur& ) ;
01231 Tenseur sqrt(const Tenseur& ) ;
01232 Tenseur abs(const Tenseur& ) ;
01233 Tenseur pow(const Tenseur&, int ) ;
01234 Tenseur pow(const Tenseur&, double ) ;
01235
01242
01243
01244
01245
01253 class Tenseur_sym : public Tenseur {
01254
01255
01256
01257
01258 public:
01273 Tenseur_sym (const Map& map, int val, const Itbl& tipe,
01274 const Base_vect& triad_i, const Metrique* met = 0x0,
01275 double weight = 0) ;
01276
01286 Tenseur_sym (const Map& map, int val, int tipe,
01287 const Base_vect& triad_i, const Metrique* met = 0x0,
01288 double weight = 0) ;
01289
01290 Tenseur_sym (const Tenseur_sym&) ;
01291
01295 explicit Tenseur_sym (const Tenseur&) ;
01296
01307 Tenseur_sym (const Map& map, const Base_vect& triad_i, FILE* fich,
01308 const Metrique* met = 0x0) ;
01309
01310 virtual ~Tenseur_sym() ;
01311
01312
01313
01314 public:
01320 virtual void operator= (const Tenseur&) ;
01321
01322
01323
01324
01325 public:
01336 virtual int donne_place (const Itbl& idx) const ;
01337
01349 virtual Itbl donne_indices (int place) const ;
01350
01351
01352
01353 protected:
01358 virtual void fait_gradient () const ;
01359
01365 virtual void fait_derive_cov (const Metrique& met, int i) const ;
01366
01372 virtual void fait_derive_con (const Metrique&, int i) const ;
01373
01374
01375
01376 friend Tenseur_sym operator* (const Tenseur&, const Tenseur_sym&) ;
01377 friend Tenseur_sym manipule(const Tenseur_sym&, const Metrique&) ;
01378 friend Tenseur lie_derive (const Tenseur& , const Tenseur& ,
01379 const Metrique* );
01380
01381 } ;
01388
01389 Tenseur_sym operator* (const Tenseur&, const Tenseur_sym&) ;
01390
01395 Tenseur_sym manipule(const Tenseur_sym&, const Metrique&) ;
01396
01404 Tenseur_sym lie_derive (const Tenseur_sym& t, const Tenseur& x,
01405 const Metrique* = 0x0);
01406
01415 Tenseur_sym sans_trace(const Tenseur_sym& tens, const Metrique& metre) ;
01416
01427 Tenseur_sym operator+(const Tenseur_sym& ) ;
01428 Tenseur_sym operator-(const Tenseur_sym& ) ;
01429
01431 Tenseur_sym operator+(const Tenseur_sym&, const Tenseur_sym &) ;
01432
01434 Tenseur_sym operator-(const Tenseur_sym &, const Tenseur_sym &) ;
01435
01437 Tenseur_sym operator*(const Tenseur_sym&, double ) ;
01438
01440 Tenseur_sym operator*(double, const Tenseur_sym& ) ;
01441
01443 Tenseur_sym operator*(const Tenseur_sym&, int ) ;
01444
01446 Tenseur_sym operator*(int, const Tenseur_sym& ) ;
01447
01449 Tenseur_sym operator/(const Tenseur_sym& a, const Tenseur& b) ;
01450
01451 Tenseur_sym operator/(const Tenseur_sym&, double ) ;
01452
01453 Tenseur_sym operator/(const Tenseur_sym&, int ) ;
01454
01461 #endif