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 char et_bin_vel_pot_C[] = "$Header: /cvsroot/Lorene/C++/Source/Etoile/et_bin_vel_pot.C,v 1.14 2007/10/18 14:26:43 e_gourgoulhon Exp $" ;
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
00124
00125
00126
00127 #include "scalar.h"
00128 #include "metrique.h"
00129 #include "etoile.h"
00130 #include "eos.h"
00131 #include "param.h"
00132 #include "et_bin_nsbh.h"
00133 #include "utilitaires.h"
00134
00135
00136 Cmp raccord_c1(const Cmp& uu, int l1) ;
00137
00138 double Etoile_bin::velocity_potential(int mermax, double precis, double relax) {
00139
00140
00141 const Et_bin_nsbh* pnsbh = dynamic_cast<const Et_bin_nsbh*>(this) ;
00142
00143 if (eos.identify() == 5 || eos.identify() == 4 ||
00144 eos.identify() == 3) {
00145
00146
00147
00148 int nzm1 = mp.get_mg()->get_nzone() - 1 ;
00149
00150
00151
00152
00153
00154 Tenseur hhh = exp(unsurc2 * ent) ;
00155 hhh.set_std_base() ;
00156
00157
00158
00159
00160
00161
00162 Tenseur www = - a_car * hhh * gam_euler * bsn ;
00163
00164 www.change_triad( mp.get_bvect_cart() ) ;
00165
00166
00167
00168
00169
00170
00171 Tenseur v_orb(mp, 1, CON, mp.get_bvect_cart()) ;
00172
00173 v_orb.set_etat_qcq() ;
00174 for (int i=0; i<3; i++) {
00175 v_orb.set(i) = www(i)(0, 0, 0, 0) ;
00176 }
00177
00178 v_orb.annule(nzm1, nzm1) ;
00179
00180
00181 v_orb.set_triad( *(www.get_triad()) ) ;
00182 v_orb.set_std_base() ;
00183
00184
00185
00186
00187
00188
00189 Cmp dndh_log = eos.der_nbar_ent(ent(), nzet) ;
00190
00191
00192
00193 for (int l=nzet; l <= nzm1; l++) {
00194 dndh_log.set(l) = 1 ;
00195 }
00196
00197 double erreur ;
00198
00199 Tenseur zeta_h( ent() / dndh_log ) ;
00200 zeta_h.set_std_base() ;
00201
00202 Scalar zeta_h_scalar (zeta_h()) ;
00203 zeta_h_scalar.set_outer_boundary(0, (ent() / dndh_log)(0,0,0,0)) ;
00204 for (int l=1; l<=nzm1; l++)
00205 zeta_h_scalar.set_domain(l) = 1 ;
00206
00207 Cmp zeta_h_cmp (zeta_h_scalar) ;
00208 zeta_h.set() = zeta_h_cmp ;
00209 zeta_h.set_std_base() ;
00210
00211
00212
00213 Tenseur beta(mp) ;
00214
00215 if (pnsbh!=0x0) {
00216 beta = log( sqrt(a_car) * nnn ) ;
00217 beta.set_std_base() ;
00218 }
00219 else {
00220 beta = beta_auto + beta_comp ;
00221 }
00222
00223 Tenseur tmp_zeta = 1 - unsurc2 * zeta_h ;
00224 tmp_zeta.set_std_base() ;
00225
00226 Tenseur bb = tmp_zeta * ent.gradient_spher()
00227 + unsurc2 * zeta_h * beta.gradient_spher() ;
00228
00229 Tenseur entmb = ent - beta ;
00230
00231 Tenseur grad_ent (ent.gradient()) ;
00232 grad_ent.change_triad(mp.get_bvect_spher()) ;
00233
00234
00235
00236 Tenseur source = flat_scalar_prod( www - v_orb, ent.gradient() )
00237 + unsurc2 * zeta_h * (
00238 flat_scalar_prod( v_orb, entmb.gradient() )
00239 + flat_scalar_prod( www, gam_euler.gradient() )
00240 / gam_euler ) ;
00241
00242 for (int l=1; l<=nzm1; l++)
00243 source.set().annule(l) ;
00244
00245 source = (source - flat_scalar_prod(bb, psi0.gradient_spher()))
00246 / zeta_h ;
00247 source.annule(nzet, nzm1) ;
00248
00249 Param par ;
00250 int niter ;
00251 par.add_int(mermax) ;
00252 par.add_double(precis, 0) ;
00253 par.add_double(relax, 1) ;
00254 par.add_int_mod(niter) ;
00255
00256 par.add_cmp_mod(ssjm1_psi, 0) ;
00257
00258 if (psi0.get_etat() == ETATZERO) {
00259 psi0.set_etat_qcq() ;
00260 psi0.set() = 0 ;
00261 }
00262
00263 int nr = mp.get_mg()->get_nr(0);
00264 int nt = mp.get_mg()->get_nt(0);
00265 int np = mp.get_mg()->get_np(0);
00266
00267 cout << "nr = " << nr << " nt = " << nt << " np = " << np << endl ;
00268
00269 cout << "psi0" << endl << norme(psi0()/(nr*nt*np)) << endl ;
00270 cout << "d(psi)/dr" << endl << norme(psi0.set().dsdr()/(nr*nt*np)) << endl ;
00271
00272 Valeur lim(mp.get_mg()->get_angu()) ;
00273 lim.annule_hard() ;
00274
00275 Tenseur normal (mp, 1, CON, mp.get_bvect_cart()) ;
00276 Tenseur normal2 (mp, 1, COV, mp.get_bvect_cart()) ;
00277 normal.set_etat_qcq() ;
00278 normal2.set_etat_qcq() ;
00279
00280 const Coord& rr0 = mp.r ;
00281 Tenseur rr(mp) ;
00282 rr.set_etat_qcq() ;
00283 rr.set() = rr0 ;
00284 rr.set_std_base() ;
00285
00286 Tenseur_sym plat(mp, 2, COV, mp.get_bvect_cart() ) ;
00287 plat.set_etat_qcq() ;
00288 for (int i=0; i<3; i++) {
00289 for (int j=0; j<i; j++) {
00290 plat.set(i,j) = 0 ;
00291 }
00292 plat.set(i,i) = 1 ;
00293 }
00294 plat.set_std_base() ;
00295
00296 Metrique flat(plat, true) ;
00297 Tenseur dcov_r = rr.derive_cov(flat) ;
00298
00299
00300 for (int i=0; i<3; i++) {
00301 normal.set(i) = dcov_r(i) ;
00302 normal2.set(i) = dcov_r(i) ;
00303 }
00304
00305 normal.change_triad(mp.get_bvect_spher()) ;
00306 normal2.change_triad(mp.get_bvect_spher()) ;
00307
00308
00309
00310 Tenseur bsn0 (bsn) ;
00311 bsn0.change_triad(mp.get_bvect_cart()) ;
00312 Tenseur aa (mp, 1, CON, mp.get_bvect_cart()) ;
00313 aa = - v_orb - a_car * gam_euler * hhh * bsn0 ;
00314 aa.change_triad(mp.get_bvect_spher()) ;
00315
00316
00317 Tenseur dcov_psi = psi0.derive_cov(flat) ;
00318 dcov_psi.change_triad(mp.get_bvect_spher()) ;
00319
00320 Cmp limite (mp) ;
00321 limite = ( - dcov_psi(1) * normal(1) - dcov_psi(2) * normal(2)
00322 + contract(aa, 0, normal2, 0)())
00323 /normal(0) ;
00324
00325 for (int j=0; j<nt; j++)
00326 for (int k=0; k<np; k++)
00327 lim.set(0, k, j, 0) = limite(0, k, j, nr-1) ;
00328
00329
00330
00331 lim.std_base_scal() ;
00332 Cmp resu (psi0()) ;
00333 source().poisson_neumann_interne(lim, par, resu) ;
00334 psi0 = resu ;
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347 for (int l=1; l<=nzm1; l++)
00348 psi0.set().annule(l) ;
00349
00350
00351
00352
00353
00354
00355 Cmp laplacien_psi0 = psi0().laplacien() ;
00356
00357 erreur = diffrel(laplacien_psi0, source())(0) ;
00358
00359 cout << "Check of the resolution of the continuity equation for strange stars: "
00360 << endl ;
00361 cout << "norme(source) : " << norme(source())(0) << endl
00362 << "Error in the solution : " << erreur << endl ;
00363
00364
00365
00366
00367
00368
00369
00370
00371 d_psi.set_etat_qcq() ;
00372
00373 for (int i=0; i<3; i++) {
00374 d_psi.set(i) = (psi0.gradient())(i) + v_orb(i) ;
00375 }
00376
00377 d_psi.set_triad( *(v_orb.get_triad()) ) ;
00378
00379
00380
00381
00382
00383 d_psi.annule(nzet, nzm1) ;
00384 for (int i=0; i<3; i++) {
00385 d_psi.set(i) = raccord_c1(d_psi(i), nzet) ;
00386 }
00387
00388 assert( d_psi.get_triad() == &(mp.get_bvect_cart()) ) ;
00389
00390 d_psi.change_triad(ref_triad) ;
00391
00392 return erreur ;
00393
00394
00395 }
00396
00397
00398
00399 else {
00400
00401 int nzm1 = mp.get_mg()->get_nzone() - 1 ;
00402
00403
00404
00405
00406
00407 Tenseur hhh = exp(unsurc2 * ent) ;
00408 hhh.set_std_base() ;
00409
00410
00411
00412
00413
00414
00415 Tenseur www = - a_car * hhh * gam_euler * bsn ;
00416
00417 www.change_triad( mp.get_bvect_cart() ) ;
00418
00419
00420
00421
00422
00423
00424 Tenseur v_orb(mp, 1, CON, mp.get_bvect_cart()) ;
00425
00426 v_orb.set_etat_qcq() ;
00427 for (int i=0; i<3; i++) {
00428 v_orb.set(i) = www(i)(0, 0, 0, 0) ;
00429 }
00430
00431 v_orb.set_triad( *(www.get_triad()) ) ;
00432 v_orb.set_std_base() ;
00433
00434
00435
00436
00437
00438
00439 Cmp dndh_log(mp) ;
00440 dndh_log = 0 ;
00441
00442 for (int l=0; l<nzet; l++) {
00443
00444 Param par ;
00445 par.add_int(l) ;
00446
00447 dndh_log = dndh_log + eos.der_nbar_ent(ent(), 1, l, &par) ;
00448
00449 }
00450
00451
00452
00453
00454
00455 for (int l=nzet; l <= nzm1; l++) {
00456 dndh_log.set(l) = 1 ;
00457 }
00458
00459 Tenseur zeta_h( ent() / dndh_log ) ;
00460 zeta_h.set_std_base() ;
00461
00462 Tenseur beta(mp) ;
00463
00464 if (pnsbh!=0x0) {
00465 beta = log( sqrt(a_car) * nnn ) ;
00466 beta.set_std_base() ;
00467 }
00468 else {
00469 beta = beta_auto + beta_comp ;
00470 }
00471
00472 Tenseur tmp_zeta = 1 - unsurc2 * zeta_h ;
00473 tmp_zeta.set_std_base() ;
00474
00475 Tenseur bb = tmp_zeta * ent.gradient_spher()
00476 + unsurc2 * zeta_h * beta.gradient_spher() ;
00477
00478 Tenseur entmb = ent - beta ;
00479
00480
00481 Tenseur source = flat_scalar_prod( www - v_orb, ent.gradient() )
00482 + unsurc2 * zeta_h * (
00483 flat_scalar_prod( v_orb, entmb.gradient() )
00484 + flat_scalar_prod( www, gam_euler.gradient() )
00485 / gam_euler ) ;
00486
00487
00488 source.annule(nzet, nzm1) ;
00489
00490
00491
00492
00493
00494 Param par ;
00495 int niter ;
00496 par.add_int(mermax) ;
00497 par.add_double(precis, 0) ;
00498 par.add_double(relax, 1) ;
00499 par.add_int_mod(niter) ;
00500
00501
00502 if (psi0.get_etat() == ETATZERO) {
00503 psi0.set_etat_qcq() ;
00504 psi0.set() = 0 ;
00505 }
00506
00507 source.set().va.ylm() ;
00508
00509 mp.poisson_compact(nzet, source(), zeta_h(), bb, par, psi0.set() ) ;
00510
00511
00512
00513
00514
00515 Tenseur bb_dpsi0 = flat_scalar_prod( bb, psi0.gradient_spher() ) ;
00516
00517 Cmp oper = zeta_h() * psi0().laplacien() + bb_dpsi0() ;
00518
00519 source.set().va.ylm_i() ;
00520
00521 cout << "Check of the resolution of the continuity equation : " << endl ;
00522 Tbl terr = diffrel(oper, source()) ;
00523 double erreur = 0 ;
00524 for (int l=0; l<nzet; l++) {
00525 double err = terr(l) ;
00526 cout << " domain " << l << " : norme(source) : " << norme(source())(l)
00527 << " relative error : " << err << endl ;
00528 if (err > erreur) erreur = err ;
00529 }
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539 d_psi.set_etat_qcq() ;
00540
00541 for (int i=0; i<3; i++) {
00542 d_psi.set(i) = (psi0.gradient())(i) + v_orb(i) ;
00543 }
00544
00545 d_psi.set_triad( *(v_orb.get_triad()) ) ;
00546
00547
00548
00549
00550
00551 d_psi.annule(nzet, nzm1) ;
00552 for (int i=0; i<3; i++) {
00553 d_psi.set(i) = raccord_c1(d_psi(i), nzet) ;
00554 }
00555
00556 assert( d_psi.get_triad() == &(mp.get_bvect_cart()) ) ;
00557
00558 d_psi.change_triad(ref_triad) ;
00559
00560 return erreur ;
00561
00562
00563 }
00564 }