arithm_tbl_val.C

00001 /*
00002  * Methods for making calculations with Godunov-type arrays.
00003  *
00004  * See the file tbl_val.h for documentation
00005  *
00006  */
00007 
00008 /*
00009  *   Copyright (c) 2001 Jerome Novak
00010  *
00011  *   This file is part of LORENE.
00012  *
00013  *   LORENE is free software; you can redistribute it and/or modify
00014  *   it under the terms of the GNU General Public License as published by
00015  *   the Free Software Foundation; either version 2 of the License, or
00016  *   (at your option) any later version.
00017  *
00018  *   LORENE is distributed in the hope that it will be useful,
00019  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00020  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021  *   GNU General Public License for more details.
00022  *
00023  *   You should have received a copy of the GNU General Public License
00024  *   along with LORENE; if not, write to the Free Software
00025  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00026  *
00027  */
00028 
00029 
00030 char ARITHM_TBL_VAL_C[] = "$Header: /cvsroot/Lorene/C++/Source/Valencia/arithm_tbl_val.C,v 1.4 2003/10/02 07:00:19 e_gourgoulhon Exp $" ;
00031 
00032 /*
00033  * $Id: arithm_tbl_val.C,v 1.4 2003/10/02 07:00:19 e_gourgoulhon Exp $
00034  * $Log: arithm_tbl_val.C,v $
00035  * Revision 1.4  2003/10/02 07:00:19  e_gourgoulhon
00036  * Changed the = signs in some assert's to ==
00037  *
00038  * Revision 1.3  2002/11/12 10:03:54  j_novak
00039  * The method "Tbl_val::get_gval" has been changed to "get_grid".
00040  *
00041  * Revision 1.2  2002/10/16 14:37:15  j_novak
00042  * Reorganization of #include instructions of standard C++, in order to
00043  * use experimental version 3 of gcc.
00044  *
00045  * Revision 1.1  2001/11/22 13:41:54  j_novak
00046  * Added all source files for manipulating Valencia type objects and making
00047  * interpolations to and from Meudon grids.
00048  *
00049  *
00050  * $Header: /cvsroot/Lorene/C++/Source/Valencia/arithm_tbl_val.C,v 1.4 2003/10/02 07:00:19 e_gourgoulhon Exp $
00051  *
00052  */
00053 
00054 // headers Lorene
00055 #include "tbl_val.h"
00056 
00057             //********************//
00058             // OPERATEURS UNAIRES //
00059             //********************//
00060 
00061 // + Tbl_val
00062 // -----
00063 Tbl_val operator+(const Tbl_val& t1)
00064 {
00065   // Protection
00066   assert(t1.get_etat() != ETATNONDEF) ;
00067   
00068   return t1 ;
00069 }
00070 
00071 // - Tbl_val
00072 // -----
00073 Tbl_val operator-(const Tbl_val& t1)
00074 {
00075   // Protection
00076   assert(t1.get_etat() != ETATNONDEF) ;
00077   
00078   // Cas particulier
00079   if (t1.get_etat() == ETATZERO) {
00080     return t1 ;
00081   }
00082   
00083   // Cas general
00084   Tbl_val r(t1.get_grille()) ;          // Tbl_val resultat
00085   r.set_etat_qcq() ;
00086   for (int i=0 ; i<r.get_taille() ; i++) 
00087     (r.t)[i] = - (t1.t)[i] ;
00088   
00089   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00090     (r.tzri)[i] = - (t1.tzri)[i] ;
00091   
00092   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00093     (r.txti)[i] = - (t1.txti)[i] ;
00094   
00095   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00096     (r.typi)[i] = - (t1.typi)[i] ;
00097   
00098   return r ;
00099 }
00100 
00101                         //**********//
00102             // ADDITION //
00103             //**********//
00104 
00105 // Tbl_val + Tbl_val
00106 // ---------
00107 Tbl_val operator+(const Tbl_val& t1, const Tbl_val& t2)
00108 {
00109 
00110   // Protection
00111   assert(t1.get_etat() != ETATNONDEF) ;
00112   assert(t2.get_etat() != ETATNONDEF) ;
00113   assert(t1.get_ndim() == t2.get_ndim()) ;
00114   for (int i=0 ; i<t1.get_ndim() ; i++) {
00115     assert( t1.get_dim(i) == t2.get_dim(i) ) ;
00116   }
00117   
00118   // Traitement des cas particuliers
00119   if (t1.get_etat() == ETATZERO) {
00120     return t2 ;
00121   }
00122   if (t2.get_etat() == ETATZERO) {
00123     return t1 ;
00124   }
00125   
00126   // Cas general
00127   assert(t1.get_etat() == ETATQCQ) ;    // sinon...
00128   assert(t2.get_etat() == ETATQCQ) ;    // sinon...
00129   
00130   Tbl_val r(t1) ;       // Tbl_val resultat
00131   for (int i=0 ; i<r.get_taille() ; i++) {
00132     (r.t)[i] += (t2.t)[i] ;
00133   }
00134   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00135     (r.tzri)[i] += (t2.tzri)[i] ;
00136   
00137   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00138     (r.txti)[i] *= (t2.txti)[i] ;
00139   
00140   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00141     (r.typi)[i] *= (t2.typi)[i] ;
00142   
00143   
00144   // Termine
00145   return r ;
00146 }
00147 
00148 // Tbl_val + double
00149 // ------------
00150 Tbl_val operator+(const Tbl_val& t1, double x)
00151 {
00152   // Protection
00153   assert(t1.get_etat() != ETATNONDEF) ;
00154   
00155   // Cas particulier
00156   if ( x == double(0) ) {
00157     return t1 ;
00158   }
00159   
00160   // Cas general
00161   Tbl_val r(t1) ;       // Tbl_val resultat
00162   r.set_etat_qcq() ;
00163   for (int i=0 ; i<r.get_taille() ; i++) {
00164     (r.t)[i] += x ;
00165   }
00166   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00167     (r.tzri)[i] += x ;
00168   
00169   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00170     (r.txti)[i] += x ;
00171   
00172   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00173     (r.typi)[i] += x;
00174   
00175   return r ;
00176 }
00177 
00178 // double + Tbl_val
00179 // ------------
00180 Tbl_val operator+(double x, const Tbl_val& t1)
00181 {
00182   return t1 + x ;
00183 }
00184 
00185 // Tbl_val + int
00186 // ---------
00187 Tbl_val operator+(const Tbl_val& t1, int n)
00188 {
00189   return t1 + double(n) ;
00190 }
00191 
00192 // int + Tbl_val
00193 // ---------
00194 Tbl_val operator+(int n, const Tbl_val& t1)
00195 {
00196   return t1 + double(n) ;
00197 }
00198 
00199 
00200             //**************//
00201             // SOUSTRACTION //
00202             //**************//
00203 
00204 // Tbl_val - Tbl_val
00205 // ---------
00206 Tbl_val operator-(const Tbl_val& t1, const Tbl_val& t2)
00207 {
00208 
00209   // Protection
00210   assert(t1.get_etat() != ETATNONDEF) ;
00211   assert(t2.get_etat() != ETATNONDEF) ;
00212   assert(t1.get_ndim() == t2.get_ndim()) ;
00213   for (int i=0 ; i<t1.get_ndim() ; i++) {
00214     assert( t1.get_dim(i) == t2.get_dim(i) ) ;
00215   }
00216   
00217   // Traitement des cas particuliers
00218   if (t1.get_etat() == ETATZERO) {
00219     return -t2 ;
00220   }
00221   if (t2.get_etat() == ETATZERO) {
00222     return t1 ;
00223   }
00224   
00225   // Cas general
00226   assert(t1.get_etat() == ETATQCQ) ;    // sinon...
00227   assert(t2.get_etat() == ETATQCQ) ;    // sinon...
00228 
00229   Tbl_val r(t1) ;       // Tbl_val resultat
00230   for (int i=0 ; i<r.get_taille() ; i++) {
00231     (r.t)[i] -= (t2.t)[i] ;
00232   }
00233   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00234     (r.tzri)[i] -= (t2.tzri)[i] ;
00235     
00236   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00237     (r.txti)[i] -= (t2.txti)[i] ;
00238     
00239   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00240     (r.typi)[i] -= (t2.typi)[i] ;
00241     
00242 
00243   // Termine
00244   return r ;
00245 }
00246 
00247 
00248 // Tbl_val - double
00249 // ------------
00250 Tbl_val operator-(const Tbl_val& t1, double x)
00251 {
00252   // Protection
00253   assert(t1.get_etat() != ETATNONDEF) ;
00254 
00255     // Cas particulier
00256   if ( x == double(0) ) {
00257     return t1 ;
00258   }
00259     
00260   // Cas general
00261   Tbl_val r(t1) ;       // Tbl_val resultat
00262   r.set_etat_qcq() ;
00263   for (int i=0 ; i<r.get_taille() ; i++) {
00264     (r.t)[i] -= x ;
00265   }
00266   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00267     (r.tzri)[i] -= x ;
00268     
00269   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00270     (r.txti)[i] -= x ;
00271     
00272   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00273     (r.typi)[i] -= x ;
00274     
00275 
00276   return r ;
00277 }
00278 
00279 // Tbl_val - int
00280 // ---------
00281 Tbl_val operator-(const Tbl_val& t1, int n)
00282 {
00283   return t1 - double(n) ;
00284 }
00285 
00286 // double - Tbl_val
00287 // ------------
00288 Tbl_val operator-(double x, const Tbl_val& t1)
00289 {
00290   // Protection
00291   assert(t1.get_etat() != ETATNONDEF) ;
00292 
00293     // Cas particulier
00294   if ( x == double(0) ) {
00295     return -t1 ;
00296   }
00297     
00298   // Cas general
00299   Tbl_val r(t1) ;       // Tbl_val resultat
00300   r.set_etat_qcq() ;
00301   for (int i=0 ; i<r.get_taille() ; i++) {
00302     (r.t)[i] -= x ;
00303   }
00304   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00305     (r.tzri)[i] -= x ;
00306     
00307   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00308     (r.txti)[i] -= x ;
00309     
00310   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00311     (r.typi)[i] -= x ;
00312     
00313   return -r ;
00314 }
00315 
00316 // int - Tbl_val
00317 // ---------
00318 Tbl_val operator-(int n, const Tbl_val& t1)
00319 {
00320   return double(n) - t1 ;
00321 }
00322 
00323 //****************//
00324 // MULTIPLICATION //
00325 //****************//
00326 
00327 // Tbl_val * Tbl_val
00328 // ---------
00329 Tbl_val operator*(const Tbl_val& t1, const Tbl_val& t2)
00330 {
00331   // Protection
00332   assert(t1.get_etat() != ETATNONDEF) ;
00333   assert(t2.get_etat() != ETATNONDEF) ;
00334   assert(t1.get_ndim() == t2.get_ndim()) ;
00335   for (int i=0 ; i<t1.get_ndim() ; i++) {
00336     assert( t1.get_dim(i) == t2.get_dim(i) ) ;
00337   }
00338 
00339   // Cas particulier
00340   if (t1.get_etat() == ETATZERO) {
00341     return t1 ;
00342   }
00343   if (t2.get_etat() == ETATZERO) {
00344     return t2 ;
00345   }
00346     
00347   // Cas general
00348   assert(t1.get_etat() == ETATQCQ) ;    // sinon...
00349   assert(t2.get_etat() == ETATQCQ) ;    // sinon...
00350 
00351   Tbl_val r(t1) ;
00352   for (int i=0 ; i<r.get_taille() ; i++) {
00353     (r.t)[i] *= (t2.t)[i] ;
00354   }
00355   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00356     (r.tzri)[i] *= (t2.tzri)[i] ;
00357     
00358   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00359     (r.txti)[i] *= (t2.txti)[i] ;
00360     
00361   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00362     (r.typi)[i] *= (t2.typi)[i] ;
00363     
00364     // Termine
00365   return r ;
00366 }
00367 
00368 // Tbl_val * double
00369 // ------------
00370 Tbl_val operator*(const Tbl_val& t1, double x)
00371 {
00372   // Protection
00373   assert(t1.get_etat() != ETATNONDEF) ;
00374 
00375     // Cas particulier
00376   if ((t1.get_etat() == ETATZERO) || ( x == double(1) )) {
00377     return t1 ;
00378   }
00379 
00380   // Cas general
00381   assert(t1.get_etat() == ETATQCQ) ;    // sinon...
00382 
00383   Tbl_val r(t1) ;           // Tbl_val resultat
00384 
00385   if (x == double(0)) {
00386     r.set_etat_zero() ;
00387   }
00388   else {
00389     for (int i=0 ; i<r.get_taille() ; i++) {
00390       (r.t)[i] *= x ;
00391     }
00392     for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00393       (r.tzri)[i] *= x ;
00394     
00395     if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00396       (r.txti)[i] *= x ;
00397     
00398     if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00399       (r.typi)[i] *= x ;
00400     
00401 
00402   }
00403     
00404   // Termine
00405   return r ;
00406 }
00407 
00408 // double * Tbl_val
00409 // ------------
00410 Tbl_val operator*(double x, const Tbl_val& t1)
00411 {
00412   return t1 * x ;
00413 }
00414 
00415 // Tbl_val * int
00416 // ---------
00417 Tbl_val operator*(const Tbl_val& t1, int n)
00418 {
00419   return t1 * double(n) ;
00420 }
00421 
00422 // int * Tbl_val
00423 // ---------
00424 Tbl_val operator*(int n, const Tbl_val& t1)
00425 {
00426   return t1 * double(n) ;
00427 }
00428 
00429 //**********//
00430 // DIVISION //
00431 //**********//
00432 
00433 // Tbl_val / Tbl_val
00434 // ---------
00435 Tbl_val operator/(const Tbl_val& t1, const Tbl_val& t2)
00436 {
00437   // Protection
00438   assert(t1.get_etat() != ETATNONDEF) ;
00439   assert(t2.get_etat() != ETATNONDEF) ;
00440   assert(t1.get_ndim() == t2.get_ndim()) ;
00441   for (int i=0 ; i<t1.get_ndim() ; i++) {
00442     assert( t1.get_dim(i) == t2.get_dim(i) ) ;
00443   }
00444 
00445   // Cas particuliers
00446   if (t2.get_etat() == ETATZERO) {
00447     cout << "Division by 0 in Tbl_val/Tbl_val !" << endl ;
00448     abort() ; 
00449   }
00450   if (t1.get_etat() == ETATZERO) {
00451     return t1 ;
00452   }
00453     
00454   // Cas general
00455   assert(t1.get_etat() == ETATQCQ) ;    // sinon...
00456   assert(t2.get_etat() == ETATQCQ) ;    // sinon...
00457 
00458   Tbl_val r(t1) ;           // Tbl_val resultat
00459   for (int i=0 ; i<r.get_taille() ; i++) {
00460     (r.t)[i] /= (t2.t)[i] ;
00461   }
00462   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00463     (r.tzri)[i] /= (t2.tzri)[i] ;
00464     
00465   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00466     (r.txti)[i] /= (t2.txti)[i] ;
00467     
00468   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00469     (r.typi)[i] /= (t2.typi)[i] ;
00470         
00471 
00472     // Termine
00473   return r ;
00474 }
00475 
00476 // Tbl_val / double
00477 // ------------
00478 Tbl_val operator/(const Tbl_val& t1, double x)
00479 {
00480   // Protection
00481   assert(t1.get_etat() != ETATNONDEF) ;
00482   if ( x == double(0) ) {
00483     cout << "Division by 0 in Tbl_val/double !" << endl ;
00484     abort() ;
00485   }
00486     
00487   // Cas particulier
00488   if ((t1.get_etat() == ETATZERO) || ( x == double(1) )) {
00489     return t1 ;
00490   }
00491     
00492   // Cas general
00493   assert(t1.get_etat() == ETATQCQ) ;    // sinon...
00494 
00495   Tbl_val r(t1) ;           // Tbl_val resultat
00496   for (int i=0 ; i<r.get_taille() ; i++) {
00497     (r.t)[i] /= x ;
00498   }
00499   for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00500     (r.tzri)[i] /= x ;
00501     
00502   if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00503     (r.txti)[i] /= x ;
00504     
00505   if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00506     (r.typi)[i] /= x ;
00507     
00508 
00509 
00510   return r ;
00511 }
00512 
00513 // Tbl_val / int
00514 // ---------
00515 Tbl_val operator/(const Tbl_val& t1, int n)
00516 {
00517   return t1 / double(n) ;
00518 }
00519 
00520 // double / Tbl_val
00521 // ------------
00522 Tbl_val operator/(double x, const Tbl_val& t1)
00523 {
00524   // Protection
00525   assert(t1.get_etat() != ETATNONDEF) ;
00526 
00527     // Cas particuliers
00528   if (t1.get_etat() == ETATZERO) {
00529     cout << "Division by 0 in double/Tbl_val !" << endl ;
00530     abort() ; 
00531   }
00532 
00533   // Cas general
00534   assert(t1.get_etat() == ETATQCQ) ;    // sinon...
00535 
00536   Tbl_val r(t1.get_grille()) ;      // Tbl_val resultat, a priori NONDEF
00537     
00538   if ( x == double(0) ) {
00539     r.set_etat_zero() ;
00540   }
00541   else {
00542     r.set_etat_qcq() ;
00543     for (int i=0 ; i<r.get_taille() ; i++) {
00544       (r.t)[i] = x / (t1.t)[i] ;
00545     }
00546     for (int i=0 ; i<r.get_taille_i(0) ; i++) 
00547       (r.tzri)[i] = x / (t1.tzri)[i] ;
00548     
00549     if (t1.txti != 0x0) for (int i=0 ; i<r.get_taille_i(1) ; i++) 
00550       (r.txti)[i] = x / (t1.txti)[i] ;
00551     
00552     if (t1.typi != 0x0) for (int i=0 ; i<r.get_taille_i(2) ; i++) 
00553       (r.typi)[i] = x / (t1.typi)[i] ;
00554     
00555 
00556   }
00557     
00558   // Termine
00559   return r ;
00560 }
00561 
00562 // int / Tbl_val
00563 // ---------
00564 Tbl_val operator/(int n, const Tbl_val& t1)
00565 {
00566   return double(n) / t1 ;
00567 }
00568 
00569 //*******************//
00570 // operateurs +=,... //
00571 //*******************//
00572 
00573 void Tbl_val::operator+=(const Tbl_val & ti) {
00574 
00575   // Protection
00576   assert(gval == ti.gval) ;
00577   assert(etat != ETATNONDEF) ;
00578   assert(ti.get_etat() != ETATNONDEF) ;
00579     
00580   // Cas particulier
00581   if (ti.get_etat() == ETATZERO) {
00582     return ;
00583   }
00584     
00585   // Cas general
00586   int n = get_taille() ;
00587   switch(etat) {
00588   case ETATZERO:
00589     set_etat_qcq() ;
00590     for (int i=0 ; i<n ; i++) {
00591       t[i] = ti.t[i] ;
00592     }
00593     for (int i=0 ; i < get_taille_i(0) ; i++) 
00594       tzri[i] = ti.tzri[i] ;
00595     
00596     if (ti.txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00597       txti[i] = ti.txti[i] ;
00598     
00599     if (ti.typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00600       typi[i] = ti.typi[i] ;
00601 
00602     break ;
00603     
00604   case ETATQCQ:
00605     for (int i=0 ; i<n ; i++) {
00606       t[i] += ti.t[i] ;
00607     }
00608     for (int i=0 ; i < get_taille_i(0) ; i++) 
00609       tzri[i] += ti.tzri[i] ;
00610     
00611     if (ti.txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00612       txti[i] += ti.txti[i] ;
00613     
00614     if (ti.typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00615       typi[i] += ti.typi[i] ;
00616     break ;
00617     
00618   default:
00619     cout << "etat inconnu " << __FILE__ << endl ;
00620     abort() ;
00621     break ;
00622   }
00623     
00624   // Termine
00625 }
00626 
00627 void Tbl_val::operator+=(double x) {
00628 
00629   // Protection
00630   assert(etat != ETATNONDEF) ;
00631 
00632   // Cas particulier
00633   if ( x == double(0) ) {
00634     return ;
00635   }
00636     
00637   // Cas general
00638   int n = get_taille() ;
00639   switch(etat) {
00640   case ETATZERO:
00641     set_etat_qcq() ;
00642     for (int i=0 ; i<n ; i++) {
00643       t[i] = x ;
00644     }
00645     for (int i=0 ; i < get_taille_i(0) ; i++) 
00646       tzri[i] = x ;
00647     
00648     if (txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00649       txti[i] = x ;
00650     
00651     if (typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00652       typi[i] = x ;
00653     break ;
00654     
00655   case ETATQCQ:
00656     for (int i=0 ; i<n ; i++) {
00657       t[i] += x ;
00658     }
00659     for (int i=0 ; i < get_taille_i(0) ; i++) 
00660       tzri[i] += x ;
00661     
00662     if (txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00663       txti[i] += x ;
00664     
00665     if (typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00666       typi[i] += x ;
00667 
00668     break ;
00669     
00670   default:
00671     cout << "etat inconnu " << __FILE__ << endl ;
00672     abort() ;
00673     break ;
00674   }
00675     
00676   // Termine
00677 }
00678 
00679 void Tbl_val::operator-=(const Tbl_val & ti) {
00680 
00681   // Protection
00682   assert(gval == ti.gval) ;
00683   assert(etat != ETATNONDEF) ;
00684   assert(ti.get_etat() != ETATNONDEF) ;
00685     
00686   // Cas particulier
00687   if (ti.get_etat() == ETATZERO) {
00688     return ;
00689   }
00690     
00691   // Cas general
00692   int n = get_taille() ;
00693   switch(etat) {
00694   case ETATZERO:
00695     set_etat_qcq() ;
00696     for (int i=0 ; i<n ; i++) {
00697       t[i] = - ti.t[i] ;
00698     }
00699     for (int i=0 ; i < get_taille_i(0) ; i++) 
00700       tzri[i] = - ti.tzri[i] ;
00701     
00702     if (ti.txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00703       txti[i] = - ti.txti[i] ;
00704     
00705     if (ti.typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00706       typi[i] = - ti.typi[i] ;
00707 
00708     break ;
00709     
00710   case ETATQCQ:
00711     for (int i=0 ; i<n ; i++) {
00712       t[i] -= ti.t[i] ;
00713     }
00714     for (int i=0 ; i < get_taille_i(0) ; i++) 
00715       tzri[i] -= ti.tzri[i] ;
00716     
00717     if (ti.txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00718       txti[i] -= ti.txti[i] ;
00719     
00720     if (ti.typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00721       typi[i] -= ti.typi[i] ;
00722 
00723     break ;
00724     
00725   default:
00726     cout << "etat inconnu " << __FILE__ << endl ;
00727     abort() ;
00728     break ;
00729   }
00730     
00731   // Termine
00732 }
00733 
00734 void Tbl_val::operator-=(double x) {
00735 
00736   // Protection
00737   assert(etat != ETATNONDEF) ;
00738 
00739   // Cas particulier
00740   if ( x == double(0) ) {
00741     return ;
00742   }
00743     
00744   // Cas general
00745   int n = get_taille() ;
00746   switch(etat) {
00747   case ETATZERO:
00748     set_etat_qcq() ;
00749     for (int i=0 ; i<n ; i++) {
00750       t[i] = - x ;
00751     }
00752     for (int i=0 ; i < get_taille_i(0) ; i++) 
00753       tzri[i] = - x ;
00754     
00755     if (txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00756       txti[i] = - x ;
00757     
00758     if (typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00759       typi[i] = - x ;
00760 
00761     break ;
00762     
00763   case ETATQCQ:
00764     for (int i=0 ; i<n ; i++) {
00765       t[i] -= x ;
00766     }
00767     for (int i=0 ; i < get_taille_i(0) ; i++) 
00768       tzri[i] -= x ;
00769     
00770     if (txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00771       txti[i] -= x ;
00772     
00773     if (typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00774       typi[i] -= x ;
00775 
00776     break ;
00777     
00778   default:
00779     cout << "etat inconnu " << __FILE__ << endl ;
00780     abort() ;
00781     break ;
00782   }
00783     
00784   // Termine
00785 }
00786 
00787 void Tbl_val::operator*=(const Tbl_val & ti) {
00788 
00789   // Protection
00790   assert(gval == ti.gval) ;
00791   assert(etat != ETATNONDEF) ;
00792   assert(ti.get_etat() != ETATNONDEF) ;
00793     
00794   // Cas particulier
00795   if (etat == ETATZERO) {
00796     return ;
00797   }
00798   if (ti.get_etat() == ETATZERO) {
00799     set_etat_zero() ;
00800     return ;
00801   }
00802     
00803   // Cas general
00804   assert(etat == ETATQCQ) ;
00805   for (int i=0 ; i<get_taille() ; i++) {
00806     t[i] *= ti.t[i] ;
00807   }
00808   for (int i=0 ; i < get_taille_i(0) ; i++) 
00809     tzri[i] *= ti.tzri[i] ;
00810     
00811   if (ti.txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00812     txti[i] *= ti.txti[i] ;
00813     
00814   if (ti.typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00815     typi[i] *= ti.typi[i] ;
00816 
00817   // Termine
00818 }
00819 
00820 void Tbl_val::operator*=(double x) {
00821 
00822   // Protection
00823   assert(etat != ETATNONDEF) ;
00824 
00825   // Cas particulier
00826   if ( x == double(0) ) {
00827     set_etat_zero() ;
00828     return ;
00829   }
00830   if (etat == ETATZERO) {
00831     return ;
00832   }
00833     
00834   // Cas general
00835   assert(etat == ETATQCQ) ;
00836   for (int i=0 ; i<get_taille() ; i++) {
00837     t[i] *= x ;
00838   }
00839   for (int i=0 ; i < get_taille_i(0) ; i++) 
00840     tzri[i] *= x ;
00841     
00842   if (txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00843     txti[i] *= x ;
00844     
00845   if (typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00846     typi[i] *= x ;
00847     
00848   // Termine
00849 }
00850 
00851 void Tbl_val::operator/=(const Tbl_val & ti) {
00852 
00853   // Protection
00854   assert(gval == ti.gval) ;
00855   assert(etat != ETATNONDEF) ;
00856   assert(ti.get_etat() != ETATNONDEF) ;
00857     
00858   // Cas particulier
00859   if (ti.get_etat() == ETATZERO) {
00860     cout << "Division by 0 in Tbl_val::operator/=(const Tbl_val &) !" << endl ;
00861     abort() ;
00862   }
00863   if (etat == ETATZERO) {
00864     return ;
00865   }
00866     
00867   // Cas general
00868   assert(etat == ETATQCQ) ;
00869   assert(ti.get_etat() == ETATQCQ) ;
00870   int n = get_taille() ;
00871   for (int i=0 ; i<n ; i++) {
00872     t[i] /= ti.t[i] ;
00873   }
00874   for (int i=0 ; i < get_taille_i(0) ; i++) 
00875     tzri[i] /= ti.tzri[i] ;
00876     
00877   if (ti.txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00878     txti[i] /= ti.txti[i] ;
00879     
00880   if (ti.typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00881     typi[i] /= ti.typi[i] ;
00882 
00883   // Termine
00884 }
00885 
00886 void Tbl_val::operator/=(double x) {
00887 
00888   // Protection
00889   assert(etat != ETATNONDEF) ;
00890 
00891   // Cas particulier
00892   if ( x == double(0) ) {
00893     cout << "Division by 0 in Tbl_val::operator/=(double ) !" << endl ;
00894     abort() ;
00895   }
00896   if (etat == ETATZERO) {
00897     return ;
00898   }
00899     
00900   // Cas general
00901   assert(etat == ETATQCQ) ;
00902   int n = get_taille() ;
00903   for (int i=0 ; i<n ; i++) {
00904     t[i] /= x ;
00905   }
00906   for (int i=0 ; i < get_taille_i(0) ; i++) 
00907     tzri[i] /= x ;
00908     
00909   if (txti != 0x0) for (int i=0 ; i < get_taille_i(1) ; i++) 
00910     txti[i] /= x ;
00911     
00912   if (typi != 0x0) for (int i=0 ; i < get_taille_i(2) ; i++) 
00913     typi[i] /= x ;
00914 
00915   // Termine
00916 }
00917 

Generated on Tue Feb 7 01:35:14 2012 for LORENE by  doxygen 1.4.6