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 etoile_equil_spher_C[] = "$Header: /cvsroot/Lorene/C++/Source/Etoile/etoile_equil_spher.C,v 1.5 2008/11/14 13:48:06 e_gourgoulhon 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
00068
00069
00070
00071
00072
00073
00074 #include "math.h"
00075
00076
00077 #include "etoile.h"
00078 #include "param.h"
00079 #include "unites.h"
00080 #include "nbr_spx.h"
00081 #include "graphique.h"
00082
00083 void Etoile::equilibrium_spher(double ent_c, double precis, const Tbl* pent_limit){
00084
00085
00086
00087 using namespace Unites ;
00088
00089
00090
00091
00092 const Mg3d* mg = mp.get_mg() ;
00093 int nz = mg->get_nzone() ;
00094
00095
00096 int l_b = nzet - 1 ;
00097 int i_b = mg->get_nr(l_b) - 1 ;
00098 int j_b = mg->get_nt(l_b) - 1 ;
00099 int k_b = 0 ;
00100
00101
00102 double ent_b = 0 ;
00103
00104
00105
00106 ent = ent_c ;
00107 ent.annule(nzet, nz-1) ;
00108
00109
00110
00111 equation_of_state() ;
00112
00113
00114 a_car = 1 ;
00115 beta_auto = 0 ;
00116
00117
00118
00119
00120
00121
00122 Map_af mpaff(mp);
00123
00124 Param par_nul ;
00125
00126 Tenseur ent_jm1(mp) ;
00127 ent_jm1 = 0 ;
00128
00129 Tenseur source(mp) ;
00130 Tenseur logn(mp) ;
00131 Tenseur logn_quad(mp) ;
00132 logn = 0 ;
00133 logn_quad = 0 ;
00134
00135 Cmp dlogn(mp) ;
00136 Cmp dbeta(mp) ;
00137
00138 double diff_ent = 1 ;
00139 int mermax = 200 ;
00140
00141 double alpha_r = 1 ;
00142
00143
00144
00145
00146
00147 for(int mer=0 ; (diff_ent > precis) && (mer<mermax) ; mer++ ) {
00148
00149 cout << "-----------------------------------------------" << endl ;
00150 cout << "step: " << mer << endl ;
00151 cout << "alpha_r: " << alpha_r << endl ;
00152 cout << "diff_ent = " << diff_ent << endl ;
00153
00154
00155
00156
00157
00158
00159
00160 if (relativistic) {
00161 source = a_car * (ener + 3*press) ;
00162 }
00163 else {
00164 source = nbar ;
00165 }
00166
00167 (source.set()).set_dzpuis(4) ;
00168
00169 source.set_std_base() ;
00170
00171 logn_auto.set_etat_qcq() ;
00172
00173 mpaff.poisson(source(), par_nul, logn_auto.set()) ;
00174
00175
00176
00177
00178
00179
00180 if (relativistic) {
00181
00182 mpaff.dsdr(logn(), dlogn) ;
00183 mpaff.dsdr(beta_auto(), dbeta) ;
00184
00185 source = - dlogn * dbeta ;
00186
00187 logn_quad.set_etat_qcq() ;
00188
00189 mpaff.poisson(source(), par_nul, logn_quad.set()) ;
00190
00191 }
00192
00193
00194
00195
00196
00197
00198
00199
00200 double nu_mat0_b = logn_auto()(l_b, k_b, j_b, i_b) ;
00201 double nu_mat0_c = logn_auto()(0, 0, 0, 0) ;
00202
00203 double nu_quad0_b = logn_quad()(l_b, k_b, j_b, i_b) ;
00204 double nu_quad0_c = logn_quad()(0, 0, 0, 0) ;
00205
00206 double alpha_r2 = ( ent_c - ent_b - nu_quad0_b + nu_quad0_c )
00207 / ( qpig*(nu_mat0_b - nu_mat0_c) ) ;
00208
00209 alpha_r = sqrt(alpha_r2) ;
00210
00211
00212
00213
00214 if(nzet==1) {
00215
00216 mpaff.homothetie( alpha_r ) ;
00217
00218 }
00219
00220
00221
00222
00223
00224
00225 logn_auto = alpha_r2*qpig * logn_auto ;
00226 logn = logn_auto + logn_quad ;
00227
00228
00229 double logn_c = logn()(0, 0, 0, 0) ;
00230 ent = ent_c - logn() + logn_c ;
00231
00232
00233
00234 if(nzet>1) {
00235
00236
00237
00238
00239 Param par_adapt ;
00240 int nitermax = 100 ;
00241 int niter ;
00242 int adapt_flag = 1 ;
00243
00244
00245 int nz_search = nzet + 1 ;
00246
00247
00248 int nzadapt = nzet ;
00249
00250
00251
00252
00253 double precis_adapt = 1.e-14 ;
00254
00255 double reg_map = 1. ;
00256
00257 par_adapt.add_int(nitermax, 0) ;
00258
00259 par_adapt.add_int(nzadapt, 1) ;
00260
00261
00262 par_adapt.add_int(nz_search, 2) ;
00263
00264 par_adapt.add_int(adapt_flag, 3) ;
00265
00266
00267 par_adapt.add_int(j_b, 4) ;
00268
00269 par_adapt.add_int(k_b, 5) ;
00270
00271
00272 par_adapt.add_int_mod(niter, 0) ;
00273
00274
00275 par_adapt.add_double(precis_adapt, 0) ;
00276
00277
00278 par_adapt.add_double(reg_map, 1) ;
00279
00280 par_adapt.add_double(alpha_r, 2) ;
00281
00282
00283
00284 Tbl ent_limit(nzet) ;
00285 if (pent_limit != 0x0) ent_limit = *pent_limit ;
00286
00287 par_adapt.add_tbl(ent_limit, 0) ;
00288
00289
00290 double* bornes = new double[nz+1] ;
00291 bornes[0] = 0. ;
00292
00293 for(int l=0; l<nz; l++) {
00294
00295 bornes[l+1] = mpaff.get_alpha()[l] + mpaff.get_beta()[l] ;
00296
00297 }
00298 bornes[nz] = __infinity ;
00299
00300 Map_et mp0(*mg, bornes) ;
00301
00302 mp0 = mpaff;
00303 mp0.adapt(ent(), par_adapt) ;
00304
00305
00306
00307 double alphal, betal ;
00308
00309 for(int l=0; l<nz; l++) {
00310
00311 alphal = mp0.get_alpha()[l] ;
00312 betal = mp0.get_beta()[l] ;
00313
00314 mpaff.set_alpha(alphal, l) ;
00315 mpaff.set_beta(betal, l) ;
00316
00317 }
00318
00319
00320
00321 int num_r1 = mg->get_nr(0) - 1;
00322
00323 cout << "Pressure difference:" << get_press()()(0,0,0,num_r1) - get_press()()(1,0,0,0) << endl ;
00324 cout << "Difference in enthalpies at the domain boundary:" << endl ;
00325 cout << get_ent()()(0,0,0,num_r1) << endl ;
00326 cout << get_ent()()(1,0,0,0) << endl ;
00327
00328 cout << "Enthalpy difference: " << get_ent()()(0,0,0,num_r1) - get_ent()()(1,0,0,0) << endl ;
00329
00330
00331
00332
00333
00334
00335 }
00336
00337
00338
00339
00340
00341 equation_of_state() ;
00342
00343 if (relativistic) {
00344
00345
00346
00347
00348
00349 mpaff.dsdr(logn(), dlogn) ;
00350 mpaff.dsdr(beta_auto(), dbeta) ;
00351
00352 source = 3 * qpig * a_car * press ;
00353
00354 source = source()
00355 - 0.5 * ( dlogn * dlogn + dbeta * dbeta ) ;
00356
00357 source.set_std_base() ;
00358
00359 beta_auto.set_etat_qcq() ;
00360
00361 mpaff.poisson(source(), par_nul, beta_auto.set()) ;
00362
00363
00364
00365
00366 a_car = exp(2*(beta_auto - logn)) ;
00367
00368 }
00369
00370
00371
00372
00373 diff_ent = norme( diffrel(ent(), ent_jm1()) ) / nzet ;
00374
00375
00376
00377
00378 ent_jm1 = ent ;
00379
00380
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390 mp = mpaff ;
00391
00392
00393
00394
00395
00396
00397 ent.annule(nzet, nz-1) ;
00398
00399 ener_euler = ener ;
00400 s_euler = 3 * press ;
00401 gam_euler = 1 ;
00402 u_euler = 0 ;
00403
00404
00405 nnn = exp( unsurc2 * logn ) ;
00406 nnn.set_std_base() ;
00407 shift = 0 ;
00408 a_car.set_std_base() ;
00409
00410
00411
00412
00413 cout << endl
00414 << "Characteristics of the star obtained by Etoile::equilibrium_spher : "
00415 << endl
00416 << "-----------------------------------------------------------------"
00417 << endl ;
00418
00419 double ray = mp.val_r(l_b, 1., M_PI/2., 0) ;
00420 cout << "Coordinate radius : " << ray / km << " km" << endl ;
00421
00422 double rcirc = ray * sqrt( a_car()(l_b, k_b, j_b, i_b) ) ;
00423
00424 double compact = qpig/(4.*M_PI) * mass_g() / rcirc ;
00425
00426 cout << "Circumferential radius R : " << rcirc/km << " km" << endl ;
00427 cout << "Baryon mass : " << mass_b()/msol << " Mo" << endl ;
00428 cout << "Gravitational mass M : " << mass_g()/msol << " Mo" << endl ;
00429 cout << "Compacity parameter GM/(c^2 R) : " << compact << endl ;
00430
00431
00432
00433
00434
00435
00436
00437
00438 source = qpig * a_car * sqrt(a_car) * s_euler ;
00439 source.set_std_base() ;
00440 double vir_mat = source().integrale() ;
00441
00442
00443
00444 Cmp tmp = beta_auto() - logn() ;
00445
00446 source = - ( logn().dsdr() * logn().dsdr()
00447 - 0.5 * tmp.dsdr() * tmp.dsdr() )
00448 * sqrt(a_car()) ;
00449
00450 source.set_std_base() ;
00451 double vir_grav = source().integrale() ;
00452
00453
00454
00455 double grv3 = ( vir_mat + vir_grav ) / vir_mat ;
00456
00457 cout << "Virial theorem GRV3 : " << endl ;
00458 cout << " 3P term : " << vir_mat << endl ;
00459 cout << " grav. term : " << vir_grav << endl ;
00460 cout << " relative error : " << grv3 << endl ;
00461
00462 if (nzet > 1) {
00463 cout.precision(10) ;
00464
00465 for (int ltrans = 0; ltrans < nzet-1; ltrans++) {
00466 cout << endl << "Values at boundary between domains no. " << ltrans << " and " << ltrans+1 << " for theta = pi/2 and phi = 0 :" << endl ;
00467
00468 double rt1 = mp.val_r(ltrans, 1., M_PI/2, 0.) ;
00469 double rt2 = mp.val_r(ltrans+1, -1., M_PI/2, 0.) ;
00470 cout << " Coord. r [km] (left, right, rel. diff) : "
00471 << rt1 / km << " " << rt2 / km << " " << (rt2 - rt1)/rt1 << endl ;
00472
00473 int ntm1 = mg->get_nt(ltrans) - 1;
00474 int nrm1 = mg->get_nr(ltrans) - 1 ;
00475 double ent1 = ent()(ltrans, 0, ntm1, nrm1) ;
00476 double ent2 = ent()(ltrans+1, 0, ntm1, 0) ;
00477 cout << " Enthalpy (left, right, rel. diff) : "
00478 << ent1 << " " << ent2 << " " << (ent2-ent1)/ent1 << endl ;
00479
00480 double press1 = press()(ltrans, 0, ntm1, nrm1) ;
00481 double press2 = press()(ltrans+1, 0, ntm1, 0) ;
00482 cout << " Pressure (left, right, rel. diff) : "
00483 << press1 << " " << press2 << " " << (press2-press1)/press1 << endl ;
00484
00485 double nb1 = nbar()(ltrans, 0, ntm1, nrm1) ;
00486 double nb2 = nbar()(ltrans+1, 0, ntm1, 0) ;
00487 cout << " Baryon density (left, right, rel. diff) : "
00488 << nb1 << " " << nb2 << " " << (nb2-nb1)/nb1 << endl ;
00489 }
00490 }
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500 }