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 char mtbl_arithm_C[] = "$Header: /cvsroot/Lorene/C++/Source/Mtbl/mtbl_arithm.C,v 1.1.1.1 2001/11/20 15:19:27 e_gourgoulhon Exp $" ;
00030
00031
00032
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 #include "mtbl.h"
00080 #include "coord.h"
00081
00082
00083
00084
00085
00086
00087
00088 Mtbl operator+(const Mtbl& t1)
00089 {
00090
00091 assert(t1.get_etat() != ETATNONDEF) ;
00092
00093 return t1 ;
00094 }
00095
00096
00097
00098 Mtbl operator-(const Mtbl& t1)
00099 {
00100
00101
00102 assert(t1.get_etat() != ETATNONDEF) ;
00103
00104
00105 if (t1.get_etat() == ETATZERO) {
00106 return t1 ;
00107 }
00108
00109
00110 assert(t1.get_etat() == ETATQCQ) ;
00111 Mtbl r(t1) ;
00112
00113 for (int i=0 ; i<r.get_nzone() ; i++) {
00114 *(r.t)[i] = -(*(t1.t)[i]) ;
00115 }
00116 return r ;
00117 }
00118
00119
00120
00121
00122
00123
00124
00125 Mtbl operator+(const Mtbl& t1, const Mtbl& t2)
00126 {
00127
00128 assert(t1.get_etat() != ETATNONDEF) ;
00129 assert(t2.get_etat() != ETATNONDEF) ;
00130 assert(t1.get_mg() == t2.get_mg()) ;
00131
00132
00133 if (t1.get_etat() == ETATZERO) {
00134 return t2 ;
00135 }
00136 if (t2.get_etat() == ETATZERO) {
00137 return t1 ;
00138 }
00139 assert(t1.get_etat() == ETATQCQ) ;
00140 assert(t2.get_etat() == ETATQCQ) ;
00141
00142
00143 int nz = t1.get_nzone() ;
00144
00145 Mtbl r(t1) ;
00146
00147 for (int i=0 ; i<nz ; i++) {
00148 *(r.t)[i] += *(t2.t)[i] ;
00149 }
00150
00151 return r ;
00152 }
00153
00154
00155
00156 Mtbl operator+(const Mtbl& t1, double x)
00157 {
00158
00159 assert(t1.get_etat() != ETATNONDEF) ;
00160
00161
00162 if (x == double(0)) {
00163 return t1 ;
00164 }
00165
00166 int nz = t1.get_nzone() ;
00167
00168
00169 Mtbl r(t1) ;
00170
00171 if (r.get_etat() == ETATZERO) {
00172 r.set_etat_qcq() ;
00173 for (int i=0 ; i<nz ; i++) {
00174 r.t[i]->set_etat_zero() ;
00175 *(r.t)[i] += x ;
00176 }
00177 }
00178 else{
00179 assert(r.get_etat() == ETATQCQ) ;
00180
00181 for (int i=0 ; i<nz ; i++) {
00182 *(r.t)[i] += x ;
00183 }
00184 }
00185
00186 return r ;
00187 }
00188
00189
00190
00191 Mtbl operator+(double x, const Mtbl& t1)
00192 {
00193 return t1 + x ;
00194 }
00195
00196
00197
00198 Mtbl operator+(const Mtbl& t1, int m)
00199 {
00200 return t1 + double(m) ;
00201 }
00202
00203
00204
00205 Mtbl operator+(int m, const Mtbl& t1)
00206 {
00207 return t1 + double(m) ;
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217 Mtbl operator-(const Mtbl& t1, const Mtbl& t2)
00218 {
00219
00220 assert(t1.get_etat() != ETATNONDEF) ;
00221 assert(t2.get_etat() != ETATNONDEF) ;
00222 assert(t1.get_mg() == t2.get_mg()) ;
00223
00224
00225 if (t1.get_etat() == ETATZERO) {
00226 return - t2 ;
00227 }
00228 if (t2.get_etat() == ETATZERO) {
00229 return t1 ;
00230 }
00231 assert(t1.get_etat() == ETATQCQ) ;
00232 assert(t2.get_etat() == ETATQCQ) ;
00233
00234
00235 int nz = t1.get_nzone() ;
00236
00237 Mtbl r(t1) ;
00238
00239 for (int i=0 ; i<nz ; i++) {
00240 *(r.t)[i] -= *(t2.t)[i] ;
00241 }
00242
00243 return r ;
00244 }
00245
00246
00247
00248 Mtbl operator-(const Mtbl& t1, double x)
00249 {
00250
00251
00252 assert(t1.get_etat() != ETATNONDEF) ;
00253
00254
00255 if (x == double(0)) {
00256 return t1 ;
00257 }
00258
00259
00260 int nz = t1.get_nzone() ;
00261
00262 Mtbl r(t1) ;
00263
00264 if (r.get_etat() == ETATZERO) {
00265 r.set_etat_qcq() ;
00266 for (int i=0 ; i<nz ; i++) {
00267 r.t[i]->set_etat_zero() ;
00268 *(r.t)[i] -= x ;
00269 }
00270 }
00271 else{
00272 assert(r.get_etat() == ETATQCQ) ;
00273
00274 for (int i=0 ; i<nz ; i++) {
00275 *(r.t)[i] -= x ;
00276 }
00277 }
00278
00279 return r ;
00280 }
00281
00282
00283
00284 Mtbl operator-(double x, const Mtbl& t1)
00285 {
00286 return - (t1 -x) ;
00287 }
00288
00289
00290
00291 Mtbl operator-(const Mtbl& t1, int m)
00292 {
00293 return t1 - double(m) ;
00294 }
00295
00296
00297
00298 Mtbl operator-(int m, const Mtbl& t1)
00299 {
00300 return double(m) - t1 ;
00301 }
00302
00303
00304
00305
00306
00307
00308
00309 Mtbl operator*(const Mtbl& t1, const Mtbl& t2)
00310 {
00311
00312 assert(t1.get_etat() != ETATNONDEF) ;
00313 assert(t2.get_etat() != ETATNONDEF) ;
00314 assert(t1.get_mg() == t2.get_mg()) ;
00315
00316
00317 if (t1.get_etat() == ETATZERO) {
00318 return t1 ;
00319 }
00320 if (t2.get_etat() == ETATZERO) {
00321 return t2 ;
00322 }
00323
00324
00325 assert(t1.get_etat() == ETATQCQ) ;
00326 assert(t2.get_etat() == ETATQCQ) ;
00327
00328 Mtbl r(t1) ;
00329
00330 int nz = t1.get_nzone() ;
00331 for (int i=0 ; i<nz ; i++) {
00332 *(r.t)[i] *= (*(t2.t)[i]) ;
00333 }
00334
00335 return r ;
00336 }
00337
00338
00339
00340 Mtbl operator*(const Mtbl& t1, double x)
00341 {
00342
00343
00344 assert(t1.get_etat() != ETATNONDEF) ;
00345
00346
00347 if ((t1.get_etat() == ETATZERO) || ( x == double(1) )) {
00348 return t1 ;
00349 }
00350
00351
00352 assert(t1.get_etat() == ETATQCQ) ;
00353
00354 Mtbl r(t1) ;
00355
00356 if ( x == double(0) ) {
00357 r.set_etat_zero() ;
00358 }
00359 else {
00360 int nz = t1.get_nzone() ;
00361 for (int i=0 ; i<nz ; i++) {
00362 *(r.t)[i] *= x ;
00363 }
00364 }
00365
00366 return r ;
00367 }
00368
00369
00370
00371 Mtbl operator*(double x, const Mtbl& t1)
00372 {
00373 return t1 * x ;
00374 }
00375
00376
00377
00378 Mtbl operator*(const Mtbl& t1, int m)
00379 {
00380 return t1 * double(m) ;
00381 }
00382
00383
00384
00385 Mtbl operator*(int m, const Mtbl& t1)
00386 {
00387 return t1 * double(m) ;
00388 }
00389
00390
00391
00392
00393
00394
00395
00396 Mtbl operator/(const Mtbl& t1, const Mtbl& t2)
00397 {
00398
00399
00400 assert(t1.get_etat() != ETATNONDEF) ;
00401 assert(t2.get_etat() != ETATNONDEF) ;
00402 assert(t1.get_mg() == t2.get_mg()) ;
00403
00404
00405 if (t2.get_etat() == ETATZERO) {
00406 cout << "Mtbl division by 0 !" << endl ;
00407 abort() ;
00408 }
00409 if (t1.get_etat() == ETATZERO) {
00410 return t1 ;
00411 }
00412
00413
00414 assert(t1.get_etat() == ETATQCQ) ;
00415 assert(t2.get_etat() == ETATQCQ) ;
00416
00417 Mtbl r(t1) ;
00418
00419 int nz = t1.get_nzone() ;
00420 for (int i=0 ; i<nz ; i++) {
00421 *(r.t)[i] /= (*(t2.t)[i]) ;
00422 }
00423
00424 return r ;
00425 }
00426
00427
00428
00429 Mtbl operator/(const Mtbl& t1, double x)
00430 {
00431
00432
00433 assert(t1.get_etat() != ETATNONDEF) ;
00434 if ( x == double(0) ) {
00435 cout << "Mtbl division by 0 !" << endl ;
00436 abort() ;
00437 }
00438
00439
00440 if ((t1.get_etat() == ETATZERO) || ( x == double(1) )) {
00441 return t1 ;
00442 }
00443
00444
00445 assert(t1.get_etat() == ETATQCQ) ;
00446
00447 Mtbl r(t1) ;
00448 int nz = t1.get_nzone() ;
00449 for (int i=0 ; i<nz ; i++) {
00450 *(r.t)[i] /= x ;
00451 }
00452
00453 return r ;
00454 }
00455
00456
00457
00458 Mtbl operator/(const Mtbl& t1, int n)
00459 {
00460 return t1/double(n) ;
00461 }
00462
00463
00464
00465 Mtbl operator/(double x, const Mtbl& t1)
00466 {
00467
00468
00469 assert(t1.get_etat() != ETATNONDEF) ;
00470
00471
00472 if (t1.get_etat() == ETATZERO) {
00473 cout << "Division by 0 in double / Mtbl !" << endl ;
00474 abort() ;
00475 }
00476
00477
00478 assert(t1.get_etat() == ETATQCQ) ;
00479
00480 Mtbl r( *(t1.get_mg()) ) ;
00481
00482 if ( x == double(0) ) {
00483 r.set_etat_zero() ;
00484 }
00485 else {
00486 r.set_etat_qcq() ;
00487 int nz = t1.get_nzone() ;
00488 for (int i=0 ; i<nz ; i++) {
00489 *(r.t)[i] = x / (*(t1.t)[i]) ;
00490 }
00491 }
00492
00493
00494 return r ;
00495 }
00496
00497
00498
00499 Mtbl operator/(int m, const Mtbl& t1)
00500 {
00501 return double(m)/t1 ;
00502 }
00503
00504
00505
00506
00507
00508
00509 void Mtbl::operator+=(const Mtbl & mi) {
00510
00511
00512 assert(mg == mi.get_mg()) ;
00513 assert(etat != ETATNONDEF) ;
00514 assert(mi.get_etat() != ETATNONDEF) ;
00515
00516
00517 if (mi.get_etat() == ETATZERO) {
00518 return ;
00519 }
00520
00521
00522
00523 if (etat == ETATZERO) {
00524 annule_hard() ;
00525 }
00526 for (int i=0 ; i<nzone ; i++) {
00527 *(t[i]) += *(mi.t[i]) ;
00528 }
00529 }
00530
00531 void Mtbl::operator-=(const Mtbl & mi) {
00532
00533
00534 assert(mg == mi.get_mg()) ;
00535 assert(etat != ETATNONDEF) ;
00536 assert(mi.get_etat() != ETATNONDEF) ;
00537
00538
00539 if (mi.get_etat() == ETATZERO) {
00540 return ;
00541 }
00542
00543
00544
00545 if (etat == ETATZERO) {
00546 annule_hard() ;
00547 }
00548 for (int i=0 ; i<nzone ; i++) {
00549 *(t[i]) -= *(mi.t[i]) ;
00550 }
00551 }
00552
00553 void Mtbl::operator*=(const Mtbl & mi) {
00554
00555
00556 assert(mg == mi.get_mg()) ;
00557 assert(etat != ETATNONDEF) ;
00558 assert(mi.get_etat() != ETATNONDEF) ;
00559
00560
00561 if (etat == ETATZERO) {
00562 return ;
00563 }
00564 if (mi.get_etat() == ETATZERO) {
00565 set_etat_zero() ;
00566 return ;
00567 }
00568
00569
00570 for (int i=0 ; i<nzone ; i++) {
00571 *(t[i]) *= *(mi.t[i]) ;
00572 }
00573
00574 }