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
00033 char tenseur_sym_arithm_C[] = "$Header: /cvsroot/Lorene/C++/Source/Tenseur/tenseur_sym_arithm.C,v 1.5 2003/06/20 14:54:17 f_limousin Exp $" ;
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 #include <stdlib.h>
00077 #include <assert.h>
00078 #include <math.h>
00079
00080
00081 #include "tenseur.h"
00082
00083
00084
00085
00086
00087 Tenseur_sym operator+(const Tenseur_sym & t) {
00088
00089 return t ;
00090
00091 }
00092
00093
00094 Tenseur_sym operator-(const Tenseur_sym & t) {
00095
00096 assert (t.get_etat() != ETATNONDEF) ;
00097 if (t.get_etat() == ETATZERO)
00098 return t ;
00099 else {
00100 Tenseur_sym res(*(t.get_mp()), t.get_valence(), t.get_type_indice(),
00101 *(t.get_triad()), t.get_metric(), t.get_poids() ) ;
00102
00103 res.set_etat_qcq();
00104 for (int i=0 ; i<res.get_n_comp() ; i++) {
00105 Itbl indices (res.donne_indices(i)) ;
00106 res.set(indices) = -t(indices) ;
00107 }
00108 return res ;
00109 }
00110 }
00111
00112
00113
00114
00115
00116
00117 Tenseur_sym operator+(const Tenseur_sym & t1, const Tenseur_sym & t2) {
00118
00119 assert ((t1.get_etat() != ETATNONDEF) && (t2.get_etat() != ETATNONDEF)) ;
00120 assert (t1.get_valence() == t2.get_valence()) ;
00121 assert (t1.get_mp() == t2.get_mp()) ;
00122 if (t1.get_valence() != 0) {
00123 assert ( *(t1.get_triad()) == *(t2.get_triad()) ) ;
00124 }
00125
00126 for (int i=0 ; i<t1.get_valence() ; i++)
00127 assert(t1.get_type_indice(i) == t2.get_type_indice(i)) ;
00128 assert (t1.get_metric() == t2.get_metric()) ;
00129 assert (fabs(t1.get_poids() - t2.get_poids())<1.e-10) ;
00130
00131 if (t1.get_etat() == ETATZERO)
00132 return t2 ;
00133 else if (t2.get_etat() == ETATZERO)
00134 return t1 ;
00135 else {
00136 Tenseur_sym res(*(t1.get_mp()), t1.get_valence(),
00137 t1.get_type_indice(), *(t1.get_triad()),
00138 t1.get_metric(), t1.get_poids() ) ;
00139
00140 res.set_etat_qcq() ;
00141 for (int i=0 ; i<res.get_n_comp() ; i++) {
00142 Itbl indices (res.donne_indices(i)) ;
00143 res.set(indices) = t1(indices) + t2(indices) ;
00144 }
00145 return res ;
00146 }
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156 Tenseur_sym operator-(const Tenseur_sym & t1, const Tenseur_sym & t2) {
00157
00158 return (t1 + (-t2)) ;
00159
00160 }
00161
00162
00163
00164
00165
00166
00167 Tenseur_sym operator*(double x, const Tenseur_sym& t) {
00168
00169 assert (t.get_etat() != ETATNONDEF) ;
00170 if ( (t.get_etat() == ETATZERO) || (x == double(1)) )
00171 return t ;
00172 else {
00173 Tenseur_sym res(*(t.get_mp()), t.get_valence(), t.get_type_indice(),
00174 *(t.get_triad()), t.get_metric(), t.get_poids() ) ;
00175
00176 if ( x == double(0) )
00177 res.set_etat_zero() ;
00178 else {
00179 res.set_etat_qcq() ;
00180 for (int i=0 ; i<res.get_n_comp() ; i++) {
00181 Itbl indices (res.donne_indices(i)) ;
00182 res.set(indices) = x*t(indices) ;
00183 }
00184 }
00185 return res ;
00186 }
00187 }
00188
00189
00190 Tenseur_sym operator* (const Tenseur_sym& t, double x) {
00191 return x * t ;
00192 }
00193
00194 Tenseur_sym operator*(int m, const Tenseur_sym& t) {
00195 return double(m) * t ;
00196 }
00197
00198
00199 Tenseur_sym operator* (const Tenseur_sym& t, int m) {
00200 return double(m) * t ;
00201 }
00202
00203
00204
00205
00206
00207
00208
00209 Tenseur_sym operator/ (const Tenseur_sym& t1, const Tenseur& t2) {
00210
00211
00212 assert(t1.get_etat() != ETATNONDEF) ;
00213 assert(t2.get_etat() != ETATNONDEF) ;
00214 assert(t2.get_valence() == 0) ;
00215 assert(t1.get_mp() == t2.get_mp()) ;
00216
00217 double poids_res = t1.get_poids() - t2.get_poids() ;
00218 poids_res = (fabs(poids_res) < 1.e-10 ? 0. : poids_res) ;
00219 const Metrique* met_res = 0x0 ;
00220 if (poids_res != 0.) {
00221
00222 if (t1.get_metric() != 0x0) met_res = t1.get_metric() ;
00223 else met_res = t2.get_metric() ;
00224 }
00225
00226
00227 if (t2.get_etat() == ETATZERO) {
00228 cout << "Division by 0 in Tenseur_sym / Tenseur !" << endl ;
00229 abort() ;
00230 }
00231 if (t1.get_etat() == ETATZERO) {
00232 Tenseur_sym resu(t1) ;
00233 resu.set_poids(poids_res) ;
00234 resu.set_metric(*met_res) ;
00235 return resu ;
00236 }
00237
00238
00239
00240 assert(t1.get_etat() == ETATQCQ) ;
00241 assert(t2.get_etat() == ETATQCQ) ;
00242
00243 Tenseur_sym res(*(t1.get_mp()), t1.get_valence(), t1.get_type_indice(),
00244 *(t1.get_triad()), met_res, poids_res ) ;
00245
00246 res.set_etat_qcq() ;
00247 for (int i=0 ; i<res.get_n_comp() ; i++) {
00248 Itbl indices (res.donne_indices(i)) ;
00249 res.set(indices) = t1(indices) / t2() ;
00250 }
00251 return res ;
00252
00253 }
00254
00255
00256 Tenseur_sym operator/ (const Tenseur_sym& t, double x) {
00257
00258 assert (t.get_etat() != ETATNONDEF) ;
00259
00260 if ( x == double(0) ) {
00261 cout << "Division by 0 in Tenseur_sym / double !" << endl ;
00262 abort() ;
00263 }
00264
00265 if ( (t.get_etat() == ETATZERO) || (x == double(1)) )
00266 return t ;
00267 else {
00268 Tenseur_sym res(*(t.get_mp()), t.get_valence(), t.get_type_indice(),
00269 *(t.get_triad()), t.get_metric(), t.get_poids() ) ;
00270
00271 res.set_etat_qcq() ;
00272 for (int i=0 ; i<res.get_n_comp() ; i++) {
00273 Itbl indices (res.donne_indices(i)) ;
00274 res.set(indices) = t(indices) / x ;
00275 }
00276 return res ;
00277 }
00278 }
00279
00280
00281
00282 Tenseur_sym operator/ (const Tenseur_sym& t, int m) {
00283
00284 return t / double(m) ;
00285 }
00286
00287