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 char map_et_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et.C,v 1.13 2008/09/29 13:23:51 j_novak Exp $" ;
00028
00029
00030
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
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 #include <math.h>
00124
00125
00126 #include "proto.h"
00127 #include "map.h"
00128 #include "utilitaires.h"
00129 #include "unites.h"
00130
00131
00132
00133
00134
00135
00136
00137
00138 Map_et::Map_et(const Mg3d& mgrille, const double* bornes)
00139 : Map_radial(mgrille),
00140 aasx( mgrille.get_nr(0) ),
00141 aasx2( mgrille.get_nr(0) ),
00142 zaasx( mgrille.get_nr(mgrille.get_nzone()-1) ),
00143 zaasx2( mgrille.get_nr(mgrille.get_nzone()-1) ),
00144 bbsx( mgrille.get_nr(0) ),
00145 bbsx2( mgrille.get_nr(0) ),
00146 ff(mgrille.get_angu()) ,
00147 gg(mgrille.get_angu())
00148 {
00149
00150
00151
00152
00153
00154 set_coord() ;
00155
00156
00157
00158
00159 int nzone = mg->get_nzone() ;
00160
00161 alpha = new double[nzone] ;
00162 beta = new double[nzone] ;
00163
00164 for (int l=0 ; l<nzone ; l++) {
00165 switch (mg->get_type_r(l)) {
00166 case RARE: {
00167 alpha[l] = bornes[l+1] - bornes[l] ;
00168 beta[l] = bornes[l] ;
00169 break ;
00170 }
00171
00172 case FINJAC: {
00173 alpha[l] = (bornes[l+1] - bornes[l]) * .5;
00174 beta[l] = (bornes[l+1] + bornes[l]) * .5;
00175 break;
00176 }
00177
00178 case FIN: {
00179 alpha[l] = (bornes[l+1] - bornes[l]) * .5 ;
00180 beta[l] = (bornes[l+1] + bornes[l]) * .5 ;
00181 break ;
00182 }
00183
00184 case UNSURR: {
00185 double umax = double(1) / bornes[l] ;
00186 double umin = double(1) /bornes[l+1] ;
00187 alpha[l] = (umin - umax) * double(0.5) ;
00188 beta[l] = (umin + umax) * double(0.5) ;
00189 break ;
00190 }
00191
00192 default: {
00193 cout << "Map_et::Map_et: unkown type_r ! " << endl ;
00194 abort () ;
00195 break ;
00196 }
00197
00198 }
00199 }
00200
00201
00202
00203
00204
00205 fait_poly() ;
00206
00207
00208
00209
00210 ff.set_etat_zero() ;
00211 gg.set_etat_zero() ;
00212
00213 ff.std_base_scal() ;
00214 gg.std_base_scal() ;
00215
00216 }
00217
00218 Map_et::Map_et(const Mg3d& grille, const double* r_lim, const Tbl& S_0) :
00219 Map_radial(grille),
00220 aasx(grille.get_nr(0) ),
00221 aasx2(grille.get_nr(0) ),
00222 zaasx(grille.get_nr(grille.get_nzone()-1) ),
00223 zaasx2(grille.get_nr(grille.get_nzone()-1) ),
00224 bbsx(grille.get_nr(0) ),
00225 bbsx2(grille.get_nr(0) ),
00226 ff(grille.get_angu()) ,
00227 gg(grille.get_angu()) {
00228
00229 assert (S_0.get_ndim() == 2) ;
00230 assert (S_0.get_dim(0) == grille.get_nt(0)) ;
00231 assert (S_0.get_dim(1) == grille.get_np(0)) ;
00232
00233 Map_et mapping (grille, r_lim) ;
00234
00235 int nz = grille.get_nzone() ;
00236 assert (nz >2) ;
00237
00238
00239 int np = grille.get_np(0) ;
00240 int nt = grille.get_nt(0) ;
00241
00242 double * cf = new double [nt*(np+2)] ;
00243 for (int k=0 ; k<np ; k++)
00244 for (int j=0 ; j<nt ; j++)
00245 cf[k*nt+j] = S_0(k,j) - S_0(0,0) ;
00246
00247 int* deg = new int [3] ;
00248 deg[0] = np ;
00249 deg[1] = nt ;
00250 deg[2] = 1 ;
00251
00252 int* dim = new int [3] ;
00253 dim[0] = np+2 ;
00254 dim[1] = nt ;
00255 dim[2] = 1 ;
00256
00257 Tbl ff_nucleus (np,nt) ;
00258 ff_nucleus.set_etat_qcq() ;
00259
00260 Tbl gg_nucleus (np,nt) ;
00261 gg_nucleus.set_etat_qcq() ;
00262
00263
00264 int base_p = grille.std_base_scal().get_base_p(0) ;
00265
00266 double * odd ;
00267 double * even ;
00268 double * coloc_odd ;
00269 double * coloc_even ;
00270
00271 switch (base_p) {
00272 case P_COSSIN:
00273 cfpcossin (deg,dim,cf) ;
00274
00275
00276 odd = new double [nt*(np+2)] ;
00277 even = new double [nt*(np+2)] ;
00278
00279
00280 for (int k=0 ; k<np+2 ; k++)
00281 if ((k%4 == 0) || (k%4==1))
00282 for (int j=0 ; j<nt ; j++) {
00283 odd[k*nt+j] = 0 ;
00284 even[k*nt+j] = cf[k*nt+j] ;
00285 }
00286 else
00287 if ((k%4 == 2) || (k%4 == 3))
00288 for (int j=0 ; j<nt ; j++) {
00289 even[k*nt+j] = 0 ;
00290 odd[k*nt+j] = cf[k*nt+j] ;
00291 }
00292
00293 else {
00294 cout << "Erreur bizzare..." << endl ;
00295 abort() ;
00296 }
00297
00298 coloc_odd = new double [nt*np] ;
00299 coloc_even = new double [nt*np] ;
00300
00301 cipcossin (deg,dim,deg,odd,coloc_odd) ;
00302 cipcossin (deg,dim,deg,even,coloc_even) ;
00303 for (int k=0 ; k<np ; k++)
00304 for (int j=0 ; j<nt ; j++) {
00305 gg_nucleus.set(k,j) = coloc_even[k*nt+j] ;
00306 ff_nucleus.set(k,j) = coloc_odd[k*nt+j] ;
00307 }
00308
00309 delete [] even ;
00310 delete [] odd ;
00311 delete [] coloc_even ;
00312 delete [] coloc_odd ;
00313 delete[] dim ;
00314 delete [] deg ;
00315 delete [] cf ;
00316
00317 break;
00318 default:
00319 cout << "Base_p != P_COSSIN not implemented in Map_et constructor" <<
00320 endl ;
00321 abort() ;
00322 }
00323
00324 double mu_nucleus = - min(gg_nucleus) ;
00325 double alpha_nucleus = S_0(0,0)-mu_nucleus ;
00326
00327 ff_nucleus /= alpha_nucleus ;
00328 gg_nucleus += mu_nucleus ;
00329 gg_nucleus /= alpha_nucleus ;
00330
00331
00332 Tbl ff_shell (np,nt) ;
00333 ff_shell.set_etat_qcq() ;
00334 ff_shell = S_0 - S_0(0,0) ;
00335
00336 double lambda_shell = -max(ff_shell) ;
00337
00338 double R_ext = r_lim[2] ;
00339
00340 double beta_shell = (R_ext+S_0(0,0)-lambda_shell)/2. ;
00341 double alpha_shell = (R_ext-S_0(0,0)+lambda_shell)/2. ;
00342
00343 ff_shell += lambda_shell ;
00344 ff_shell /= alpha_shell ;
00345
00346 ff.annule_hard() ;
00347 gg.annule_hard() ;
00348
00349 ff.set_etat_c_qcq() ;
00350 gg.set_etat_c_qcq() ;
00351
00352 for (int k=0 ; k<np ; k++)
00353 for (int j=0 ; j<nt ; j++) {
00354 ff.set(0,k,j,0) = ff_nucleus(k,j) ;
00355 gg.set(0,k,j,0) = gg_nucleus(k,j) ;
00356 ff.set(1,k,j,0) = ff_shell(k,j) ;
00357 }
00358
00359 gg.annule(1,nz-1) ;
00360 ff.annule(2,nz-1) ;
00361
00362 ff.std_base_scal() ;
00363 gg.std_base_scal() ;
00364
00365 alpha = new double[nz] ;
00366 alpha[0] = alpha_nucleus ;
00367 alpha[1] = alpha_shell ;
00368
00369 beta = new double[nz] ;
00370 beta[0] = 0 ;
00371 beta[1] = beta_shell ;
00372 for (int i=2 ; i<nz ; i++) {
00373 alpha[i] = mapping.get_alpha()[i] ;
00374 beta[i] = mapping.get_beta()[i] ;
00375 }
00376
00377 fait_poly() ;
00378 set_coord() ;
00379 }
00380
00381
00382
00383 Map_et::Map_et(const Map_et& mpi) : Map_radial(mpi) ,
00384 aasx( mpi.aasx ),
00385 aasx2( mpi.aasx2 ),
00386 zaasx( mpi.zaasx ),
00387 zaasx2( mpi.zaasx2 ),
00388 bbsx( mpi.bbsx ),
00389 bbsx2( mpi.bbsx2 ),
00390 ff(mpi.ff) ,
00391 gg(mpi.gg)
00392 {
00393
00394
00395 set_coord() ;
00396
00397
00398
00399 int nzone = mg->get_nzone() ;
00400
00401 alpha = new double[nzone] ;
00402 beta = new double[nzone] ;
00403
00404 for (int l=0 ; l<nzone ; l++) {
00405 alpha[l] = mpi.alpha[l] ;
00406 beta[l] = mpi.beta[l] ;
00407 }
00408
00409
00410
00411
00412 fait_poly() ;
00413
00414 }
00415
00416
00417
00418
00419 void Map_et::set_alpha(double alpha0, int l) {
00420
00421 assert(l>=0) ;
00422 assert(l<mg->get_nzone()) ;
00423
00424 alpha[l] = alpha0 ;
00425
00426 reset_coord() ;
00427
00428 }
00429
00430 void Map_et::set_beta(double beta0, int l) {
00431
00432 assert(l>=0) ;
00433 assert(l<mg->get_nzone()) ;
00434
00435 beta[l] = beta0 ;
00436
00437 reset_coord() ;
00438
00439 }
00440
00441
00442
00443
00444 Map_et::Map_et(const Mg3d& mgi, FILE* fich)
00445 : Map_radial(mgi, fich),
00446 aasx( mgi.get_nr(0) ),
00447 aasx2( mgi.get_nr(0) ),
00448 zaasx( mgi.get_nr(mgi.get_nzone()-1) ),
00449 zaasx2( mgi.get_nr(mgi.get_nzone()-1) ),
00450 bbsx( mgi.get_nr(0) ),
00451 bbsx2( mgi.get_nr(0) ),
00452 ff(*(mgi.get_angu()), fich) ,
00453 gg(*(mgi.get_angu()), fich)
00454 {
00455
00456
00457
00458
00459
00460 int nz = mg->get_nzone() ;
00461 alpha = new double[nz] ;
00462 beta = new double[nz] ;
00463 fread_be(alpha, sizeof(double), nz, fich) ;
00464 fread_be(beta, sizeof(double), nz, fich) ;
00465
00466
00467
00468 set_coord() ;
00469
00470
00471
00472
00473 fait_poly() ;
00474
00475 }
00476
00477
00478
00479
00480
00481 Map_et::~Map_et() {
00482
00483 delete [] alpha ;
00484 delete [] beta ;
00485
00486 for (int l=0 ; l<mg->get_nzone(); l++) {
00487 delete aa[l] ;
00488 delete daa[l] ;
00489 delete ddaa[l] ;
00490 delete bb[l] ;
00491 delete dbb[l] ;
00492 delete ddbb[l] ;
00493 }
00494 delete [] aa ;
00495 delete [] daa ;
00496 delete [] ddaa ;
00497 delete [] bb ;
00498 delete [] dbb ;
00499 delete [] ddbb ;
00500
00501 }
00502
00503
00504
00505
00506
00507
00508 void Map_et::operator=(const Map_et& mpi) {
00509
00510 assert(mpi.get_mg() == mg) ;
00511
00512 set_ori( mpi.get_ori_x(), mpi.get_ori_y(), mpi.get_ori_z() ) ;
00513
00514 set_rot_phi( mpi.get_rot_phi() ) ;
00515
00516
00517
00518
00519 for (int l=0; l<mg->get_nzone(); l++){
00520 alpha[l] = mpi.get_alpha()[l] ;
00521 beta[l] = mpi.get_beta()[l] ;
00522 }
00523
00524 ff = mpi.ff ;
00525 gg = mpi.gg ;
00526
00527 reset_coord() ;
00528
00529 }
00530
00531
00532
00533
00534 void Map_et::operator=(const Map_af& mpi) {
00535
00536 assert(mpi.get_mg() == mg) ;
00537
00538 set_ori( mpi.get_ori_x(), mpi.get_ori_y(), mpi.get_ori_z() ) ;
00539
00540 set_rot_phi( mpi.get_rot_phi() ) ;
00541
00542
00543
00544
00545 for (int l=0; l<mg->get_nzone(); l++){
00546 alpha[l] = mpi.get_alpha()[l] ;
00547 beta[l] = mpi.get_beta()[l] ;
00548 }
00549
00550 ff = 0 ;
00551 gg = 0 ;
00552
00553 reset_coord() ;
00554
00555 }
00556
00557 void Map_et::set_ff(const Valeur& ffi) {
00558
00559 ff = ffi ;
00560
00561 reset_coord() ;
00562
00563 }
00564
00565 void Map_et::set_gg(const Valeur& ggi) {
00566
00567 gg = ggi ;
00568
00569 reset_coord() ;
00570
00571 }
00572
00573
00574
00575
00576
00577
00578
00579 void Map_et::set_coord(){
00580
00581
00582 r.set(this, map_et_fait_r) ;
00583 tet.set(this, map_et_fait_tet) ;
00584 phi.set(this, map_et_fait_phi) ;
00585 sint.set(this, map_et_fait_sint) ;
00586 cost.set(this, map_et_fait_cost) ;
00587 sinp.set(this, map_et_fait_sinp) ;
00588 cosp.set(this, map_et_fait_cosp) ;
00589
00590 x.set(this, map_et_fait_x) ;
00591 y.set(this, map_et_fait_y) ;
00592 z.set(this, map_et_fait_z) ;
00593
00594 xa.set(this, map_et_fait_xa) ;
00595 ya.set(this, map_et_fait_ya) ;
00596 za.set(this, map_et_fait_za) ;
00597
00598
00599 xsr.set(this, map_et_fait_xsr) ;
00600 dxdr.set(this, map_et_fait_dxdr) ;
00601 drdt.set(this, map_et_fait_drdt) ;
00602 stdrdp.set(this, map_et_fait_stdrdp) ;
00603 srdrdt.set(this, map_et_fait_srdrdt) ;
00604 srstdrdp.set(this, map_et_fait_srstdrdp) ;
00605 sr2drdt.set(this, map_et_fait_sr2drdt) ;
00606 sr2stdrdp.set(this, map_et_fait_sr2stdrdp) ;
00607 d2rdx2.set(this, map_et_fait_d2rdx2) ;
00608 lapr_tp.set(this, map_et_fait_lapr_tp) ;
00609 d2rdtdx.set(this, map_et_fait_d2rdtdx) ;
00610 sstd2rdpdx.set(this, map_et_fait_sstd2rdpdx) ;
00611 sr2d2rdt2.set(this, map_et_fait_sr2d2rdt2) ;
00612
00613
00614 rsxdxdr.set(this, map_et_fait_rsxdxdr) ;
00615 rsx2drdx.set(this, map_et_fait_rsx2drdx) ;
00616
00617 }
00618
00619
00620
00621
00622
00623 void Map_et::reset_coord() {
00624
00625
00626
00627 Map_radial::reset_coord() ;
00628
00629
00630
00631 rsxdxdr.del_t() ;
00632 rsx2drdx.del_t() ;
00633
00634 }
00635
00636
00637
00638
00639
00640 void Map_et::fait_poly() {
00641
00642 int nzone = mg->get_nzone() ;
00643
00644 aa = new Tbl*[nzone] ;
00645 daa = new Tbl*[nzone] ;
00646 ddaa = new Tbl*[nzone] ;
00647 bb = new Tbl*[nzone] ;
00648 dbb = new Tbl*[nzone] ;
00649 ddbb = new Tbl*[nzone] ;
00650
00651 for (int l=0; l<nzone; l++) {
00652 int nr = mg->get_nr(l) ;
00653 aa[l] = new Tbl(nr) ;
00654 daa[l] = new Tbl(nr) ;
00655 ddaa[l] = new Tbl(nr) ;
00656 bb[l] = new Tbl(nr) ;
00657 dbb[l] = new Tbl(nr) ;
00658 ddbb[l] = new Tbl(nr) ;
00659 }
00660
00661
00662
00663 assert( mg->get_type_r(0) == RARE || mg->get_type_r(0) == FINJAC ) ;
00664
00665 aa[0]->set_etat_qcq() ;
00666 daa[0]->set_etat_qcq() ;
00667 ddaa[0]->set_etat_qcq() ;
00668 aasx.set_etat_qcq() ;
00669 aasx2.set_etat_qcq() ;
00670
00671 bb[0]->set_etat_qcq() ;
00672 dbb[0]->set_etat_qcq() ;
00673 ddbb[0]->set_etat_qcq() ;
00674 bbsx.set_etat_qcq() ;
00675 bbsx2.set_etat_qcq() ;
00676
00677 for (int i=0; i<mg->get_nr(0); i++) {
00678
00679 double x1 = (mg->get_grille3d(0))->x[i] ;
00680 double x2 = x1 * x1 ;
00681 double x3 = x1 * x2 ;
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692 aa[0]->set(i) = x2 * x2 * (3. - 2.*x2) ;
00693 daa[0]->set(i) = 12. * x3 * (1. + x1) * (1. - x1) ;
00694 ddaa[0]->set(i) = 12. *x2 *(3. - 5.* x2) ;
00695 aasx.set(i) = x3 * (3. - 2.*x2) ;
00696 aasx2.set(i) = x2 * (3. - 2.*x2) ;
00697
00698
00699
00700 bb[0]->set(i) = 0.5 * x3 * (5. - 3.* x2) ;
00701 dbb[0]->set(i) = 7.5 * x2 * (1. + x1) * (1. - x1) ;
00702 ddbb[0]->set(i) = 15. * x1 * ( 1. - 2.*x2 ) ;
00703 bbsx.set(i) = 0.5 * x2 * (5. - 3.* x2) ;
00704 bbsx2.set(i) = 0.5 * x1 * (5. - 3.* x2) ;
00705 }
00706
00707
00708
00709
00710 for (int l=1; l<nzone; l++) {
00711
00712 assert( (mg->get_type_r(l) == FIN)|| (mg->get_type_r(l) == UNSURR) ) ;
00713
00714 aa[l]->set_etat_qcq() ;
00715 daa[l]->set_etat_qcq() ;
00716 ddaa[l]->set_etat_qcq() ;
00717
00718 bb[l]->set_etat_qcq() ;
00719 dbb[l]->set_etat_qcq() ;
00720 ddbb[l]->set_etat_qcq() ;
00721
00722 for (int i=0; i<mg->get_nr(l); i++) {
00723
00724 double x1 = (mg->get_grille3d(l))->x[i] ;
00725 double xm1 = x1 - 1. ;
00726 double xp1 = x1 + 1. ;
00727
00728
00729
00730 aa[l]->set(i) = 0.25* xm1 * xm1 * (x1 + 2.) ;
00731 daa[l]->set(i) = 0.75* xm1 * xp1 ;
00732 ddaa[l]->set(i) = 1.5* x1 ;
00733
00734
00735
00736 bb[l]->set(i) = 0.25* xp1 * xp1 * (2. - x1) ;
00737 dbb[l]->set(i) = - 0.75* xm1 * xp1 ;
00738 ddbb[l]->set(i) = - 1.5* x1 ;
00739 }
00740
00741 }
00742
00743
00744
00745
00746 int nzm1 = nzone - 1 ;
00747 if ( mg->get_type_r(nzm1) == UNSURR ) {
00748
00749 zaasx.set_etat_qcq() ;
00750 zaasx2.set_etat_qcq() ;
00751
00752 for (int i=0; i<mg->get_nr(nzm1); i++) {
00753
00754 double x1 = (mg->get_grille3d(nzm1))->x[i] ;
00755 zaasx.set(i) = 0.25 * (x1 - 1.) * (2. + x1) ;
00756 zaasx2.set(i) = 0.25 * (2. + x1) ;
00757
00758 }
00759
00760 bb[nzm1]->set_etat_zero() ;
00761 dbb[nzm1]->set_etat_zero() ;
00762 ddbb[nzm1]->set_etat_zero() ;
00763
00764 }
00765
00766 }
00767
00768
00769
00770
00771
00772
00773
00774 void Map_et::sauve(FILE* fich) const {
00775
00776 Map_radial::sauve(fich) ;
00777
00778
00779 ff.sauve(fich) ;
00780 gg.sauve(fich) ;
00781
00782
00783 int nz = mg->get_nzone() ;
00784 fwrite_be(alpha, sizeof(double), nz, fich) ;
00785 fwrite_be(beta, sizeof(double), nz, fich) ;
00786
00787 }
00788
00789
00790
00791
00792
00793 ostream & Map_et::operator>>(ostream & ost) const {
00794
00795 using namespace Unites ;
00796
00797 ost <<
00798 "Radial mapping of form r = xi + A(xi)F(t,p) + B(xi)G(t,p) (class Map_et)"
00799 << endl ;
00800 int nz = mg->get_nzone() ;
00801 for (int l=0; l<nz; l++) {
00802 ost << " Domain #" << l << " : alpha_l = " << alpha[l]
00803 << " , beta_l = " << beta[l] << endl ;
00804 }
00805 ost << endl << "Function F(theta', phi') : " << endl ;
00806 ost << "------------------------- " << endl ;
00807 ff.affiche_seuil(ost) ;
00808 ost << endl <<"Function G(theta', phi') : " << endl ;
00809 ost << "------------------------- " << endl ;
00810 gg.affiche_seuil(ost) ;
00811
00812 int type_t = mg->get_type_t() ;
00813 int type_p = mg->get_type_p() ;
00814
00815 ost << endl
00816 << "Values of r at the outer boundary of each domain [km] :" << endl ;
00817 ost << "------------------------------------------------------" << endl ;
00818 ost << " 1/ for theta = Pi/2 and phi = 0 : " << endl ;
00819 ost << " val_r : " ;
00820 for (int l=0; l<nz; l++) {
00821 ost << " " << val_r(l, 1., M_PI/2, 0) / km ;
00822 }
00823 ost << endl ;
00824
00825 if ( type_t == SYM ) {
00826 assert( (type_p == SYM) || (type_p == NONSYM) ) ;
00827 ost << " Coord r : " ;
00828 for (int l=0; l<nz; l++) {
00829 int nrm1 = mg->get_nr(l) - 1 ;
00830 int ntm1 = mg->get_nt(l) - 1 ;
00831 ost << " " << (+r)(l, 0, ntm1, nrm1) / km ;
00832 }
00833 ost << endl ;
00834 }
00835
00836 ost << " 2/ for theta = Pi/2 and phi = Pi/2 : " << endl ;
00837 ost << " val_r : " ;
00838 for (int l=0; l<nz; l++) {
00839 ost << " " << val_r(l, 1., M_PI/2, M_PI/2) / km ;
00840 }
00841 ost << endl ;
00842
00843 if ( type_t == SYM ) {
00844 ost << " Coord r : " ;
00845 for (int l=0; l<nz; l++) {
00846 int nrm1 = mg->get_nr(l) - 1 ;
00847 int ntm1 = mg->get_nt(l) - 1 ;
00848 int np = mg->get_np(l) ;
00849 if ( (type_p == NONSYM) && (np % 4 == 0) ) {
00850 ost << " " << (+r)(l, np/4, ntm1, nrm1) / km ;
00851 }
00852 if ( type_p == SYM ) {
00853 ost << " " << (+r)(l, np/2, ntm1, nrm1) / km ;
00854 }
00855 }
00856 ost << endl ;
00857 }
00858
00859 ost << " 3/ for theta = Pi/2 and phi = Pi : " << endl ;
00860 ost << " val_r : " ;
00861 for (int l=0; l<nz; l++) {
00862 ost << " " << val_r(l, 1., M_PI/2, M_PI) / km ;
00863 }
00864 ost << endl ;
00865
00866 if ( (type_t == SYM) && (type_p == NONSYM) ) {
00867 ost << " Coord r : " ;
00868 for (int l=0; l<nz; l++) {
00869 int nrm1 = mg->get_nr(l) - 1 ;
00870 int ntm1 = mg->get_nt(l) - 1 ;
00871 int np = mg->get_np(l) ;
00872 ost << " " << (+r)(l, np/2, ntm1, nrm1) / km ;
00873 }
00874 ost << endl ;
00875 }
00876
00877 ost << " 4/ for theta = 0 : " << endl ;
00878 ost << " val_r : " ;
00879 for (int l=0; l<nz; l++) {
00880 ost << " " << val_r(l, 1., 0., 0.) / km ;
00881 }
00882 ost << endl ;
00883
00884 ost << " Coord r : " ;
00885 for (int l=0; l<nz; l++) {
00886 int nrm1 = mg->get_nr(l) - 1 ;
00887 ost << " " << (+r)(l, 0, 0, nrm1) / km ;
00888 }
00889 ost << endl ;
00890
00891 return ost ;
00892
00893 }
00894
00895
00896
00897
00898
00899
00900 void Map_et::homothetie(double fact) {
00901
00902 int nz = mg->get_nzone() ;
00903
00904 for (int l=0; l<nz; l++) {
00905 if (mg->get_type_r(l) == UNSURR) {
00906 alpha[l] /= fact ;
00907 beta[l] /= fact ;
00908 }
00909 else {
00910 alpha[l] *= fact ;
00911 beta[l] *= fact ;
00912 }
00913 }
00914
00915 reset_coord() ;
00916
00917 }
00918
00919
00920
00921
00922
00923 void Map_et::resize(int l, double lambda) {
00924
00925
00926
00927 if (mg->get_type_r(l) != FIN) {
00928 cout << "Map_et::resize can be applied only to a shell !" << endl ;
00929 abort() ;
00930 }
00931
00932
00933
00934 double n_alpha = 0.5 * ( (lambda + 1.) * alpha[l] +
00935 (lambda - 1.) * beta[l] ) ;
00936
00937 double n_beta = 0.5 * ( (lambda - 1.) * alpha[l] +
00938 (lambda + 1.) * beta[l] ) ;
00939
00940 ff.set(l) = alpha[l] / n_alpha * ff(l) ;
00941 gg.set(l) = lambda * alpha[l] / n_alpha * gg(l) ;
00942
00943 alpha[l] = n_alpha ;
00944 beta[l] = n_beta ;
00945
00946
00947
00948 assert(l<mg->get_nzone()-1) ;
00949 int lp1 = l + 1 ;
00950
00951 if (mg->get_type_r(lp1) == UNSURR) {
00952
00953 assert(ff(lp1).get_etat() == ETATZERO ) ;
00954 assert(gg(lp1).get_etat() == ETATZERO ) ;
00955
00956 alpha[lp1] = - 0.5 / ( alpha[l] + beta[l] ) ;
00957 beta[lp1] = - alpha[lp1] ;
00958
00959 }
00960 else{
00961
00962 assert( mg->get_type_r(lp1) == FIN ) ;
00963 n_alpha = 0.5 * ( alpha[lp1] - alpha[l] + beta[lp1] - beta[l] ) ;
00964 n_beta = 0.5 * ( alpha[lp1] + alpha[l] + beta[lp1] + beta[l] ) ;
00965
00966 ff.set(lp1) = alpha[l] / n_alpha * gg(l) ;
00967 gg.set(lp1) = alpha[lp1] / n_alpha * gg(lp1) ;
00968
00969 alpha[lp1] = n_alpha ;
00970 beta[lp1] = n_beta ;
00971 }
00972
00973
00974 reset_coord() ;
00975 }
00976
00977
00978
00979 bool Map_et::operator==(const Map& mpi) const {
00980
00981
00982 double precis = 1e-10 ;
00983 bool resu = true ;
00984
00985
00986 const Map_et* mp0 = dynamic_cast<const Map_et*>(&mpi) ;
00987 if (mp0 == 0x0)
00988 resu = false ;
00989 else {
00990 if (*mg != *(mpi.get_mg()))
00991 resu = false ;
00992
00993 if (fabs(ori_x-mpi.get_ori_x()) > precis) resu = false ;
00994 if (fabs(ori_y-mpi.get_ori_y()) > precis) resu = false ;
00995 if (fabs(ori_z-mpi.get_ori_z()) > precis) resu = false ;
00996
00997 if (bvect_spher != mpi.get_bvect_spher()) resu = false ;
00998 if (bvect_cart != mpi.get_bvect_cart()) resu = false ;
00999
01000 int nz = mg->get_nzone() ;
01001 for (int i=0 ; i<nz ; i++) {
01002 if (fabs(alpha[i]-mp0->alpha[i])/fabs(alpha[i]) > precis)
01003 resu = false ;
01004 if ((i!=0) && (i!=nz-1))
01005 if (fabs(beta[i]-mp0->beta[i])/fabs(beta[i]) > precis)
01006 resu = false ;
01007 }
01008
01009 if (max(diffrelmax(ff, mp0->ff)) > precis)
01010 resu = false ;
01011 if (max(diffrelmax(gg, mp0->gg)) > precis)
01012 resu = false ;
01013 }
01014
01015 return resu ;
01016 }
01017
01018
01019
01020
01021 const double* Map_et::get_alpha() const {
01022 return alpha ;
01023 }
01024
01025 const double* Map_et::get_beta() const {
01026 return beta ;
01027 }
01028
01029 const Valeur& Map_et::get_ff() const {
01030 return ff ;
01031 }
01032
01033 const Valeur& Map_et::get_gg() const {
01034 return gg ;
01035 }
01036
01037
01038
01039
01040 const Map_af& Map_et::mp_angu(int) const {
01041 const char* f = __FILE__ ;
01042 c_est_pas_fait(f) ;
01043 p_mp_angu = new Map_af(*this) ;
01044 return *p_mp_angu ;
01045 }
01046