mtbl_arithm.C

00001 /*
00002  *  Arithmetical operations for class Mtbl
00003  *
00004  */
00005 
00006 /*
00007  *   Copyright (c) 1999-2000 Jean-Alain Marck
00008  *   Copyright (c) 1999-2001 Eric Gourgoulhon
00009  *
00010  *   This file is part of LORENE.
00011  *
00012  *   LORENE is free software; you can redistribute it and/or modify
00013  *   it under the terms of the GNU General Public License as published by
00014  *   the Free Software Foundation; either version 2 of the License, or
00015  *   (at your option) any later version.
00016  *
00017  *   LORENE is distributed in the hope that it will be useful,
00018  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020  *   GNU General Public License for more details.
00021  *
00022  *   You should have received a copy of the GNU General Public License
00023  *   along with LORENE; if not, write to the Free Software
00024  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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  * $Id: mtbl_arithm.C,v 1.1.1.1 2001/11/20 15:19:27 e_gourgoulhon Exp $
00033  * $Log: mtbl_arithm.C,v $
00034  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00035  * LORENE
00036  *
00037  * Revision 2.8  2000/09/27  14:21:12  eric
00038  * Multiplication par un double : on met le resultat a ETATZERO si
00039  *   x == 0
00040  *
00041  * Revision 2.7  2000/08/16  10:30:14  eric
00042  * Suppression du membre dzpuis.
00043  *
00044  * Revision 2.6  1999/10/26  08:08:25  eric
00045  * Ajout de protection dzpuis dans +=, -=
00046  *
00047  * Revision 2.5  1999/10/18  15:07:22  eric
00048  * La fonction membre annule() est rebaptisee annule_hard().
00049  *
00050  * Revision 2.4  1999/10/15  13:58:04  eric
00051  * L'arithmetique liee aux Coord's se trouve desormais dans le fichier
00052  *   arithm_coord.C.
00053  *
00054  * Revision 2.3  1999/10/01  10:09:01  eric
00055  * Changement prototypes.
00056  * Correction erreurs lorsque etat=ETATZERO
00057  *
00058  * Revision 2.2  1999/04/26  17:12:26  phil
00059  * ajout de Coord * Mtbl
00060  *
00061  * Revision 2.1  1999/02/22  15:50:22  hyc
00062  * *** empty log message ***
00063  *
00064  * Revision 2.0  1999/02/15  10:42:45  hyc
00065  * *** empty log message ***
00066  *
00067  * Revision 2.1  1999/02/15  09:59:50  hyc
00068  * *** empty log message ***
00069  *
00070  * Revision 2.0  1999/01/15  09:10:39  hyc
00071  * *** empty log message ***
00072  *
00073  *
00074  * $Header: /cvsroot/Lorene/C++/Source/Mtbl/mtbl_arithm.C,v 1.1.1.1 2001/11/20 15:19:27 e_gourgoulhon Exp $
00075  *
00076  */
00077 
00078 // Headers Lorene
00079 #include "mtbl.h"
00080 #include "coord.h"
00081 
00082             //********************//
00083             // OPERATEURS UNAIRES //
00084             //********************//
00085 
00086 // + Mtbl
00087 // ------
00088 Mtbl operator+(const Mtbl& t1)      // + Mtbl
00089 {
00090     // Protection
00091     assert(t1.get_etat() != ETATNONDEF) ;
00092     
00093     return t1 ;
00094 }
00095 
00096 // - Mtbl
00097 // ------
00098 Mtbl operator-(const Mtbl& t1)      // - Mtbl
00099 {
00100 
00101     // Protection
00102     assert(t1.get_etat() != ETATNONDEF) ;
00103     
00104     // Cas particulier
00105     if (t1.get_etat() == ETATZERO) {
00106     return t1 ;
00107     }
00108     
00109     // Cas general
00110     assert(t1.get_etat() == ETATQCQ) ;  // sinon...
00111     Mtbl r(t1) ;    // Mtbl resultat
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             // ADDITION //
00121             //**********//
00122 
00123 // Mtbl + Mtbl
00124 // -----------
00125 Mtbl operator+(const Mtbl& t1, const Mtbl& t2)      // Mtbl + Mtbl
00126 {
00127     // Protection
00128     assert(t1.get_etat() != ETATNONDEF) ;
00129     assert(t2.get_etat() != ETATNONDEF) ;
00130     assert(t1.get_mg() == t2.get_mg()) ;
00131     
00132     // Cas particulier
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) ;  // sinon...
00140     assert(t2.get_etat() == ETATQCQ) ;  // sinon...
00141 
00142     // Cas general
00143     int nz = t1.get_nzone() ;
00144 
00145     Mtbl r(t1) ;    // Mtbl resultat
00146 
00147     for (int i=0 ; i<nz ; i++) {
00148     *(r.t)[i] += *(t2.t)[i] ;
00149     }
00150 
00151     return r ;
00152 }
00153 
00154 // Mtbl + double
00155 // -------------
00156 Mtbl operator+(const Mtbl& t1, double x)        // Mtbl + double
00157 {
00158     // Protection
00159     assert(t1.get_etat() != ETATNONDEF) ;
00160 
00161     // Cas particulier
00162     if (x == double(0)) {
00163     return t1 ;
00164     }
00165 
00166     int nz = t1.get_nzone() ;
00167 
00168 
00169     Mtbl r(t1) ;    // Mtbl resultat
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 // double + Mtbl
00190 // -------------
00191 Mtbl operator+(double x, const Mtbl& t1)        // double + Mtbl
00192 {
00193     return t1 + x ;
00194 }
00195 
00196 // Mtbl + int
00197 // ----------
00198 Mtbl operator+(const Mtbl& t1, int m)       // Mtbl + int
00199 {
00200     return t1 + double(m) ;
00201 }
00202 
00203 // int + Mtbl
00204 // ----------
00205 Mtbl operator+(int m, const Mtbl& t1)       // int + Mtbl
00206 {
00207     return t1 + double(m) ;
00208 }
00209 
00210 
00211             //**************//
00212             // SOUSTRACTION //
00213             //**************//
00214 
00215 // Mtbl - Mtbl
00216 // -----------
00217 Mtbl operator-(const Mtbl& t1, const Mtbl& t2)      // Mtbl - Mtbl
00218 {
00219     // Protection
00220     assert(t1.get_etat() != ETATNONDEF) ;
00221     assert(t2.get_etat() != ETATNONDEF) ;
00222     assert(t1.get_mg() == t2.get_mg()) ;
00223     
00224     // Cas particulier
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) ;  // sinon...
00232     assert(t2.get_etat() == ETATQCQ) ;  // sinon...
00233 
00234     // Cas general
00235     int nz = t1.get_nzone() ;
00236 
00237     Mtbl r(t1) ;    // Mtbl resultat
00238 
00239     for (int i=0 ; i<nz ; i++) {
00240     *(r.t)[i] -= *(t2.t)[i] ;
00241     }
00242 
00243     return r ;
00244 }
00245 
00246 // Mtbl - double
00247 // -------------
00248 Mtbl operator-(const Mtbl& t1, double x)        // Mtbl - double
00249 {
00250 
00251     // Protection
00252     assert(t1.get_etat() != ETATNONDEF) ;
00253 
00254     // Cas particulier
00255     if (x == double(0)) {
00256     return t1 ;
00257     }
00258     
00259     // Cas general
00260     int nz = t1.get_nzone() ;
00261 
00262     Mtbl r(t1) ;    // Mtbl resultat
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 // double - Mtbl
00283 // -------------
00284 Mtbl operator-(double x, const Mtbl& t1)        // double - Mtbl
00285 {
00286     return - (t1 -x) ;
00287 }
00288 
00289 // Mtbl - int
00290 // ----------
00291 Mtbl operator-(const Mtbl& t1, int m)       // Mtbl - int
00292 {
00293     return t1 - double(m) ;
00294 }
00295 
00296 // int - Mtbl
00297 // ----------
00298 Mtbl operator-(int m, const Mtbl& t1)       // int - Mtbl
00299 {
00300     return double(m) - t1 ;
00301 }
00302 
00303             //****************//
00304             // MULTIPLICATION //
00305             //****************//
00306 
00307 // Mtbl * Mtbl
00308 // -----------
00309 Mtbl operator*(const Mtbl& t1, const Mtbl& t2)      // Mtbl * Mtbl
00310 {
00311     // Protection
00312     assert(t1.get_etat() != ETATNONDEF) ;
00313     assert(t2.get_etat() != ETATNONDEF) ;
00314     assert(t1.get_mg() == t2.get_mg()) ;
00315 
00316     // Cas particulier
00317     if (t1.get_etat() == ETATZERO) {
00318     return t1 ;
00319     }
00320     if (t2.get_etat() == ETATZERO) {
00321     return t2 ;
00322     }
00323     
00324     // Cas general
00325     assert(t1.get_etat() == ETATQCQ) ;  // sinon...
00326     assert(t2.get_etat() == ETATQCQ) ;  // sinon...
00327 
00328     Mtbl r(t1) ;    // Mtbl resultat
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 // Mtbl * double
00339 // -------------
00340 Mtbl operator*(const Mtbl& t1, double x)        // Mtbl * double
00341 {
00342 
00343     // Protection
00344     assert(t1.get_etat() != ETATNONDEF) ;
00345 
00346     // Cas particulier
00347     if ((t1.get_etat() == ETATZERO) || ( x == double(1) )) {
00348     return t1 ;
00349     }
00350 
00351     // Cas general
00352     assert(t1.get_etat() == ETATQCQ) ;  // sinon...
00353 
00354     Mtbl r(t1) ;    // Mtbl resultat
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 // double * Mtbl
00370 // -------------
00371 Mtbl operator*(double x, const Mtbl& t1)        // double * Mtbl
00372 {
00373     return t1 * x ;
00374 }
00375 
00376 // Mtbl * int
00377 // ----------
00378 Mtbl operator*(const Mtbl& t1, int m)       // Mtbl * int
00379 {
00380     return t1 * double(m) ;
00381 }
00382 
00383 // int * Mtbl
00384 // ----------
00385 Mtbl operator*(int m, const Mtbl& t1)       // int * Mtbl
00386 {
00387     return t1 * double(m) ;
00388 }
00389 
00390             //**********//
00391             // DIVISION //
00392             //**********//
00393 
00394 // Mtbl / Mtbl
00395 // -----------
00396 Mtbl operator/(const Mtbl& t1, const Mtbl& t2)      // Mtbl / Mtbl
00397 {
00398 
00399     // Protection
00400     assert(t1.get_etat() != ETATNONDEF) ;
00401     assert(t2.get_etat() != ETATNONDEF) ;
00402     assert(t1.get_mg() == t2.get_mg()) ;
00403 
00404     // Cas particuliers
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     // Cas general
00414     assert(t1.get_etat() == ETATQCQ) ;  // sinon...
00415     assert(t2.get_etat() == ETATQCQ) ;  // sinon...
00416     
00417     Mtbl r(t1) ;    // Mtbl resultat
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 // Mtbl / double
00428 // -------------
00429 Mtbl operator/(const Mtbl& t1, double x)        // Mtbl / double
00430 {
00431 
00432     // Protection
00433     assert(t1.get_etat() != ETATNONDEF) ;
00434     if ( x == double(0) ) {
00435     cout << "Mtbl division by 0 !" << endl ;
00436     abort() ;
00437     }
00438     
00439     // Cas particulier
00440     if ((t1.get_etat() == ETATZERO) || ( x == double(1) )) {
00441     return t1 ;
00442     }
00443     
00444     // Cas general
00445     assert(t1.get_etat() == ETATQCQ) ;  // sinon...
00446 
00447     Mtbl r(t1) ;    // Mtbl resultat
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 // Mtbl / int
00457 // ----------
00458 Mtbl operator/(const Mtbl& t1, int n)       // Mtbl / int
00459 {
00460     return t1/double(n) ;
00461 }
00462 
00463 // double / Mtbl
00464 // -------------
00465 Mtbl operator/(double x, const Mtbl& t1)        // double / Mtbl
00466 {
00467 
00468     // Protection
00469     assert(t1.get_etat() != ETATNONDEF) ;
00470 
00471     // Cas particuliers
00472     if (t1.get_etat() == ETATZERO) {
00473     cout << "Division by 0 in double / Mtbl !" << endl ;
00474     abort() ; 
00475     }
00476 
00477     // Cas general
00478     assert(t1.get_etat() == ETATQCQ) ;  // sinon...
00479 
00480     Mtbl r( *(t1.get_mg()) ) ;  // Mtbl resultat, a priori NONDEF
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     // Termine
00494     return r ;
00495 }
00496 
00497 // int / Mtbl
00498 // ----------
00499 Mtbl operator/(int m, const Mtbl& t1)       // int / Mtbl
00500 {
00501     return double(m)/t1 ;
00502 }
00503 
00504 
00505             //*******************//
00506             // operateurs +=,... //
00507             //*******************//
00508 
00509 void Mtbl::operator+=(const Mtbl & mi) {
00510     
00511     // Protection
00512     assert(mg == mi.get_mg()) ;         // meme grille
00513     assert(etat != ETATNONDEF) ;        // etat defini
00514     assert(mi.get_etat() != ETATNONDEF) ;   // etat defini
00515     
00516     // Cas particulier
00517     if (mi.get_etat() == ETATZERO) {
00518     return ;
00519     }
00520     
00521     // Cas general
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     // Protection
00534     assert(mg == mi.get_mg()) ;         // meme grille
00535     assert(etat != ETATNONDEF) ;        // etat defini
00536     assert(mi.get_etat() != ETATNONDEF) ;   // etat defini
00537     
00538     // Cas particulier
00539     if (mi.get_etat() == ETATZERO) {
00540     return ;
00541     }
00542     
00543     // Cas general
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     // Protection
00556     assert(mg == mi.get_mg()) ;         // meme grille
00557     assert(etat != ETATNONDEF) ;        // etat defini
00558     assert(mi.get_etat() != ETATNONDEF) ;   // etat defini
00559     
00560     // Cas particuliers
00561     if (etat == ETATZERO) {
00562     return ;
00563     }
00564     if (mi.get_etat() == ETATZERO) {
00565     set_etat_zero() ;
00566     return ;
00567     }
00568     
00569     // Cas general
00570     for (int i=0 ; i<nzone ; i++) {
00571     *(t[i]) *= *(mi.t[i]) ;
00572     }
00573 
00574 }

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