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 char tbl_C[] = "$Header: /cvsroot/Lorene/C++/Source/Tbl/tbl.C,v 1.9 2008/02/18 13:53:47 j_novak Exp $" ;
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
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 #include <math.h>
00122
00123
00124 #include "itbl.h"
00125 #include "tbl.h"
00126 #include "grilles.h"
00127 #include "matrice.h"
00128 #include "utilitaires.h"
00129
00130
00131
00132
00133
00134
00135
00136
00137 Tbl::Tbl(int n1) : etat(ETATNONDEF), dim(n1), t(0x0) {}
00138
00139
00140 Tbl::Tbl(int n1, int n0) : etat(ETATNONDEF), dim(n1, n0), t(0x0) {}
00141
00142
00143 Tbl::Tbl(int n2, int n1, int n0) : etat(ETATNONDEF), dim(n2, n1, n0), t(0x0) {}
00144
00145
00146 Tbl::Tbl(const Grille3d& g) : etat(ETATNONDEF),
00147 dim(g.get_np(), g.get_nt(), g.get_nr()),
00148 t(0x0) {}
00149
00150
00151 Tbl::Tbl(Itbl sizes) : etat(ETATNONDEF),
00152 dim(1),
00153 t(0x0) {
00154
00155 int n = sizes.get_dim(0) ;
00156 int* dims = new int[n] ;
00157 for (int i=0 ; i<n ; i++)
00158 dims[i] = sizes(i) ;
00159 Dim_tbl new_dim (n, dims) ;
00160 dim = new_dim ;
00161 delete [] dims ;
00162 }
00163
00164
00165 Tbl::Tbl(const Dim_tbl& dt) : etat(ETATNONDEF), dim(dt), t(0x0) {}
00166
00167
00168 Tbl::Tbl(const Tbl& tc) : etat(tc.etat), dim(tc.dim) {
00169
00170
00171 if (tc.etat == ETATQCQ) {
00172 int n = dim.taille ;
00173 t = new double[n] ;
00174 double* tin = tc.t ;
00175 double* tout = t ;
00176 for (int i=0 ; i<n ; i++) {
00177 *tout = *tin ;
00178 tout++ ; tin++ ;
00179 }
00180 }
00181 else{
00182 t = 0x0 ;
00183 }
00184
00185 }
00186
00187
00188 Tbl::Tbl(FILE* fd) : dim(fd) {
00189
00190 fread_be(&etat, sizeof(int), 1, fd) ;
00191
00192
00193 if (etat == ETATQCQ) {
00194 t = new double[get_taille()] ;
00195 fread_be(t, sizeof(double), get_taille(), fd) ;
00196 }
00197 else{
00198 t = 0x0 ;
00199 }
00200 }
00201
00202
00203 Tbl::Tbl(const Matrice& aa) : etat(aa.get_etat()),
00204 dim( (aa.get_array()).dim ) {
00205
00206 int nbl = dim.dim[1] ;
00207 int nbc = dim.dim[0] ;
00208
00209
00210 if (nbl == 1) {
00211 dim.ndim = 1 ;
00212 }
00213
00214
00215 if (nbc == 1) {
00216 dim.ndim = 1 ;
00217 dim.dim[0] = dim.dim[1] ;
00218 dim.dim[1] = 1 ;
00219 }
00220
00221 if (etat == ETATQCQ) {
00222
00223 t = new double[get_taille()] ;
00224
00225 Tbl taa = aa.get_array() ;
00226 double* ta = taa.t ;
00227
00228 for (int i=0 ; i<get_taille() ; i++) {
00229 t[i] = ta[i] ;
00230 }
00231
00232 }
00233 else{
00234 t = 0x0 ;
00235 }
00236
00237 }
00238
00239
00240
00241
00242
00243 Tbl::~Tbl() {
00244 delete [] t ;
00245 }
00246
00247
00248
00249
00250
00251
00252 void Tbl::operator=(const Tbl& tx)
00253 {
00254
00255 assert( dim == tx.dim ) ;
00256 assert(tx.get_etat() != ETATNONDEF) ;
00257
00258 switch (tx.etat) {
00259 case ETATZERO:
00260 set_etat_zero() ;
00261 break ;
00262
00263 case ETATQCQ: {
00264 set_etat_qcq() ;
00265 int n = get_taille() ;
00266 double* tin = tx.t ;
00267 double* tout = t ;
00268 for (int i=0 ; i<n ; i++) {
00269 *tout = *tin ;
00270 tout++ ;
00271 tin ++ ;
00272 }
00273 break ;
00274 }
00275 default:
00276 cout << "Erreur bizarre !" << endl ;
00277 abort() ;
00278 break ;
00279 }
00280 }
00281
00282
00283 void Tbl::operator=(double a)
00284 {
00285 if ( a == double(0) ) {
00286 set_etat_zero() ;
00287 }
00288 else {
00289 int n = get_taille() ;
00290 set_etat_qcq() ;
00291 for (int i=0 ; i<n ; i++) {
00292 t[i] = a ;
00293 }
00294 }
00295 }
00296
00297
00298 void Tbl::operator=(int m)
00299 {
00300 if (m == 0) {
00301 set_etat_zero() ;
00302 }
00303 else {
00304 int n = get_taille() ;
00305 set_etat_qcq() ;
00306 for (int i=0 ; i<n ; i++) {
00307 t[i] = m ;
00308 }
00309 }
00310 }
00311
00312
00313
00314
00315
00316
00317
00318
00319 void Tbl::sauve(FILE* fd) const {
00320
00321 dim.sauve(fd) ;
00322 fwrite_be(&etat, sizeof(int), 1, fd) ;
00323 if (etat == ETATQCQ) {
00324 fwrite_be(t, sizeof(double), get_taille(), fd) ;
00325 }
00326 }
00327
00328
00329
00330
00331
00332
00333 void Tbl::del_t() {
00334 delete [] t ;
00335 t = 0x0 ;
00336 etat = ETATNONDEF ;
00337 }
00338
00339
00340 void Tbl::set_etat_zero() {
00341 if (etat == ETATZERO) return ;
00342 del_t() ;
00343 etat = ETATZERO ;
00344 }
00345
00346
00347 void Tbl::set_etat_nondef() {
00348 if (etat == ETATNONDEF) return ;
00349 del_t() ;
00350 etat = ETATNONDEF ;
00351 }
00352
00353
00354 void Tbl::set_etat_qcq() {
00355 if (etat == ETATQCQ) return ;
00356
00357
00358 assert( (etat == ETATZERO) || (etat == ETATNONDEF) ) ;
00359
00360 t = new double[get_taille()] ;
00361 etat = ETATQCQ ;
00362 }
00363
00364
00365 void Tbl::annule_hard() {
00366 if (t == 0x0) {
00367 t = new double[get_taille()] ;
00368 }
00369 for (int i=0 ; i<get_taille() ; i++) {
00370 t[i] = 0. ;
00371 }
00372 etat = ETATQCQ ;
00373 }
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 ostream& operator<<(ostream& o, const Tbl& t) {
00385
00386 int ndim = t.get_ndim() ;
00387 o.precision(4);
00388 o.setf(ios::showpoint);
00389 o << "*** Tbl " << ndim << "D" << " size: " ;
00390 for (int i = 0; i<ndim-1; i++) {
00391 o << t.get_dim(i) << " x " ;
00392 }
00393 o << t.get_dim(ndim-1) << " = " << t.get_taille()
00394 << endl ;
00395
00396
00397 if (t.get_etat() == ETATZERO) {
00398 o << "Identically ZERO" << endl ;
00399 return o ;
00400 }
00401
00402 if (t.get_etat() == ETATNONDEF) {
00403 o << "UNDEFINED STATE" << endl ;
00404 return o ;
00405 }
00406
00407 assert(t.etat == ETATQCQ) ;
00408 switch (ndim) {
00409
00410 case 1 : {
00411 for (int i=0 ; i<t.get_dim(0) ; i++) {
00412 o << " " << t(i) ;
00413 }
00414 o << endl ;
00415 break ;
00416 }
00417
00418
00419 case 2 : {
00420 for (int j=0 ; j<t.get_dim(1) ; j++) {
00421 o << " j = " << j << " : " << endl ;
00422 for (int i=0 ; i<t.get_dim(0) ; i++) {
00423 o << " " << t(j, i) ;
00424 }
00425 o << endl ;
00426 }
00427 o << endl ;
00428 break ;
00429 }
00430
00431 case 3 : {
00432 for (int k=0 ; k<t.get_dim(2) ; k++) {
00433 o << "k = " << k << " : " << endl ;
00434 for (int j=0 ; j<t.get_dim(1) ; j++) {
00435 o << "j = " << j << " : " ;
00436 for (int i=0 ; i<t.get_dim(0) ; i++) {
00437 o << " " << t(k, j, i) ;
00438 }
00439 o << endl ;
00440 }
00441 o << endl ;
00442 }
00443 o << endl ;
00444 break ;
00445 }
00446
00447 default : {
00448 cout << "operator<< Tbl : unexpected dimension !" << endl ;
00449 cout << " ndim = " << ndim << endl ;
00450 abort() ;
00451 break ;
00452 }
00453 }
00454 return o ;
00455 }
00456
00457
00458
00459
00460
00461 void Tbl::affiche_seuil(ostream& ost, int precis, double seuil) const {
00462
00463 int ndim = get_ndim() ;
00464 ost << "*** Tbl " << ndim << "D" << " size: " ;
00465 for (int i = 0; i<ndim-1; i++) {
00466 ost << get_dim(i) << " x " ;
00467 }
00468 ost << get_dim(ndim-1) << " = " << get_taille() << endl ;
00469
00470
00471
00472
00473 if (etat == ETATNONDEF) {
00474 ost << " state: UNDEFINED" << endl ;
00475 return ;
00476 }
00477
00478 if (etat == ETATZERO) {
00479 ost << " state: ZERO" << endl ;
00480 return ;
00481 }
00482
00483
00484
00485
00486 ost << " threshold for display : " << seuil << endl ;
00487 ost.precision(precis);
00488 ost.setf(ios::showpoint);
00489
00490 switch (get_ndim()) {
00491 case 1 : {
00492
00493 for (int i=0; i<get_dim(0); i++) {
00494 ost << " " << setw(precis) << (*this)(i) ;
00495 }
00496 ost << endl ;
00497 break ;
00498 }
00499
00500 case 2 : {
00501
00502 for (int j=0; j<get_dim(1); j++) {
00503 ost << " #j=" << j << " : " ;
00504 for (int i=0; i<get_dim(0); i++){
00505 ost << " " << setw(precis) << (*this)(j, i) ;
00506 }
00507 ost << endl;
00508 }
00509 ost << endl;
00510 break;
00511 }
00512
00513 case 3 : {
00514 for (int k=0; k<get_dim(2); k++) {
00515 for (int j=0; j<get_dim(1); j++){
00516 int test_imp = 0 ;
00517 for (int i=0; i<get_dim(0); i++){
00518 if ( fabs( (*this)(k, j, i) ) >= seuil )
00519 test_imp = 1 ;
00520 }
00521 if (test_imp == 1 ) {
00522 ost << " #k=" << k <<",j=" << j << " : " ;
00523 for (int i=0; i<get_dim(0); i++){
00524 ost << " " << setw(precis) << (*this)(k, j, i) ;
00525 }
00526 ost << endl ;
00527 }
00528 }
00529 }
00530 ost << endl;
00531 break;
00532 }
00533
00534 default : {
00535 cout << "Tbl:affiche_seuil : unexpected dimension !" << endl ;
00536 cout << " get_ndim() = " << get_ndim() << endl ;
00537 abort() ;
00538 break;
00539 }
00540
00541 }
00542
00543
00544 ost.precision(6);
00545 ost.unsetf(ios::showpoint);
00546 }
00547
00548
00549