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
00032 char scalar_C[] = "$Header: /cvsroot/Lorene/C++/Source/Tensor/Scalar/scalar.C,v 1.34 2012/01/17 15:10:12 j_penner Exp $" ;
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
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 #include <assert.h>
00157 #include <stdlib.h>
00158 #include <math.h>
00159
00160
00161 #include "map.h"
00162 #include "scalar.h"
00163 #include "tensor.h"
00164 #include "type_parite.h"
00165 #include "utilitaires.h"
00166 #include "proto.h"
00167 #include "cmp.h"
00168
00169
00170
00171
00172
00173
00174
00175 Scalar::Scalar(const Map& mpi) : Tensor(mpi), etat(ETATNONDEF), dzpuis(0),
00176 va(mpi.get_mg()) {
00177
00178 cmp[0] = this ;
00179 set_der_0x0() ;
00180
00181 }
00182
00183
00184
00185
00186 Scalar::Scalar(const Tensor& ti) : Tensor(*(ti.mp)), etat(ti.cmp[0]->etat),
00187 dzpuis(ti.cmp[0]->dzpuis), va(ti.cmp[0]->va) {
00188
00189 assert(ti.valence == 0) ;
00190
00191 cmp[0] = this ;
00192 set_der_0x0() ;
00193
00194 }
00195
00196
00197
00198
00199 Scalar::Scalar(const Scalar& sci) : Tensor(*(sci.mp)), etat(sci.etat),
00200 dzpuis(sci.dzpuis), va(sci.va) {
00201
00202 cmp[0] = this ;
00203 set_der_0x0() ;
00204
00205 }
00206
00207
00208
00209 Scalar::Scalar(const Cmp& ci) : Tensor(*(ci.get_mp())),
00210 etat(ci.get_etat()),
00211 dzpuis(ci.get_dzpuis()),
00212 va(ci.va) {
00213 cmp[0] = this ;
00214 set_der_0x0() ;
00215 }
00216
00217
00218
00219 Scalar::Scalar(const Map& mpi, const Mg3d& mgi, FILE* fd) : Tensor(mpi),
00220 va(mgi, fd) {
00221
00222 assert( mpi.get_mg() == &mgi ) ;
00223
00224 fread_be(&etat, sizeof(int), 1, fd) ;
00225 fread_be(&dzpuis, sizeof(int), 1, fd) ;
00226
00227 cmp[0] = this ;
00228
00229 set_der_0x0() ;
00230
00231 }
00232
00233
00234
00235
00236
00237
00238 Scalar::~Scalar() {
00239 del_t() ;
00240 cmp[0] = 0x0 ;
00241
00242
00243 }
00244
00245
00246
00247
00248
00249
00250 void Scalar::del_t() {
00251
00252 va.del_t() ;
00253 va.set_etat_nondef() ;
00254 Scalar::del_deriv() ;
00255
00256 }
00257
00258 void Scalar::del_deriv() const{
00259 if (p_dsdr != 0x0) delete p_dsdr ;
00260 if (p_srdsdt != 0x0) delete p_srdsdt ;
00261 if (p_srstdsdp != 0x0) delete p_srstdsdp ;
00262 if (p_dsdt != 0x0) delete p_dsdt ;
00263 if (p_stdsdp != 0x0) delete p_stdsdp ;
00264 if (p_dsdx != 0x0) delete p_dsdx ;
00265 if (p_dsdy != 0x0) delete p_dsdy ;
00266 if (p_dsdz != 0x0) delete p_dsdz ;
00267 if (p_lap != 0x0) delete p_lap ;
00268 if (p_lapang != 0x0) delete p_lapang ;
00269 if (p_integ != 0x0) delete p_integ ;
00270 if (p_dsdradial != 0x0) delete p_dsdradial ;
00271 if (p_dsdrho != 0x0) delete p_dsdrho ;
00272 set_der_0x0() ;
00273
00274 Tensor::del_deriv() ;
00275 }
00276
00277 void Scalar::set_der_0x0() const {
00278 p_dsdr = 0x0 ;
00279 p_srdsdt = 0x0 ;
00280 p_srstdsdp = 0x0 ;
00281 p_dsdt = 0x0 ;
00282 p_stdsdp = 0x0 ;
00283 p_dsdx = 0x0 ;
00284 p_dsdy = 0x0 ;
00285 p_dsdz = 0x0 ;
00286 p_lap = 0x0 ;
00287 p_lapang = 0x0 ;
00288 ind_lap = - 1 ;
00289 p_integ = 0x0 ;
00290 p_dsdradial = 0x0 ;
00291 p_dsdrho = 0x0 ;
00292 }
00293
00294
00295 void Scalar::set_etat_zero() {
00296 if (etat == ETATZERO) return ;
00297 else {
00298 del_deriv() ;
00299 va.set_etat_zero() ;
00300 etat = ETATZERO ;
00301 }
00302 }
00303
00304
00305 void Scalar::set_etat_one() {
00306 if (etat == ETATUN) return ;
00307 else {
00308 del_deriv() ;
00309 va = 1 ;
00310 etat = ETATUN ;
00311 }
00312 }
00313
00314
00315 void Scalar::set_etat_nondef() {
00316 if (etat == ETATNONDEF) return ;
00317 else {
00318 del_t() ;
00319 etat = ETATNONDEF ;
00320 }
00321 }
00322
00323
00324 void Scalar::set_etat_qcq() {
00325
00326 if (etat == ETATQCQ) return ;
00327 else {
00328 if (etat != ETATUN) del_t() ;
00329 etat = ETATQCQ ;
00330 }
00331 }
00332
00333
00334
00335
00336 void Scalar::allocate_all() {
00337
00338 set_etat_qcq() ;
00339 va.set_etat_c_qcq() ;
00340 Mtbl* mt = va.c ;
00341 mt->set_etat_qcq() ;
00342 for (int l=0; l<mt->get_nzone(); l++) {
00343 mt->t[l]->set_etat_qcq() ;
00344 }
00345
00346 }
00347
00348
00349
00350
00351 void Scalar::annule_hard() {
00352
00353 va.annule_hard() ;
00354 del_deriv() ;
00355 etat = ETATQCQ ;
00356 }
00357
00358
00359
00360
00361
00362 void Scalar::annule(int l_min, int l_max) {
00363
00364
00365 if ( (l_min == 0) && (l_max == va.mg->get_nzone()-1) ) {
00366 set_etat_zero() ;
00367 return ;
00368 }
00369
00370 assert( etat != ETATNONDEF ) ;
00371
00372 if ( etat == ETATZERO ) {
00373 return ;
00374 }
00375 else {
00376 assert( (etat == ETATQCQ) || (etat == ETATUN) ) ;
00377
00378 etat = ETATQCQ ;
00379 va.annule(l_min, l_max) ;
00380
00381
00382 if (p_dsdr != 0x0) p_dsdr->annule(l_min, l_max) ;
00383 if (p_srdsdt != 0x0) p_srdsdt->annule(l_min, l_max) ;
00384 if (p_srstdsdp != 0x0) p_srstdsdp->annule(l_min, l_max) ;
00385 if (p_dsdt != 0x0) p_dsdt->annule(l_min, l_max) ;
00386 if (p_stdsdp != 0x0) p_stdsdp->annule(l_min, l_max) ;
00387 if (p_dsdx != 0x0) p_dsdx->annule(l_min, l_max) ;
00388 if (p_dsdy != 0x0) p_dsdy->annule(l_min, l_max) ;
00389 if (p_dsdz != 0x0) p_dsdz->annule(l_min, l_max) ;
00390 if (p_lap != 0x0) p_lap->annule(l_min, l_max) ;
00391 if (p_lapang != 0x0) p_lapang->annule(l_min, l_max) ;
00392 if (p_integ != 0x0) delete p_integ ;
00393 if (p_dsdradial != 0x0) p_dsdradial->annule(l_min, l_max) ;
00394 }
00395
00396 }
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407 void Scalar::operator=(const Tensor& uu) {
00408
00409 assert(uu.valence == 0) ;
00410
00411 operator=(*(uu.cmp[0])) ;
00412
00413 }
00414
00415
00416
00417 void Scalar::operator=(const Scalar& ci) {
00418
00419
00420 assert(&ci != this) ;
00421
00422
00423 assert( mp == ci.mp ) ;
00424
00425 dzpuis = ci.dzpuis ;
00426
00427
00428 switch(ci.etat) {
00429 case ETATNONDEF: {
00430 set_etat_nondef() ;
00431 break ;
00432 }
00433
00434 case ETATZERO: {
00435 set_etat_zero() ;
00436 break ;
00437 }
00438
00439 case ETATUN: {
00440 set_etat_one() ;
00441 va.set_base( ci.va.get_base() ) ;
00442 break ;
00443 }
00444
00445 case ETATQCQ: {
00446
00447 va.del_t() ;
00448
00449 set_etat_qcq() ;
00450 va = ci.va ;
00451
00452
00453 del_deriv() ;
00454
00455 break ;
00456 }
00457
00458 default: {
00459 cout << "Unkwown state in Scalar::operator=(const Scalar&) !"
00460 << endl ;
00461 abort() ;
00462 break ;
00463 }
00464 }
00465
00466 }
00467
00468
00469
00470 void Scalar::operator=(const Cmp& ci) {
00471
00472
00473
00474 va.del_t() ;
00475
00476
00477 assert( mp == ci.get_mp() ) ;
00478
00479 dzpuis = ci.get_dzpuis() ;
00480
00481
00482 switch(ci.get_etat()) {
00483
00484 case ETATNONDEF: {
00485 set_etat_nondef() ;
00486 break ;
00487 }
00488
00489 case ETATZERO: {
00490 set_etat_zero() ;
00491 break ;
00492 }
00493
00494 case ETATQCQ: {
00495 set_etat_qcq() ;
00496 va = ci.va ;
00497
00498
00499 del_deriv() ;
00500
00501 break ;
00502 }
00503
00504 default: {
00505 cout << "Unkwown state in Scalar::operator=(const Cmp&) !"
00506 << endl ;
00507 abort() ;
00508 break ;
00509 }
00510 }
00511
00512 }
00513
00514
00515
00516
00517
00518
00519
00520 void Scalar::operator=(const Valeur& vi) {
00521
00522
00523 if (&vi == &va) {
00524 return ;
00525 }
00526
00527
00528 assert(vi.get_etat() != ETATNONDEF) ;
00529
00530
00531 va.del_t() ;
00532
00533
00534
00535 switch(vi.get_etat()) {
00536
00537 case ETATZERO: {
00538 set_etat_zero() ;
00539 break ;
00540 }
00541
00542 case ETATQCQ: {
00543 set_etat_qcq() ;
00544 va = vi ;
00545
00546
00547 del_deriv() ;
00548
00549 break ;
00550 }
00551
00552 default: {
00553 cout << "Unkwown state in Scalar::operator=(const Valeur&) !" << endl ;
00554 abort() ;
00555 break ;
00556 }
00557 }
00558
00559 }
00560
00561
00562
00563 void Scalar::operator=(const Mtbl& mi) {
00564
00565
00566 assert(mi.get_etat() != ETATNONDEF) ;
00567
00568 assert(&mi != va.c) ;
00569
00570
00571
00572 va.del_t() ;
00573
00574
00575 switch(mi.get_etat()) {
00576 case ETATZERO: {
00577 set_etat_zero() ;
00578 break ;
00579 }
00580
00581 case ETATQCQ: {
00582 set_etat_qcq() ;
00583 va = mi ;
00584
00585
00586 del_deriv() ;
00587
00588 break ;
00589 }
00590
00591 default: {
00592 cout << "Unkwown state in Scalar::operator=(const Mtbl&) !" << endl ;
00593 abort() ;
00594 break ;
00595 }
00596 }
00597
00598
00599 }
00600
00601
00602
00603 void Scalar::operator=(double x) {
00604
00605 if (x == double(0)) {
00606 set_etat_zero() ;
00607 }
00608 else {
00609 if (x == double(1)) {
00610 set_etat_one() ;
00611 }
00612 else {
00613 set_etat_qcq() ;
00614 del_deriv() ;
00615 va = x ;
00616 }
00617 }
00618
00619 dzpuis = 0 ;
00620 }
00621
00622
00623
00624 void Scalar::operator=(int n) {
00625
00626 if (n == 0) {
00627 set_etat_zero() ;
00628 }
00629 else {
00630 if (n == 1) {
00631 set_etat_one() ;
00632 }
00633 else {
00634 set_etat_qcq() ;
00635 del_deriv() ;
00636 va = n ;
00637 }
00638 }
00639 dzpuis = 0 ;
00640
00641 }
00642
00643
00644
00645 Scalar::operator Cmp() const {
00646
00647 Cmp resu(mp) ;
00648 resu = va ;
00649 resu.set_dzpuis(dzpuis) ;
00650 return resu ;
00651
00652 }
00653
00654
00655
00656
00657 void Scalar::sauve(FILE* fd) const {
00658
00659 va.sauve(fd) ;
00660
00661
00662 fwrite_be(&etat, sizeof(int), 1, fd) ;
00663 fwrite_be(&dzpuis, sizeof(int), 1, fd) ;
00664
00665 }
00666
00667
00668
00669
00670
00671
00672
00673 ostream& operator<<(ostream& ost, const Scalar& ci) {
00674
00675 switch(ci.etat) {
00676 case ETATNONDEF: {
00677 ost << "*** UNDEFINED STATE *** " << endl ;
00678 break ;
00679 }
00680
00681 case ETATZERO: {
00682 ost << "*** identically ZERO ***" << endl ;
00683 break ;
00684 }
00685
00686 case ETATUN: {
00687 ost << "*** identically ONE ***" << endl ;
00688 break ;
00689 }
00690
00691 case ETATQCQ: {
00692 ost << "*** dzpuis = " << ci.get_dzpuis() << endl ;
00693 ost << ci.va << endl ;
00694 break ;
00695 }
00696
00697 default: {
00698 cout << "operator<<(ostream&, const Scalar&) : unknown state !"
00699 << endl ;
00700 abort() ;
00701 break ;
00702 }
00703 }
00704
00705
00706 return ost ;
00707 }
00708
00709
00710
00711
00712 void Scalar::spectral_display(const char* comment,
00713 double thres, int precis, ostream& ost) const {
00714
00715
00716 if (comment != 0x0) {
00717 ost << comment << " : " << endl ;
00718 }
00719
00720
00721
00722
00723 if (etat == ETATNONDEF) {
00724 ost << "*** UNDEFINED ***" << endl << endl ;
00725 return ;
00726 }
00727
00728 if (etat == ETATZERO) {
00729 ost << "*** identically ZERO ***" << endl ;
00730 return ;
00731 }
00732
00733 if (etat == ETATUN) {
00734 ost << "*** identically ONE ***" << endl ;
00735 return ;
00736 }
00737
00738
00739
00740
00741 if (dzpuis != 0) {
00742 ost << "*** dzpuis = " << dzpuis << endl ;
00743 }
00744 va.display_coef(thres, precis, ost) ;
00745
00746 }
00747
00748
00749
00750
00751
00752
00753
00754
00755 void Scalar::std_spectral_base() {
00756
00757 va.std_base_scal() ;
00758
00759 }
00760
00761
00762 void Scalar::std_spectral_base_odd() {
00763
00764 va.std_base_scal_odd() ;
00765
00766 }
00767
00768
00769 void Scalar::set_spectral_base(const Base_val& bi) {
00770
00771 va.set_base(bi) ;
00772
00773 }
00774
00775
00776
00777
00778
00779
00780 void Scalar::set_dzpuis(int dzi) {
00781
00782 dzpuis = dzi ;
00783
00784 }
00785
00786 bool Scalar::dz_nonzero() const {
00787
00788 assert(etat != ETATNONDEF) ;
00789
00790 const Mg3d* mg = mp->get_mg() ;
00791
00792 int nzm1 = mg->get_nzone() - 1;
00793 if (mg->get_type_r(nzm1) != UNSURR) {
00794 return false ;
00795 }
00796
00797 if (etat == ETATZERO) {
00798 return false ;
00799 }
00800
00801 if (etat == ETATUN) {
00802 return true ;
00803 }
00804
00805 assert( etat == ETATQCQ ) ;
00806
00807 if (va.etat == ETATZERO) {
00808 return false ;
00809 }
00810
00811 assert(va.etat == ETATQCQ) ;
00812
00813 if (va.c != 0x0) {
00814 if ( (va.c)->get_etat() == ETATZERO ) {
00815 return false ;
00816 }
00817
00818 assert( (va.c)->get_etat() == ETATQCQ ) ;
00819 if ( (va.c)->t[nzm1]->get_etat() == ETATZERO ) {
00820 return false ;
00821 }
00822 else {
00823 assert( (va.c)->t[nzm1]->get_etat() == ETATQCQ ) ;
00824 return true ;
00825 }
00826 }
00827 else{
00828 assert(va.c_cf != 0x0) ;
00829 if ( (va.c_cf)->get_etat() == ETATZERO ) {
00830 return false ;
00831 }
00832 assert( (va.c_cf)->get_etat() == ETATQCQ ) ;
00833 if ( (va.c_cf)->t[nzm1]->get_etat() == ETATZERO ) {
00834 return false ;
00835 }
00836 else {
00837 assert( (va.c_cf)->t[nzm1]->get_etat() == ETATQCQ ) ;
00838 return true ;
00839 }
00840
00841 }
00842
00843 }
00844
00845 bool Scalar::check_dzpuis(int dzi) const {
00846
00847 if (dz_nonzero()) {
00848 return (dzpuis == dzi) ;
00849 }
00850 else{
00851 return true ;
00852 }
00853
00854 }
00855
00856
00857
00858
00859
00860
00861
00862 double Scalar::val_point(double r, double theta, double phi) const {
00863
00864
00865 assert(etat != ETATNONDEF) ;
00866
00867 if (etat == ETATZERO) {
00868 return double(0) ;
00869 }
00870
00871 if (etat == ETATUN) {
00872 return double(1) ;
00873 }
00874
00875 assert(etat == ETATQCQ) ;
00876
00877
00878
00879
00880 int l ;
00881 double xi ;
00882 mp->val_lx(r, theta, phi, l, xi) ;
00883
00884
00885 if (l == mp->get_mg()->get_nzone() - 1){
00886 switch (dzpuis) {
00887 case 0:
00888 {
00889 return va.val_point(l, xi, theta, phi);
00890 break;
00891 }
00892 case 1:
00893 {
00894 return va.val_point(l, xi, theta, phi)/r ;
00895 break;
00896 }
00897 case 2:
00898 {
00899 return va.val_point(l, xi, theta, phi)/(r*r) ;
00900 break;
00901 }
00902 case 3:
00903 {
00904 return va.val_point(l, xi, theta, phi)/(r*r*r) ;
00905 break;
00906 }
00907 case 4:
00908 {
00909 return va.val_point(l, xi, theta, phi)/(r*r*r*r) ;
00910 break;
00911 }
00912 default:
00913 {
00914 cout << "scalar::val_point unexpected value of dzpuis !" << endl;
00915 abort();
00916 }
00917 }
00918 }
00919 else{
00920 return va.val_point(l, xi, theta, phi);
00921 }
00922 }
00923
00924
00925
00926
00927
00928 Tbl Scalar::multipole_spectrum() const {
00929
00930 assert (etat != ETATNONDEF) ;
00931
00932 const Mg3d* mg = mp->get_mg() ;
00933 int nzone = mg->get_nzone() ;
00934 int lmax = 0 ;
00935
00936 for (int lz=0; lz<nzone; lz++)
00937 lmax = (lmax < 2*mg->get_nt(lz) - 1 ? 2*mg->get_nt(lz) - 1 : lmax) ;
00938
00939 Tbl resu(nzone, lmax) ;
00940 if (etat == ETATZERO) {
00941 resu.set_etat_zero() ;
00942 return resu ;
00943 }
00944
00945 assert((etat == ETATQCQ) || (etat == ETATUN));
00946
00947 Valeur va_copy = va ;
00948
00949 va_copy.coef() ;
00950 va_copy.ylm() ;
00951 resu.annule_hard() ;
00952 const Base_val& base = va_copy.c_cf->base ;
00953 int m_quant, l_quant, base_r ;
00954 for (int lz=0; lz<nzone; lz++)
00955 for (int k=0 ; k<mg->get_np(lz) ; k++)
00956 for (int j=0 ; j<mg->get_nt(lz) ; j++) {
00957 if (nullite_plm(j, mg->get_nt(lz), k, mg->get_np(lz), base) == 1)
00958 {
00959
00960 donne_lm(nzone, lz, j, k, base, m_quant, l_quant, base_r) ;
00961 for (int i=0; i<mg->get_nr(lz); i++) resu.set(lz, l_quant)
00962 += fabs((*va_copy.c_cf)(lz, k, j, i)) ;
00963 }
00964 }
00965
00966 return resu ;
00967 }
00968
00969 void Scalar::change_triad(const Base_vect& ) {
00970
00971 cout << "WARNING: Scalar::change_triad : "<< endl ;
00972 cout << "This method does nothing ... " << endl ;
00973
00974 }