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 et_bin_bhns_extr_hydro_C[] = "$Header: /cvsroot/Lorene/C++/Source/Etoile/et_bin_bhns_extr_hydro.C,v 1.2 2005/02/28 23:14:16 k_taniguchi Exp $" ;
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include "et_bin_bhns_extr.h"
00048 #include "etoile.h"
00049 #include "coord.h"
00050 #include "unites.h"
00051
00052 void Et_bin_bhns_extr::hydro_euler_extr(const double& mass,
00053 const double& sepa) {
00054
00055 using namespace Unites ;
00056
00057 if (kerrschild) {
00058
00059 int nz = mp.get_mg()->get_nzone() ;
00060 int nzm1 = nz - 1 ;
00061
00062
00063
00064
00065
00066 Tenseur hhh = exp(unsurc2 * ent) ;
00067 hhh.set_std_base() ;
00068
00069
00070
00071
00072
00073
00074 const Coord& xx = mp.x ;
00075 const Coord& yy = mp.y ;
00076 const Coord& zz = mp.z ;
00077
00078 Tenseur r_bh(mp) ;
00079 r_bh.set_etat_qcq() ;
00080 r_bh.set() = pow( (xx+sepa)*(xx+sepa) + yy*yy + zz*zz, 0.5) ;
00081 r_bh.set_std_base() ;
00082
00083 Tenseur xx_cov(mp, 1, COV, ref_triad) ;
00084 xx_cov.set_etat_qcq() ;
00085 xx_cov.set(0) = xx + sepa ;
00086 xx_cov.set(1) = yy ;
00087 xx_cov.set(2) = zz ;
00088 xx_cov.set_std_base() ;
00089
00090 Tenseur xsr_cov(mp, 1, COV, ref_triad) ;
00091 xsr_cov = xx_cov / r_bh ;
00092 xsr_cov.set_std_base() ;
00093
00094 Tenseur msr(mp) ;
00095 msr = ggrav * mass / r_bh ;
00096 msr.set_std_base() ;
00097
00098 Tenseur tmp1(mp) ;
00099 tmp1.set_etat_qcq() ;
00100 tmp1.set() = 0 ;
00101 tmp1.set_std_base() ;
00102
00103 for (int i=0; i<3; i++)
00104 tmp1.set() += xsr_cov(i) % bsn(i) ;
00105
00106 tmp1.set_std_base() ;
00107
00108 Tenseur tmp2 = 2.*msr % tmp1 % tmp1 ;
00109 tmp2.set_std_base() ;
00110
00111 for (int i=0; i<3; i++)
00112 tmp2.set() += bsn(i) % bsn(i) ;
00113
00114 tmp2 = a_car % tmp2 ;
00115
00116 Tenseur gam0 = 1 / sqrt( 1 - unsurc2*tmp2 ) ;
00117 gam0.set_std_base() ;
00118
00119
00120
00121
00122
00123
00124 if (irrotational) {
00125
00126 d_psi.set_std_base() ;
00127
00128 Tenseur xx_con(mp, 1, CON, ref_triad) ;
00129 xx_con.set_etat_qcq() ;
00130 xx_con.set(0) = xx + sepa ;
00131 xx_con.set(1) = yy ;
00132 xx_con.set(2) = zz ;
00133 xx_con.set_std_base() ;
00134
00135 Tenseur xsr_con(mp, 1, CON, ref_triad) ;
00136 xsr_con = xx_con / r_bh ;
00137 xsr_con.set_std_base() ;
00138
00139 Tenseur tmp3(mp) ;
00140 tmp3.set_etat_qcq() ;
00141 tmp3.set() = 0 ;
00142 tmp3.set_std_base() ;
00143
00144 for (int i=0; i<3; i++)
00145 tmp3.set() += xsr_con(i) % d_psi(i) ;
00146
00147 tmp3.set_std_base() ;
00148
00149 Tenseur tmp4 = -2.*msr % tmp3 % tmp3 / (1.+2.*msr) ;
00150 tmp4.set_std_base() ;
00151
00152 for (int i=0; i<3; i++)
00153 tmp4.set() += d_psi(i) % d_psi(i) ;
00154
00155 tmp4 = tmp4 / a_car ;
00156
00157 gam_euler = sqrt( 1 + unsurc2 * tmp4 / (hhh%hhh) ) ;
00158
00159 gam_euler.set_std_base() ;
00160
00161
00162 Tenseur vtmp1 = d_psi / ( hhh % gam_euler % a_car ) ;
00163
00164 Tenseur vtmp2 = -2.* msr % tmp3 % xsr_con / (1.+2.*msr)
00165 / ( hhh % gam_euler % a_car ) ;
00166
00167
00168
00169
00170 if (vtmp1.get_etat() == ETATZERO) {
00171 u_euler.set_etat_zero() ;
00172 }
00173 else {
00174 assert(vtmp1.get_etat() == ETATQCQ) ;
00175 u_euler.set_etat_qcq() ;
00176 for (int i=0; i<3; i++) {
00177 u_euler.set(i) = vtmp1(i) + vtmp2(i) ;
00178 }
00179 u_euler.set_triad( *(vtmp1.get_triad()) ) ;
00180 }
00181
00182 u_euler.set_std_base() ;
00183
00184 }
00185 else {
00186
00187
00188 gam_euler = gam0 ;
00189 gam_euler.set_std_base() ;
00190
00191
00192 u_euler = - bsn ;
00193
00194 }
00195
00196
00197
00198
00199
00200 ener_euler = gam_euler % gam_euler % ( ener + press ) - press ;
00201
00202
00203
00204
00205
00206 Tenseur stmp1(mp) ;
00207 stmp1.set_etat_qcq() ;
00208 stmp1.set() = 0 ;
00209 stmp1.set_std_base() ;
00210
00211 for (int i=0; i<3; i++)
00212 stmp1.set() += xsr_cov(i) % u_euler(i) ;
00213
00214 stmp1.set_std_base() ;
00215
00216 Tenseur stmp2 = 2.*msr % stmp1 % stmp1 ;
00217 stmp2.set_std_base() ;
00218
00219 for (int i=0; i<3; i++)
00220 stmp2.set() += u_euler(i) % u_euler(i) ;
00221
00222 stmp2 = a_car % stmp2 ;
00223
00224 s_euler = 3 * press + ( ener_euler + press ) * stmp2 ;
00225 s_euler.set_std_base() ;
00226
00227
00228
00229
00230
00231
00232 Tenseur gtmp = 2.*msr % tmp1 % stmp1 ;
00233 gtmp.set_std_base() ;
00234
00235 for (int i=0; i<3; i++)
00236 gtmp.set() += bsn(i) % u_euler(i) ;
00237
00238 gtmp = a_car % gtmp ;
00239
00240 Tenseur tmp = ( 1+unsurc2*gtmp ) ;
00241 tmp.set_std_base() ;
00242 Tenseur gam = gam0 % gam_euler % tmp ;
00243
00244
00245
00246
00247
00248
00249 wit_w = gam_euler / gam % u_euler + gam0 % bsn ;
00250
00251 wit_w.set_std_base() ;
00252
00253 wit_w.annule(nzm1) ;
00254
00255
00256
00257
00258
00259
00260 if (relativistic) {
00261
00262 loggam = log( gam ) ;
00263 loggam.set_std_base() ;
00264
00265 }
00266 else {
00267 cout << "BH-NS binary systems should be relativistic !!!" << endl ;
00268 abort() ;
00269 }
00270
00271
00272
00273
00274
00275 loggam.annule(nzm1) ;
00276
00277 wit_w.annule(nzm1) ;
00278
00279 u_euler.annule(nzm1) ;
00280
00281 if (loggam.get_etat() != ETATZERO) {
00282 (loggam.set()).set_dzpuis(0) ;
00283 }
00284
00285 if (!irrotational) {
00286
00287 gam = 1 ;
00288 loggam = 0 ;
00289 wit_w = 0 ;
00290
00291 }
00292
00293
00294
00295
00296 Etoile_bin::del_deriv() ;
00297
00298 }
00299 else {
00300
00301 int nz = mp.get_mg()->get_nzone() ;
00302 int nzm1 = nz - 1 ;
00303
00304
00305
00306
00307
00308 Tenseur hhh = exp(unsurc2 * ent) ;
00309 hhh.set_std_base() ;
00310
00311
00312
00313
00314
00315
00316 Tenseur gam0 = 1 / sqrt( 1 - unsurc2*sprod(bsn, bsn) ) ;
00317 gam0.set_std_base() ;
00318
00319
00320
00321
00322
00323
00324 if (irrotational) {
00325
00326 d_psi.set_std_base() ;
00327
00328 gam_euler = sqrt( 1 + unsurc2 * sprod(d_psi, d_psi)
00329 / (hhh%hhh) ) ;
00330
00331 gam_euler.set_std_base() ;
00332
00333
00334 Tenseur vtmp = d_psi / ( hhh % gam_euler % a_car ) ;
00335
00336
00337
00338
00339 if (vtmp.get_etat() == ETATZERO) {
00340 u_euler.set_etat_zero() ;
00341 }
00342 else {
00343 assert(vtmp.get_etat() == ETATQCQ) ;
00344 u_euler.set_etat_qcq() ;
00345 for (int i=0; i<3; i++) {
00346 u_euler.set(i) = vtmp(i) ;
00347 }
00348 u_euler.set_triad( *(vtmp.get_triad()) ) ;
00349 }
00350
00351 u_euler.set_std_base() ;
00352
00353 }
00354 else {
00355
00356
00357 gam_euler = gam0 ;
00358 gam_euler.set_std_base() ;
00359
00360
00361 u_euler = - bsn ;
00362
00363 }
00364
00365
00366
00367
00368
00369 ener_euler = gam_euler % gam_euler % ( ener + press ) - press ;
00370
00371
00372
00373
00374
00375 s_euler = 3 * press + ( ener_euler + press )
00376 * sprod(u_euler, u_euler) ;
00377 s_euler.set_std_base() ;
00378
00379
00380
00381
00382
00383
00384 Tenseur tmp = ( 1+unsurc2*sprod(bsn, u_euler) ) ;
00385
00386 tmp.set_std_base() ;
00387 Tenseur gam = gam0 % gam_euler % tmp ;
00388
00389
00390
00391
00392
00393
00394 wit_w = gam_euler / gam % u_euler + gam0 % bsn ;
00395
00396 wit_w.set_std_base() ;
00397
00398 wit_w.annule(nzm1) ;
00399
00400
00401
00402
00403
00404
00405 if (relativistic) {
00406
00407 loggam = log( gam ) ;
00408 loggam.set_std_base() ;
00409
00410 }
00411 else {
00412 cout << "BH-NS binary systems should be relativistic !!!" << endl ;
00413 abort() ;
00414 }
00415
00416
00417
00418
00419
00420 loggam.annule(nzm1) ;
00421
00422 wit_w.annule(nzm1) ;
00423
00424 u_euler.annule(nzm1) ;
00425
00426 if (loggam.get_etat() != ETATZERO) {
00427 (loggam.set()).set_dzpuis(0) ;
00428 }
00429
00430 if (!irrotational) {
00431
00432 gam = 1 ;
00433 loggam = 0 ;
00434 wit_w = 0 ;
00435
00436 }
00437
00438
00439
00440
00441 Etoile_bin::del_deriv() ;
00442
00443 }
00444
00445 }