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
00033
00034 #ifndef __SCALAR_H_
00035 #define __SCALAR_H_
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
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 #include "valeur.h"
00354 #include "tensor.h"
00355
00356 class Param ;
00357 class Cmp ;
00358 class Param_elliptic ;
00359
00367 class Scalar : public Tensor {
00368
00369
00370
00371 protected:
00372
00376 int etat ;
00377
00383 int dzpuis ;
00384
00385 Valeur va ;
00386
00387
00388
00389 protected:
00391 mutable Scalar* p_dsdr ;
00392
00396 mutable Scalar* p_srdsdt ;
00397
00401 mutable Scalar* p_srstdsdp ;
00402
00404 mutable Scalar* p_dsdt ;
00405
00409 mutable Scalar* p_stdsdp ;
00410
00414 mutable Scalar* p_dsdx ;
00415
00419 mutable Scalar* p_dsdy ;
00420
00424 mutable Scalar* p_dsdz ;
00425
00428 mutable Scalar* p_lap ;
00429
00432 mutable Scalar* p_lapang ;
00433
00435 mutable Scalar* p_dsdradial ;
00436
00438 mutable Scalar* p_dsdrho ;
00439
00443 mutable int ind_lap ;
00444
00448 mutable Tbl* p_integ ;
00449
00450
00451
00452
00453 public:
00454
00455 explicit Scalar(const Map& mpi) ;
00456
00458 Scalar(const Tensor& a) ;
00459
00460 Scalar(const Scalar& a) ;
00461
00462 Scalar(const Cmp& a) ;
00463
00465 Scalar(const Map&, const Mg3d&, FILE* ) ;
00466
00467 virtual ~Scalar() ;
00468
00469
00470
00471
00472 protected:
00473 void del_t() ;
00474 virtual void del_deriv() const;
00475 void set_der_0x0() const;
00476
00477 public:
00478
00483 virtual void set_etat_nondef() ;
00484
00490 virtual void set_etat_zero() ;
00491
00498 virtual void set_etat_qcq() ;
00499
00505 void set_etat_one() ;
00506
00515 virtual void allocate_all() ;
00516
00525 void annule_hard() ;
00526
00527
00528
00529 public:
00533 int get_etat() const {return etat;} ;
00534
00536 int get_dzpuis() const {return dzpuis;} ;
00537
00541 bool dz_nonzero() const ;
00542
00547 bool check_dzpuis(int dzi) const ;
00548
00549
00550
00551 public:
00553 void operator=(const Scalar& a) ;
00554
00556 virtual void operator=(const Tensor& a) ;
00557
00558 void operator=(const Cmp& a) ;
00559 void operator=(const Valeur& a) ;
00560 void operator=(const Mtbl& a) ;
00561 void operator=(double ) ;
00562 void operator=(int ) ;
00563
00564
00565
00566 operator Cmp() const ;
00567
00568
00569
00570 public:
00571
00573 const Valeur& get_spectral_va() const {return va;} ;
00574
00576 Valeur& set_spectral_va() {return va;} ;
00577
00587 Tbl& set_domain(int l) {
00588 assert(etat == ETATQCQ) ;
00589 del_deriv() ;
00590 return va.set(l) ;
00591 };
00592
00597 const Tbl& domain(int l) const {
00598 assert( (etat == ETATQCQ) || (etat == ETATUN) ) ;
00599 return va(l) ;
00600 };
00601
00602
00609 double val_grid_point(int l, int k, int j, int i) const {
00610 assert(etat != ETATNONDEF) ;
00611 if (etat == ETATZERO) {
00612 double zero = 0. ;
00613 return zero ;
00614 }
00615 else {
00616 if (etat == ETATUN) {
00617 double one = 1. ;
00618 return one ;
00619 }
00620 else{
00621 return va(l, k, j, i) ;
00622 }
00623 }
00624 };
00625
00640 double val_point(double r, double theta, double phi) const ;
00641
00642
00656 double& set_grid_point(int l, int k, int j, int i) {
00657 assert(etat == ETATQCQ) ;
00658 return va.set(l, k, j, i) ;
00659 };
00660
00661
00672 virtual void annule(int l_min, int l_max) ;
00673
00679 void set_inner_boundary(int l, double x) ;
00680
00686 void set_outer_boundary(int l, double x) ;
00687
00696 Tbl multipole_spectrum () const ;
00697
00704 Tbl tbl_out_bound(int l_dom, bool leave_ylm = false) ;
00705
00712 Tbl tbl_in_bound(int n, bool leave_ylm = false) ;
00713
00720 Scalar scalar_out_bound(int n, bool leave_ylm = false) ;
00721
00722
00723
00724 public:
00729 const Scalar& dsdr() const ;
00730
00735 const Scalar& srdsdt() const ;
00736
00741 const Scalar& srstdsdp() const ;
00742
00745 const Scalar& dsdt() const ;
00746
00754 const Scalar& dsdradial() const ;
00755
00760 const Scalar& dsdrho() const ;
00761
00764 const Scalar& stdsdp() const ;
00765
00771 const Scalar& dsdx() const ;
00772
00778 const Scalar& dsdy() const ;
00779
00785 const Scalar& dsdz() const ;
00786
00793 const Scalar& deriv(int i) const ;
00794
00799 const Vector& derive_cov(const Metric& gam) const ;
00800
00801
00807 const Vector& derive_con(const Metric& gam) const ;
00808
00810 Scalar derive_lie(const Vector& v) const ;
00811
00812
00821 const Scalar& laplacian(int ced_mult_r = 4) const ;
00822
00830 const Scalar& lapang() const ;
00831
00833 void div_r() ;
00834
00839 void div_r_dzpuis(int ced_mult_r) ;
00840
00844 void div_r_ced() ;
00845
00847 void mult_r() ;
00848
00853 void mult_r_dzpuis(int ced_mult_r) ;
00854
00858 void mult_r_ced() ;
00859
00861 void mult_rsint() ;
00862
00867 void mult_rsint_dzpuis(int ced_mult_r) ;
00868
00870 void div_rsint() ;
00871
00876 void div_rsint_dzpuis(int ced_mult_r) ;
00877
00878 void mult_cost() ;
00879
00880 void div_cost() ;
00881
00882 void mult_sint() ;
00883
00884 void div_sint() ;
00885
00886 void div_tant() ;
00887
00899 Scalar primr(bool null_infty = true) const ;
00900
00908 double integrale() const ;
00909
00919 const Tbl& integrale_domains() const ;
00920
00925 virtual void dec_dzpuis(int dec = 1) ;
00926
00931 virtual void inc_dzpuis(int inc = 1) ;
00932
00936 virtual void change_triad(const Base_vect& new_triad) ;
00937
00942 void filtre (int n) ;
00943
00948 void filtre_r (int* nn) ;
00949
00953 void filtre_r (int n, int nzone) ;
00954
00965
00966
00967 virtual void exponential_filter_r(int lzmin, int lzmax, int p,
00968 double alpha= -16.) ;
00969
00980 void sarra_filter_r(int lzmin, int lzmax, double p,
00981 double alpha= -1E-16) ;
00982
00988 void exp_filter_r_all_domains(Scalar &ss, int p, double alpha=-16.) ;
00989
00996 void sarra_filter_r_all_domains(double p, double alpha=1E-16) ;
00997
01005 virtual void exponential_filter_ylm(int lzmin, int lzmax, int p,
01006 double alpha= -16.) ;
01007
01015 void annule_l (int l_min, int l_max, bool ylm_output= false ) ;
01016
01021 void filtre_phi (int n, int zone) ;
01022
01027 void filtre_tp(int nn, int nz1, int nz2) ;
01028
01029
01035 void fixe_decroissance (int puis) ;
01036
01042 void smooth_decay(int k, int n) ;
01043
01048 void raccord(int n) ;
01049
01056 void raccord_c1_zec(int puis, int nbre, int lmax) ;
01057
01061 void raccord_externe(int puis, int nbre, int lmax) ;
01062
01071 void match_tau(Param& par_bc, Param* par_mat=0x0) ;
01072
01073
01074
01075 public:
01076 virtual void sauve(FILE *) const ;
01077
01088 virtual void spectral_display(const char* comment = 0x0,
01089 double threshold = 1.e-7, int precision = 4,
01090 ostream& ostr = cout) const ;
01091
01093 friend ostream& operator<<(ostream& , const Scalar & ) ;
01094
01118 void visu_section(const char section_type, double aa, double umin, double umax, double vmin,
01119 double vmax, const char* title = 0x0, const char* filename = 0x0,
01120 bool start_dx = true, int nu = 200, int nv = 200) const ;
01121
01150 void visu_section(const Tbl& plane, double umin, double umax, double vmin,
01151 double vmax, const char* title = 0x0, const char* filename = 0x0,
01152 bool start_dx = true, int nu = 200, int nv = 200) const ;
01153
01182 void visu_section_anim(const char section_type, double aa, double umin,
01183 double umax, double vmin, double vmax, int jtime, double ttime,
01184 int jgraph = 1, const char* title = 0x0, const char* filename_root = 0x0,
01185 bool start_dx = false, int nu = 200, int nv = 200) const ;
01186
01208 void visu_box(double xmin, double xmax, double ymin, double ymax,
01209 double zmin, double zmax, const char* title0 = 0x0,
01210 const char* filename0 = 0x0, bool start_dx = true, int nx = 40, int ny = 40,
01211 int nz = 40) const ;
01212
01213
01214
01215
01216
01217 public:
01218 void operator+=(const Scalar &) ;
01219 void operator-=(const Scalar &) ;
01220 void operator*=(const Scalar &) ;
01221
01222
01223
01227 virtual void std_spectral_base() ;
01228
01232 virtual void std_spectral_base_odd() ;
01233
01236 void set_spectral_base(const Base_val& ) ;
01237
01239 const Base_val& get_spectral_base( ) const {return va.base ;} ;
01240
01246 void set_dzpuis(int ) ;
01247
01263 Valeur** asymptot(int n, const int flag = 0) const ;
01264
01265
01266
01267
01268 public:
01278 Scalar poisson() const ;
01279
01291 void poisson(Param& par, Scalar& uu) const ;
01292
01302 Scalar poisson_tau() const ;
01303
01314 void poisson_tau(Param& par, Scalar& uu) const ;
01315
01330 Scalar poisson_dirichlet (const Valeur& limite, int num) const ;
01331
01336 Scalar poisson_neumann (const Valeur&, int) const ;
01337
01338
01357 Scalar poisson_dir_neu (const Valeur& limite , int num,
01358 double fact_dir, double fact_neu) const ;
01359
01366 Scalar poisson_frontiere_double (const Valeur&, const Valeur&, int) const ;
01367
01392 void poisson_regular(int k_div, int nzet, double unsgam1, Param& par,
01393 Scalar& uu, Scalar& uu_regu, Scalar& uu_div,
01394 Tensor& duu_div,
01395 Scalar& source_regu, Scalar& source_div) const ;
01396
01431 Tbl test_poisson(const Scalar& uu, ostream& ostr,
01432 bool detail = false) const ;
01433
01447 Scalar poisson_angu(double lambda =0) const ;
01448
01481 Scalar avance_dalembert(Param& par, const Scalar& fJm1, const Scalar& source)
01482 const ;
01483
01488 Scalar sol_elliptic(Param_elliptic& params) const ;
01489
01499 Scalar sol_elliptic_boundary(Param_elliptic& params, const Mtbl_cf& bound,
01500 double fact_dir, double fact_neu) const ;
01501
01506 Scalar sol_elliptic_boundary(Param_elliptic& params, const Scalar& bound,
01507 double fact_dir, double fact_neu) const ;
01508
01509
01516 Scalar sol_elliptic_2d(Param_elliptic&) const ;
01517
01522 Scalar sol_elliptic_pseudo_1d(Param_elliptic&) const ;
01523
01531 Scalar sol_elliptic_no_zec(Param_elliptic& params, double val = 0) const ;
01532
01539 Scalar sol_elliptic_only_zec(Param_elliptic& params, double val) const ;
01540
01550 Scalar sol_elliptic_sin_zec(Param_elliptic& params, double* coefs, double* phases) const ;
01551
01552
01560 Scalar sol_elliptic_fixe_der_zero(double val,
01561 Param_elliptic& params) const ;
01562
01563
01574 Scalar sol_divergence(int n) const ;
01575
01576
01577
01578
01584 void import(const Scalar& ci) ;
01585
01592 void import_symy(const Scalar& ci) ;
01593
01601 void import_asymy(const Scalar& ci) ;
01602
01614 void import(int nzet, const Scalar& ci) ;
01615
01628 void import_symy(int nzet, const Scalar& ci) ;
01629
01643 void import_asymy(int nzet, const Scalar& ci) ;
01644
01645 protected:
01659 void import_gal(int nzet, const Scalar& ci) ;
01660
01674 void import_align(int nzet, const Scalar& ci) ;
01675
01690 void import_anti(int nzet, const Scalar& ci) ;
01691
01706 void import_align_symy(int nzet, const Scalar& ci) ;
01707
01723 void import_anti_symy(int nzet, const Scalar& ci) ;
01724
01740 void import_align_asymy(int nzet, const Scalar& ci) ;
01741
01758 void import_anti_asymy(int nzet, const Scalar& ci) ;
01759
01760
01761 friend Scalar operator-(const Scalar& ) ;
01762 friend Scalar operator+(const Scalar&, const Scalar &) ;
01763 friend Scalar operator+(const Scalar&, const Mtbl&) ;
01764 friend Scalar operator+(const Scalar&, double ) ;
01765 friend Scalar operator-(const Scalar &, const Scalar &) ;
01766 friend Scalar operator-(const Scalar&, const Mtbl&) ;
01767 friend Scalar operator-(const Scalar&, double ) ;
01768 friend Scalar operator*(const Scalar &, const Scalar &) ;
01769 friend Scalar operator%(const Scalar &, const Scalar &) ;
01770 friend Scalar operator|(const Scalar &, const Scalar &) ;
01771 friend Scalar operator*(const Mtbl&, const Scalar &) ;
01772 friend Scalar operator*(double, const Scalar &) ;
01773 friend Scalar operator/(const Scalar &, const Scalar &) ;
01774 friend Scalar operator/(const Scalar &, const Mtbl &) ;
01775 friend Scalar operator/(const Mtbl &, const Scalar &) ;
01776 friend Scalar operator/(const Scalar&, double ) ;
01777 friend Scalar operator/(double, const Scalar &) ;
01778
01779 friend Scalar sin(const Scalar& ) ;
01780 friend Scalar cos(const Scalar& ) ;
01781 friend Scalar tan(const Scalar& ) ;
01782 friend Scalar asin(const Scalar& ) ;
01783 friend Scalar acos(const Scalar& ) ;
01784 friend Scalar atan(const Scalar& ) ;
01785 friend Scalar exp(const Scalar& ) ;
01786 friend Scalar Heaviside(const Scalar& ) ;
01787 friend Scalar log(const Scalar& ) ;
01788 friend Scalar log10(const Scalar& ) ;
01789 friend Scalar sqrt(const Scalar& ) ;
01790 friend Scalar racine_cubique (const Scalar& ) ;
01791 friend Scalar pow(const Scalar& , int ) ;
01792 friend Scalar pow(const Scalar& , double ) ;
01793 friend Scalar abs(const Scalar& ) ;
01794
01795 friend double totalmax(const Scalar& ) ;
01796 friend double totalmin(const Scalar& ) ;
01797 friend Tbl max(const Scalar& ) ;
01798 friend Tbl min(const Scalar& ) ;
01799 friend Tbl norme(const Scalar& ) ;
01800 friend Tbl diffrel(const Scalar& a, const Scalar& b) ;
01801 friend Tbl diffrelmax(const Scalar& a, const Scalar& b) ;
01802
01803 };
01804
01805 ostream& operator<<(ostream& , const Scalar & ) ;
01806
01807
01814 Scalar operator+(const Scalar& ) ;
01815 Scalar operator-(const Scalar& ) ;
01816 Scalar operator+(const Scalar&, const Scalar &) ;
01817 Scalar operator+(const Scalar&, const Mtbl&) ;
01818 Scalar operator+(const Mtbl&, const Scalar&) ;
01819 Scalar operator+(const Scalar&, double ) ;
01820 Scalar operator+(double, const Scalar& ) ;
01821 Scalar operator+(const Scalar&, int ) ;
01822 Scalar operator+(int, const Scalar& ) ;
01823 Scalar operator-(const Scalar &, const Scalar &) ;
01824 Scalar operator-(const Scalar&, const Mtbl&) ;
01825 Scalar operator-(const Mtbl&, const Scalar&) ;
01826 Scalar operator-(const Scalar&, double ) ;
01827 Scalar operator-(double, const Scalar& ) ;
01828 Scalar operator-(const Scalar&, int ) ;
01829 Scalar operator-(int, const Scalar& ) ;
01830 Scalar operator*(const Scalar &, const Scalar &) ;
01831
01833 Scalar operator%(const Scalar &, const Scalar &) ;
01834
01836 Scalar operator|(const Scalar &, const Scalar &) ;
01837
01838 Scalar operator*(const Mtbl&, const Scalar&) ;
01839 Scalar operator*(const Scalar&, const Mtbl&) ;
01840
01841 Scalar operator*(const Scalar&, double ) ;
01842 Scalar operator*(double, const Scalar &) ;
01843 Scalar operator*(const Scalar&, int ) ;
01844 Scalar operator*(int, const Scalar& ) ;
01845 Scalar operator/(const Scalar &, const Scalar &) ;
01846 Scalar operator/(const Scalar&, double ) ;
01847 Scalar operator/(double, const Scalar &) ;
01848 Scalar operator/(const Scalar&, int ) ;
01849 Scalar operator/(int, const Scalar &) ;
01850 Scalar operator/(const Scalar &, const Mtbl&) ;
01851 Scalar operator/(const Mtbl&, const Scalar &) ;
01852
01853
01854 Scalar sin(const Scalar& ) ;
01855 Scalar cos(const Scalar& ) ;
01856 Scalar tan(const Scalar& ) ;
01857 Scalar asin(const Scalar& ) ;
01858 Scalar acos(const Scalar& ) ;
01859 Scalar atan(const Scalar& ) ;
01860 Scalar exp(const Scalar& ) ;
01861 Scalar Heaviside(const Scalar& ) ;
01862 Scalar log(const Scalar& ) ;
01863 Scalar log10(const Scalar& ) ;
01864 Scalar sqrt(const Scalar& ) ;
01865 Scalar racine_cubique (const Scalar& ) ;
01866 Scalar pow(const Scalar& , int ) ;
01867 Scalar pow(const Scalar& , double ) ;
01868 Scalar abs(const Scalar& ) ;
01869
01875 double totalmax(const Scalar& ) ;
01876
01882 double totalmin(const Scalar& ) ;
01883
01889 Tbl max(const Scalar& ) ;
01890
01896 Tbl min(const Scalar& ) ;
01897
01904 Tbl norme(const Scalar& ) ;
01905
01914 Tbl diffrel(const Scalar& a, const Scalar& b) ;
01915
01924 Tbl diffrelmax(const Scalar& a, const Scalar& b) ;
01925
01930 void exp_filter_ylm_all_domains(Scalar& ss, int p, double alpha=-16.) ;
01931
01933 #endif