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 char valeur_math_C[] = "$Header: /cvsroot/Lorene/C++/Source/Valeur/valeur_math.C,v 1.3 2012/01/17 10:39:27 j_penner Exp $" ;
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 #include <math.h>
00068 #include <stdlib.h>
00069
00070 #include "valeur.h"
00071
00072
00073
00074
00075
00076
00077 Valeur sin(const Valeur& ti)
00078 {
00079
00080 assert(ti.get_etat() != ETATNONDEF) ;
00081
00082
00083 if (ti.get_etat() == ETATZERO) {
00084 return ti ;
00085 }
00086
00087
00088 assert(ti.get_etat() == ETATQCQ) ;
00089 if (ti.c == 0x0) {
00090 ti.coef_i() ;
00091 }
00092 Valeur to(ti.get_mg()) ;
00093 to.set_etat_c_qcq() ;
00094 *(to.c) = sin( *(ti.c) ) ;
00095 return to ;
00096 }
00097
00098
00099
00100
00101
00102 Valeur cos(const Valeur& ti)
00103 {
00104
00105 assert(ti.get_etat() != ETATNONDEF) ;
00106
00107 Valeur to(ti.get_mg()) ;
00108 to.set_etat_c_qcq() ;
00109
00110
00111 if (ti.get_etat() == ETATZERO) {
00112 *(to.c) = 1. ;
00113 return to ;
00114 }
00115
00116
00117 assert(ti.get_etat() == ETATQCQ) ;
00118 if (ti.c == 0x0) {
00119 ti.coef_i() ;
00120 }
00121 *(to.c) = cos( *(ti.c) ) ;
00122 return to ;
00123 }
00124
00125
00126
00127
00128
00129 Valeur tan(const Valeur& ti)
00130 {
00131
00132 assert(ti.get_etat() != ETATNONDEF) ;
00133
00134
00135 if (ti.get_etat() == ETATZERO) {
00136 return ti ;
00137 }
00138
00139
00140 assert(ti.get_etat() == ETATQCQ) ;
00141 if (ti.c == 0x0) {
00142 ti.coef_i() ;
00143 }
00144 Valeur to(ti.get_mg()) ;
00145 to.set_etat_c_qcq() ;
00146 *(to.c) = tan( *(ti.c) ) ;
00147 return to ;
00148 }
00149
00150
00151
00152
00153
00154 Valeur asin(const Valeur& ti)
00155 {
00156
00157 assert(ti.get_etat() != ETATNONDEF) ;
00158
00159
00160 if (ti.get_etat() == ETATZERO) {
00161 return ti ;
00162 }
00163
00164
00165 assert(ti.get_etat() == ETATQCQ) ;
00166 if (ti.c == 0x0) {
00167 ti.coef_i() ;
00168 }
00169 Valeur to(ti.get_mg()) ;
00170 to.set_etat_c_qcq() ;
00171 *(to.c) = asin( *(ti.c) ) ;
00172 return to ;
00173 }
00174
00175
00176
00177
00178
00179 Valeur acos(const Valeur& ti)
00180 {
00181
00182 assert(ti.get_etat() != ETATNONDEF) ;
00183
00184 Valeur to(ti.get_mg()) ;
00185 to.set_etat_c_qcq() ;
00186
00187
00188 if (ti.get_etat() == ETATZERO) {
00189 *(to.c) = M_PI * .5 ;
00190 return to ;
00191 }
00192
00193
00194 assert(ti.get_etat() == ETATQCQ) ;
00195 if (ti.c == 0x0) {
00196 ti.coef_i() ;
00197 }
00198 *(to.c) = acos( *(ti.c) ) ;
00199 return to ;
00200 }
00201
00202
00203
00204
00205
00206 Valeur atan(const Valeur& ti)
00207 {
00208
00209 assert(ti.get_etat() != ETATNONDEF) ;
00210
00211
00212 if (ti.get_etat() == ETATZERO) {
00213 return ti ;
00214 }
00215
00216
00217 assert(ti.get_etat() == ETATQCQ) ;
00218 if (ti.c == 0x0) {
00219 ti.coef_i() ;
00220 }
00221 Valeur to(ti.get_mg()) ;
00222 to.set_etat_c_qcq() ;
00223 *(to.c) = atan( *(ti.c) ) ;
00224 return to ;
00225 }
00226
00227
00228
00229
00230
00231 Valeur sqrt(const Valeur& ti)
00232 {
00233
00234 assert(ti.get_etat() != ETATNONDEF) ;
00235
00236
00237 if (ti.get_etat() == ETATZERO) {
00238 return ti ;
00239 }
00240
00241
00242 assert(ti.get_etat() == ETATQCQ) ;
00243 if (ti.c == 0x0) {
00244 ti.coef_i() ;
00245 }
00246 Valeur to(ti.get_mg()) ;
00247 to.set_etat_c_qcq() ;
00248 *(to.c) = sqrt( *(ti.c) ) ;
00249 return to ;
00250 }
00251
00252
00253
00254
00255
00256 Valeur exp(const Valeur& ti)
00257 {
00258
00259 assert(ti.get_etat() != ETATNONDEF) ;
00260
00261 Valeur to(ti.get_mg()) ;
00262 to.set_etat_c_qcq() ;
00263
00264
00265 if (ti.get_etat() == ETATZERO) {
00266 *(to.c) = 1. ;
00267 return to ;
00268 }
00269
00270
00271 assert(ti.get_etat() == ETATQCQ) ;
00272 if (ti.c == 0x0) {
00273 ti.coef_i() ;
00274 }
00275 *(to.c) = exp( *(ti.c) ) ;
00276 return to ;
00277 }
00278
00279
00280
00281
00282
00283 Valeur Heaviside(const Valeur& ti)
00284 {
00285
00286 assert(ti.get_etat() != ETATNONDEF) ;
00287
00288 Valeur to(ti.get_mg()) ;
00289 to.set_etat_c_qcq() ;
00290
00291
00292 if (ti.get_etat() == ETATZERO) {
00293 *(to.c) = 0. ;
00294 return to ;
00295 }
00296
00297
00298 assert(ti.get_etat() == ETATQCQ) ;
00299 if (ti.c == 0x0) {
00300 ti.coef_i() ;
00301 }
00302
00303 *(to.c) = Heaviside( *(ti.c) ) ;
00304
00305 return to ;
00306 }
00307
00308
00309
00310
00311
00312 Valeur log(const Valeur& ti)
00313 {
00314
00315 assert(ti.get_etat() != ETATNONDEF) ;
00316
00317
00318 if (ti.get_etat() == ETATZERO) {
00319 cout << "Valeur log: log(ETATZERO) !" << endl ;
00320 abort () ;
00321 }
00322
00323
00324 assert(ti.get_etat() == ETATQCQ) ;
00325 if (ti.c == 0x0) {
00326 ti.coef_i() ;
00327 }
00328 Valeur to(ti.get_mg()) ;
00329 to.set_etat_c_qcq() ;
00330 *(to.c) = log( *(ti.c) ) ;
00331 return to ;
00332 }
00333
00334
00335
00336
00337
00338 Valeur log10(const Valeur& ti)
00339 {
00340
00341 assert(ti.get_etat() != ETATNONDEF) ;
00342
00343
00344 if (ti.get_etat() == ETATZERO) {
00345 cout << "Valeur log10: log10(ETATZERO) !" << endl ;
00346 abort () ;
00347 }
00348
00349
00350 assert(ti.get_etat() == ETATQCQ) ;
00351 if (ti.c == 0x0) {
00352 ti.coef_i() ;
00353 }
00354 Valeur to(ti.get_mg()) ;
00355 to.set_etat_c_qcq() ;
00356 *(to.c) = log10( *(ti.c) ) ;
00357 return to ;
00358 }
00359
00360
00361
00362
00363
00364 Valeur pow(const Valeur& ti, int n)
00365 {
00366
00367 assert(ti.get_etat() != ETATNONDEF) ;
00368
00369
00370 if (ti.get_etat() == ETATZERO) {
00371 if (n > 0) {
00372 return ti ;
00373 }
00374 else {
00375 cout << "Valeur pow: ETATZERO^n with n<=0 ! "<< endl ;
00376 abort () ;
00377 }
00378 }
00379
00380
00381 assert(ti.get_etat() == ETATQCQ) ;
00382 if (ti.c == 0x0) {
00383 ti.coef_i() ;
00384 }
00385 Valeur to(ti.get_mg()) ;
00386 to.set_etat_c_qcq() ;
00387 double x = n ;
00388 *(to.c) = pow( *(ti.c), x ) ;
00389 return to ;
00390 }
00391
00392
00393
00394
00395
00396 Valeur pow(const Valeur& ti, double x)
00397 {
00398
00399 assert(ti.get_etat() != ETATNONDEF) ;
00400
00401
00402 if (ti.get_etat() == ETATZERO) {
00403 if (x > 0) {
00404 return ti ;
00405 }
00406 else {
00407 cout << "Valeur pow: ETATZERO^x with x<=0 !" << endl ;
00408 abort () ;
00409 }
00410 }
00411
00412
00413 assert(ti.get_etat() == ETATQCQ) ;
00414 if (ti.c == 0x0) {
00415 ti.coef_i() ;
00416 }
00417 Valeur to(ti.get_mg()) ;
00418 to.set_etat_c_qcq() ;
00419 *(to.c) = pow( *(ti.c), x ) ;
00420 return to ;
00421 }
00422
00423
00424
00425
00426
00427 Valeur abs(const Valeur& vi)
00428 {
00429
00430 assert(vi.get_etat() != ETATNONDEF) ;
00431
00432
00433 if (vi.get_etat() == ETATZERO) {
00434 return vi ;
00435 }
00436
00437
00438
00439 assert(vi.get_etat() == ETATQCQ) ;
00440 if (vi.c == 0x0) {
00441 vi.coef_i() ;
00442 }
00443
00444 Valeur vo(vi.get_mg()) ;
00445
00446 vo.set_etat_c_qcq() ;
00447
00448 *(vo.c) = abs( *(vi.c) ) ;
00449
00450 return vo ;
00451 }
00452
00453
00454
00455
00456 Valeur racine_cubique(const Valeur& vi)
00457 {
00458
00459 assert(vi.get_etat() != ETATNONDEF) ;
00460
00461
00462 if (vi.get_etat() == ETATZERO) {
00463 return vi ;
00464 }
00465
00466
00467 assert(vi.get_etat() == ETATQCQ) ;
00468 if (vi.c == 0x0) {
00469 vi.coef_i() ;
00470 }
00471 Valeur vo(vi.get_mg()) ;
00472 vo.set_etat_c_qcq() ;
00473 *(vo.c) = racine_cubique( *(vi.c) ) ;
00474 return vo ;
00475 }
00476
00477
00478
00479
00480 double totalmax(const Valeur& vi) {
00481
00482
00483 assert(vi.get_etat() != ETATNONDEF) ;
00484
00485
00486 double resu ;
00487
00488 if (vi.get_etat() == ETATZERO) {
00489 resu = 0 ;
00490 }
00491 else {
00492
00493 assert(vi.get_etat() == ETATQCQ) ;
00494 if (vi.c == 0x0) {
00495 vi.coef_i() ;
00496 }
00497
00498 resu = totalmax( *(vi.c) ) ;
00499
00500 }
00501
00502 return resu ;
00503 }
00504
00505
00506
00507
00508
00509 double totalmin(const Valeur& vi) {
00510
00511
00512 assert(vi.get_etat() != ETATNONDEF) ;
00513
00514 double resu ;
00515
00516 if (vi.get_etat() == ETATZERO) {
00517 resu = 0 ;
00518 }
00519 else {
00520
00521 assert(vi.get_etat() == ETATQCQ) ;
00522 if (vi.c == 0x0) {
00523 vi.coef_i() ;
00524 }
00525
00526 resu = totalmin( *(vi.c) ) ;
00527
00528 }
00529
00530 return resu ;
00531 }
00532
00533
00534
00535
00536
00537 Tbl max(const Valeur& vi) {
00538
00539
00540 assert(vi.get_etat() != ETATNONDEF) ;
00541
00542 Tbl resu(vi.get_mg()->get_nzone()) ;
00543
00544 if (vi.get_etat() == ETATZERO) {
00545 resu.annule_hard() ;
00546 }
00547 else {
00548
00549 assert(vi.get_etat() == ETATQCQ) ;
00550 if (vi.c == 0x0) {
00551 vi.coef_i() ;
00552 }
00553
00554 resu = max( *(vi.c) ) ;
00555
00556 }
00557
00558 return resu ;
00559 }
00560
00561
00562
00563
00564
00565 Tbl min(const Valeur& vi) {
00566
00567
00568 assert(vi.get_etat() != ETATNONDEF) ;
00569
00570 Tbl resu(vi.get_mg()->get_nzone()) ;
00571
00572 if (vi.get_etat() == ETATZERO) {
00573 resu.annule_hard() ;
00574 }
00575 else {
00576
00577 assert(vi.get_etat() == ETATQCQ) ;
00578 if (vi.c == 0x0) {
00579 vi.coef_i() ;
00580 }
00581
00582 resu = min( *(vi.c) ) ;
00583
00584 }
00585
00586 return resu ;
00587 }
00588
00589
00590
00591
00592
00593 Tbl norme(const Valeur& vi) {
00594
00595
00596 assert(vi.get_etat() != ETATNONDEF) ;
00597
00598 Tbl resu(vi.get_mg()->get_nzone()) ;
00599
00600 if (vi.get_etat() == ETATZERO) {
00601 resu.annule_hard() ;
00602 }
00603 else {
00604
00605 assert(vi.get_etat() == ETATQCQ) ;
00606 if (vi.c == 0x0) {
00607 vi.coef_i() ;
00608 }
00609
00610 resu = norme( *(vi.c) ) ;
00611
00612 }
00613
00614 return resu ;
00615 }
00616
00617
00618
00619
00620
00621 Tbl diffrel(const Valeur& v1, const Valeur& v2) {
00622
00623
00624 assert(v1.get_etat() != ETATNONDEF) ;
00625 assert(v2.get_etat() != ETATNONDEF) ;
00626
00627 int nz = v1.get_mg()->get_nzone() ;
00628 Tbl resu(nz) ;
00629
00630 Valeur diff = v1 - v2 ;
00631 Tbl normdiff = norme(diff) ;
00632 Tbl norme2 = norme(v2) ;
00633
00634 assert(normdiff.get_etat() == ETATQCQ) ;
00635 assert(norme2.get_etat() == ETATQCQ) ;
00636
00637 resu.set_etat_qcq() ;
00638 for (int l=0; l<nz; l++) {
00639 if ( norme2(l) == double(0) ) {
00640 resu.set(l) = normdiff(l) ;
00641 }
00642 else{
00643 resu.set(l) = normdiff(l) / norme2(l) ;
00644 }
00645 }
00646
00647 return resu ;
00648
00649 }
00650
00651
00652
00653
00654
00655 Tbl diffrelmax(const Valeur& v1, const Valeur& v2) {
00656
00657
00658 assert(v1.get_etat() != ETATNONDEF) ;
00659 assert(v2.get_etat() != ETATNONDEF) ;
00660
00661 int nz = v1.get_mg()->get_nzone() ;
00662 Tbl resu(nz) ;
00663
00664 Tbl max2 = max(abs(v2)) ;
00665 Valeur diff = v1 - v2 ;
00666 Tbl maxdiff = max(abs(diff)) ;
00667
00668 assert(maxdiff.get_etat() == ETATQCQ) ;
00669 assert(max2.get_etat() == ETATQCQ) ;
00670
00671 resu.set_etat_qcq() ;
00672 for (int l=0; l<nz; l++) {
00673 if ( max2(l) == double(0) ) {
00674 resu.set(l) = maxdiff(l) ;
00675 }
00676 else{
00677 resu.set(l) = maxdiff(l) / max2(l) ;
00678 }
00679 }
00680
00681 return resu ;
00682
00683 }
00684