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 char map_et_radius_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_radius.C,v 1.4 2008/08/27 08:49:16 jl_cornou Exp $" ;
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 #include "map.h"
00070 #include "param.h"
00071 #include "nbr_spx.h"
00072 #include "utilitaires.h"
00073
00074
00075 double fonc_invr_map_et_noyau(double, const Param&) ;
00076 double fonc_invr_map_et_coq(double, const Param&) ;
00077 double fonc_invr_map_et_zec(double, const Param&) ;
00078
00079
00080
00081
00082
00083
00084 double Map_et::val_r(int l, double xi, double theta, double pphi) const {
00085
00086 assert( l>=0 ) ;
00087 assert( l<mg->get_nzone() ) ;
00088
00089 double resu ;
00090 double ftp = ff.val_point(l, 0, theta, pphi) ;
00091
00092 switch( mg->get_type_r(l) ) {
00093
00094 case RARE: {
00095 double gtp = gg.val_point(l, 0, theta, pphi) ;
00096 double xi_2 = xi * xi ;
00097 double xi_3 = xi * xi_2 ;
00098 double a = xi_2 * xi_2 * (3. - 2.*xi_2) ;
00099 double b = ( 2.5 - 1.5 * xi_2 ) * xi_3 ;
00100 resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00101 break ;
00102 }
00103
00104 case FINJAC: {
00105 double gtp = gg.val_point(l, 0, theta, pphi) ;
00106 double xm1 = xi - 1. ;
00107 double xp1 = xi + 1. ;
00108 double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00109 double b = 0.25* xp1 * xp1 * (2. - xi) ;
00110 resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00111 break ;
00112 }
00113
00114 case FIN: {
00115 double gtp = gg.val_point(l, 0, theta, pphi) ;
00116 double xm1 = xi - 1. ;
00117 double xp1 = xi + 1. ;
00118 double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00119 double b = 0.25* xp1 * xp1 * (2. - xi) ;
00120 resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00121 break ;
00122 }
00123
00124 case UNSURR: {
00125 double xm1 = xi - 1. ;
00126 double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00127 resu = double(1) / ( alpha[l] * ( xi + a * ftp ) + beta[l] ) ;
00128 break ;
00129 }
00130
00131 default: {
00132 cout << "Map_et::val_r: unknown type_r ! " << endl ;
00133 abort () ;
00134 }
00135 }
00136
00137 return resu ;
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 void Map_et::val_lx(double rr, double theta, double pphi,
00149 int& lz, double& xi) const {
00150
00151 int nitermax = 100 ;
00152 int niter ;
00153 double precis = 1e-14 ;
00154
00155 Param par ;
00156 par.add_int(nitermax) ;
00157 par.add_int_mod(niter) ;
00158 par.add_double(precis) ;
00159
00160
00161
00162 val_lx(rr, theta, pphi, par, lz, xi) ;
00163
00164 }
00165
00166
00167
00168
00169
00170
00171 void Map_et::val_lx(double rr, double theta, double pphi,
00172 const Param& par, int& lz, double& xi) const {
00173
00174 int nz = mg->get_nzone() ;
00175
00176
00177
00178
00179 int nitermax = par.get_int() ;
00180 int& niter = par.get_int_mod() ;
00181 niter = 0 ;
00182 double precis = par.get_double() ;
00183
00184
00185
00186 if (rr == __infinity) {
00187 if ( (mg->get_type_r(nz-1) == UNSURR) &&
00188 (alpha[nz-1] == - beta[nz-1]) ) {
00189 lz = nz - 1 ;
00190 xi = 1 ;
00191 }
00192 else {
00193 cout.precision(16);
00194 cout.setf(ios::showpoint);
00195 cout << "Map_et::val_lx: the domain containing r = " << rr <<
00196 " has not been found ! "
00197 << endl ;
00198 abort () ;
00199 }
00200 return ;
00201 }
00202
00203
00204
00205
00206 lz = - 1 ;
00207 double rmax = 0. ;
00208 double ftp = double(0) ;
00209 double gtp = double(0) ;
00210 for (int l=0; l<nz; l++) {
00211
00212 switch( mg->get_type_r(l) ) {
00213
00214 case RARE: {
00215 ftp = ff.val_point(l, 0, theta, pphi) ;
00216 gtp = gg.val_point(l, 0, theta, pphi) ;
00217 rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00218 break ;
00219 }
00220
00221 case FINJAC: {
00222 ftp = double(0) ;
00223 gtp = gg.val_point(l, 0, theta, pphi) ;
00224 rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00225 break ;
00226 }
00227
00228 case FIN: {
00229 ftp = double(0) ;
00230 gtp = gg.val_point(l, 0, theta, pphi) ;
00231 rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00232 break ;
00233 }
00234
00235 case UNSURR: {
00236 ftp = double(0) ;
00237 gtp = double(0) ;
00238 rmax = double(1) / ( alpha[l] + beta[l] ) ;
00239 break ;
00240 }
00241
00242 default: {
00243 cout << "Map_et::val_lx: unknown type_r ! " << endl ;
00244 abort() ;
00245 }
00246 }
00247
00248
00249 if ( rr <= rmax + 1.e-14 ) {
00250 lz = l ;
00251 if (ftp == double(0)) ftp = ff.val_point(l, 0, theta, pphi) ;
00252 if (gtp == double(0)) gtp = gg.val_point(l, 0, theta, pphi) ;
00253 break ;
00254 }
00255 }
00256
00257 if (lz == -1) {
00258 cout.precision(16);
00259 cout.setf(ios::showpoint);
00260 cout << "Map_et::val_lx: the domain containing r = " << rr <<
00261 " has not been found ! "
00262 << endl ;
00263 for (int l=0; l<nz; l++) {
00264 ftp = ff.val_point(l, 0, theta, pphi) ;
00265 gtp = gg.val_point(l, 0, theta, pphi) ;
00266 switch( mg->get_type_r(l) ) {
00267 case RARE: {
00268 rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00269 break ;
00270 }
00271 case FIN: {
00272 rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00273 break ;
00274 }
00275 case UNSURR: {
00276 rmax = double(1) / ( alpha[l] + beta[l] ) ;
00277 break ;
00278 }
00279 default: {
00280 cout << "Map_et::val_lx: unknown type_r ! " << endl ;
00281 abort () ;
00282 }
00283 }
00284
00285 cout << "domain: " << l << " theta = " << theta << " phi = "
00286 << pphi << " : rmax = " << rmax << endl ;
00287 }
00288 abort() ;
00289 }
00290
00291
00292
00293
00294 if ( (rr >= rmax) && ( rr <= rmax + 1.e-14) ) {
00295 xi = double(1) ;
00296 }
00297 else {
00298
00299
00300
00301
00302 Param parzerosec ;
00303 parzerosec.add_double(rr, 0) ;
00304 parzerosec.add_double(ftp, 1) ;
00305 parzerosec.add_double(gtp, 2) ;
00306 parzerosec.add_double(alpha[lz], 3) ;
00307 parzerosec.add_double(beta[lz], 4) ;
00308
00309
00310 switch( mg->get_type_r(lz) ) {
00311
00312 case RARE: {
00313 if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00314 xi = ( rr - beta[lz] ) / alpha[lz] ;
00315 }
00316 else {
00317 double xmin = 0 ;
00318 double xmax = 1 ;
00319 xi = zerosec(fonc_invr_map_et_noyau, parzerosec, xmin, xmax,
00320 precis, nitermax, niter) ;
00321 }
00322 break ;
00323 }
00324
00325 case FINJAC: {
00326 if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00327 xi = ( rr - beta[lz] ) / alpha[lz] ;
00328 }
00329 else {
00330 double xmin = -1 ;
00331 double xmax = 1 ;
00332 xi = zerosec(fonc_invr_map_et_coq, parzerosec, xmin, xmax,
00333 precis, nitermax, niter) ;
00334 }
00335 break ;
00336 }
00337
00338 case FIN: {
00339 if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00340 xi = ( rr - beta[lz] ) / alpha[lz] ;
00341 }
00342 else {
00343 double xmin = -1 ;
00344 double xmax = 1 ;
00345 xi = zerosec(fonc_invr_map_et_coq, parzerosec, xmin, xmax,
00346 precis, nitermax, niter) ;
00347 }
00348 break ;
00349 }
00350
00351 case UNSURR: {
00352 if ( (ff.get_etat()==ETATZERO) ) {
00353 xi = ( double(1)/rr - beta[lz] ) / alpha[lz] ;
00354 }
00355 else {
00356 assert(ff.get_etat()==ETATQCQ) ;
00357 if ( ff.c->t[lz]->get_etat() == ETATZERO) {
00358 xi = ( double(1) / rr - beta[lz] ) / alpha[lz] ;
00359 }
00360 else {
00361 double xmin = -1 ;
00362 double xmax = 1 ;
00363 xi = zerosec(fonc_invr_map_et_zec, parzerosec, xmin, xmax,
00364 precis, nitermax, niter) ;
00365 }
00366 }
00367 break ;
00368 }
00369
00370 default: {
00371 cout << "Map_et::val_lx: unknown type_r ! " << endl ;
00372 abort () ;
00373 }
00374 }
00375
00376
00377 }
00378
00379 }
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 double Map_et::val_r_jk(int l, double xi, int j, int k) const {
00390
00391 assert( l>=0 ) ;
00392 assert( l<mg->get_nzone() ) ;
00393
00394 double resu ;
00395 double ftp = ff(l, k, j, 0) ;
00396
00397 switch( mg->get_type_r(l) ) {
00398
00399 case RARE: {
00400 double gtp = gg(l, k, j, 0) ;
00401 double xi_2 = xi * xi ;
00402 double xi_3 = xi * xi_2 ;
00403 double a = xi_2 * xi_2 * (3. - 2.*xi_2) ;
00404 double b = ( 2.5 - 1.5 * xi_2 ) * xi_3 ;
00405 resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00406 break ;
00407 }
00408
00409 case FIN: {
00410 double gtp = gg(l, k, j, 0) ;
00411 double xm1 = xi - 1. ;
00412 double xp1 = xi + 1. ;
00413 double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00414 double b = 0.25* xp1 * xp1 * (2. - xi) ;
00415 resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00416 break ;
00417 }
00418
00419 case FINJAC: {
00420 double gtp = gg(l, k, j, 0) ;
00421 double xm1 = xi - 1. ;
00422 double xp1 = xi + 1. ;
00423 double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00424 double b = 0.25* xp1 * xp1 * (2. - xi) ;
00425 resu = alpha[l] * ( xi + a * ftp + b * gtp ) + beta[l] ;
00426 break ;
00427 }
00428
00429 case UNSURR: {
00430 double xm1 = xi - 1. ;
00431 double a = 0.25* xm1 * xm1 * (xi + 2.) ;
00432 resu = double(1) / ( alpha[l] * ( xi + a * ftp ) + beta[l] ) ;
00433 break ;
00434 }
00435
00436 default: {
00437 cout << "Map_et::val_r_jk: unknown type_r ! " << endl ;
00438 abort () ;
00439 }
00440 }
00441
00442 return resu ;
00443
00444 }
00445
00446
00447
00448
00449
00450 void Map_et::val_lx_jk(double rr, int j, int k, const Param& par,
00451 int& lz, double& xi) const {
00452
00453 int nz = mg->get_nzone() ;
00454
00455
00456
00457
00458 int nitermax = par.get_int() ;
00459 int& niter = par.get_int_mod() ;
00460 niter = 0 ;
00461 double precis = par.get_double() ;
00462
00463
00464
00465 if (rr == __infinity) {
00466 if ( (mg->get_type_r(nz-1) == UNSURR) &&
00467 (alpha[nz-1] == - beta[nz-1]) ) {
00468 lz = nz - 1 ;
00469 xi = 1 ;
00470 }
00471 else {
00472 cout.precision(16);
00473 cout.setf(ios::showpoint);
00474 cout << "Map_et::val_lx_jk: the domain containing r = " << rr <<
00475 " has not been found ! "
00476 << endl ;
00477 abort () ;
00478 }
00479 return ;
00480 }
00481
00482
00483
00484
00485 lz = - 1 ;
00486 double rmax = 0 ;
00487 double ftp = double(0) ;
00488 double gtp = double(0) ;
00489 for (int l=0; l<nz; l++) {
00490
00491 switch( mg->get_type_r(l) ) {
00492
00493 case RARE: {
00494 ftp = ff(l, k, j, 0) ;
00495 gtp = gg(l, k, j, 0) ;
00496 rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00497 break ;
00498 }
00499
00500 case FIN: {
00501 ftp = double(0) ;
00502 gtp = gg(l, k, j, 0) ;
00503 rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00504 break ;
00505 }
00506
00507 case UNSURR: {
00508 ftp = double(0) ;
00509 gtp = double(0) ;
00510 rmax = double(1) / ( alpha[l] + beta[l] ) ;
00511 break ;
00512 }
00513
00514 default: {
00515 cout << "Map_et::val_lx_jk: unknown type_r ! " << endl ;
00516 abort() ;
00517 }
00518 }
00519
00520
00521 if ( rr <= rmax + 1.e-14 ) {
00522 lz = l ;
00523 if (ftp == double(0)) ftp = ff(l, k, j, 0) ;
00524 if (gtp == double(0)) gtp = gg(l, k, j, 0) ;
00525 break ;
00526 }
00527 }
00528
00529 if (lz == -1) {
00530 cout.precision(16);
00531 cout.setf(ios::showpoint);
00532 cout << "Map_et::val_lx_jk: the domain containing r = " << rr <<
00533 " has not been found ! "
00534 << endl ;
00535 for (int l=0; l<nz; l++) {
00536 ftp = ff(l, k, j, 0) ;
00537 gtp = gg(l, k, j, 0) ;
00538 switch( mg->get_type_r(l) ) {
00539 case RARE: {
00540 rmax = alpha[l] * ( double(1) + ftp + gtp ) + beta[l] ;
00541 break ;
00542 }
00543 case FIN: {
00544 rmax = alpha[l] * ( double(1) + gtp ) + beta[l] ;
00545 break ;
00546 }
00547 case UNSURR: {
00548 rmax = double(1) / ( alpha[l] + beta[l] ) ;
00549 break ;
00550 }
00551 default: {
00552 cout << "Map_et::val_lx_jk: unknown type_r ! " << endl ;
00553 abort () ;
00554 }
00555 }
00556
00557 cout << "domain: " << l << " j = " << j << " k = " << k
00558 << " : rmax = " << rmax << endl ;
00559 }
00560 abort() ;
00561 }
00562
00563
00564
00565
00566 if ( (rr >= rmax) && ( rr <= rmax + 1.e-14) ) {
00567 xi = double(1) ;
00568 }
00569 else {
00570
00571
00572
00573
00574 Param parzerosec ;
00575 parzerosec.add_double(rr, 0) ;
00576 parzerosec.add_double(ftp, 1) ;
00577 parzerosec.add_double(gtp, 2) ;
00578 parzerosec.add_double(alpha[lz], 3) ;
00579 parzerosec.add_double(beta[lz], 4) ;
00580
00581
00582 switch( mg->get_type_r(lz) ) {
00583
00584 case RARE: {
00585 if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00586 xi = ( rr - beta[lz] ) / alpha[lz] ;
00587 }
00588 else {
00589 double xmin = 0 ;
00590 double xmax = 1 ;
00591 xi = zerosec(fonc_invr_map_et_noyau, parzerosec, xmin, xmax,
00592 precis, nitermax, niter) ;
00593 }
00594 break ;
00595 }
00596
00597 case FIN: {
00598 if ( (ff.get_etat()==ETATZERO) && (gg.get_etat()==ETATZERO) ) {
00599 xi = ( rr - beta[lz] ) / alpha[lz] ;
00600 }
00601 else {
00602 double xmin = -1 ;
00603 double xmax = 1 ;
00604 xi = zerosec(fonc_invr_map_et_coq, parzerosec, xmin, xmax,
00605 precis, nitermax, niter) ;
00606 }
00607 break ;
00608 }
00609
00610 case UNSURR: {
00611 if ( (ff.get_etat()==ETATZERO) ) {
00612 xi = ( double(1)/rr - beta[lz] ) / alpha[lz] ;
00613 }
00614 else {
00615 assert(ff.get_etat()==ETATQCQ) ;
00616 if ( ff.c->t[lz]->get_etat() == ETATZERO) {
00617 xi = ( double(1) / rr - beta[lz] ) / alpha[lz] ;
00618 }
00619 else {
00620 double xmin = -1 ;
00621 double xmax = 1 ;
00622 xi = zerosec(fonc_invr_map_et_zec, parzerosec, xmin, xmax,
00623 precis, nitermax, niter) ;
00624 }
00625 }
00626 break ;
00627 }
00628
00629 default: {
00630 cout << "Map_et::val_lx_jk: unknown type_r ! " << endl ;
00631 abort () ;
00632 }
00633 }
00634
00635
00636 }
00637 }
00638
00639
00640
00641
00642
00643
00644 double fonc_invr_map_et_noyau(double x, const Param& par) {
00645
00646 double r = par.get_double(0) ;
00647 double f = par.get_double(1) ;
00648 double g = par.get_double(2) ;
00649 double alp = par.get_double(3) ;
00650 double bet = par.get_double(4) ;
00651 double x_2 = x * x ;
00652 double x_3 = x_2 * x ;
00653 double a = x_2 * x_2 * (3. - 2.*x_2) ;
00654 double b = ( 2.5 - 1.5 * x_2 ) * x_3 ;
00655
00656 return alp * ( x + a * f + b * g ) + bet - r ;
00657
00658 }
00659
00660
00661
00662 double fonc_invr_map_et_coq(double x, const Param& par) {
00663
00664 double r = par.get_double(0) ;
00665 double f = par.get_double(1) ;
00666 double g = par.get_double(2) ;
00667 double alp = par.get_double(3) ;
00668 double bet = par.get_double(4) ;
00669 double xm1 = x - 1. ;
00670 double xp1 = x + 1. ;
00671 double a = 0.25* xm1 * xm1 * (x + 2.) ;
00672 double b = 0.25* xp1 * xp1 * (2. - x) ;
00673
00674 return alp * ( x + a * f + b * g ) + bet - r ;
00675
00676 }
00677
00678
00679
00680 double fonc_invr_map_et_zec(double x, const Param& par) {
00681
00682 double r = par.get_double(0) ;
00683 double f = par.get_double(1) ;
00684 double alp = par.get_double(3) ;
00685 double bet = par.get_double(4) ;
00686 double xm1 = x - 1. ;
00687 double a = 0.25* xm1 * xm1 * (x + 2.) ;
00688
00689 return alp * ( x + a * f ) + bet - double(1) / r ;
00690
00691 }
00692