23char bin_ns_bh_glob_C[] =
"$Header: /cvsroot/Lorene/C++/Source/Bin_ns_bh/bin_ns_bh_glob.C,v 1.8 2014/10/13 08:52:43 j_novak Exp $" ;
72#include "utilitaires.h"
78double Bin_ns_bh::adm_systeme()
const {
79 Cmp der_un (
hole.psi_auto().dsdr()) ;
81 Map_af auxi_mp (
star.get_mp()) ;
82 Cmp der_deux (
star.confpsi_auto().dsdr()) ;
84 double masse =
hole.mp.integrale_surface_infini(der_un) +
85 auxi_mp.integrale_surface_infini(der_deux) ;
91double Bin_ns_bh::adm_systeme_volume()
const {
93 using namespace Unites ;
96 Tenseur kk_bh (
hole.mp) ;
98 Tenseur work_bh(
hole.mp) ;
99 work_bh.set_etat_qcq() ;
100 for (
int i=0 ; i<3 ; i++) {
101 work_bh.set() = auxi_bh(i, i) ;
102 kk_bh = kk_bh + work_bh ;
104 Cmp integ_bh (
pow(
hole.psi_tot(), 5.)*kk_bh()) ;
106 integ_bh.std_base_scal() ;
108 Cmp integ_hor1 (
hole.psi_tot()) ;
114 Tenseur rad (
hole.mp, 1, COV,
hole.mp.get_bvect_cart()) ;
120 Cmp integ_hor2 (
hole.mp) ;
121 integ_hor2.annule_hard() ;
122 integ_hor2.set_dzpuis(2) ;
123 for (
int m=0 ; m<3 ; m++)
124 for (
int n=0 ; n<3 ; n++)
125 integ_hor2 += rad(m)*rad(n)*
hole.tkij_tot(m,n) ;
126 integ_hor2 *=
pow(
hole.psi_tot(),3.)/4. ;
130 Tenseur kk_ns (
star.mp) ;
132 Tenseur work_ns(
star.mp) ;
133 work_ns.set_etat_qcq() ;
134 for (
int i=0 ; i<3 ; i++) {
135 work_ns.set() = auxi_ns(i, i) ;
136 kk_ns = kk_ns + work_ns ;
138 Cmp integ_ns (
pow(
star.confpsi_comp() +
star.confpsi_auto(), 5.)*kk_ns()) ;
139 integ_ns.std_base_scal() ;
141 Cmp integ_matter (
pow(
star.confpsi_comp()+
star.confpsi_auto(), 5.)*
star.ener_euler()) ;
142 integ_matter.std_base_scal() ;
144 double masse = (integ_bh.integrale()+integ_ns.integrale())/16/M_PI +
145 hole.mp.integrale_surface(integ_hor1,
hole.rayon)/
hole.rayon/4/M_PI +
146 hole.mp.integrale_surface(integ_hor2,
hole.rayon)/2/M_PI
147 + integ_matter.integrale()*ggrav ;
152double Bin_ns_bh::komar_systeme()
const {
153 Cmp der_un (
hole.n_auto().dsdr()) ;
155 Map_af auxi_mp (
star.get_mp()) ;
156 Cmp der_deux (
star.n_auto().dsdr()) ;
158 double masse =
hole.mp.integrale_surface_infini(der_un) +
159 auxi_mp.integrale_surface_infini(der_deux) ;
166double Bin_ns_bh::viriel()
const {
167 double adm = adm_systeme() ;
168 double komar = komar_systeme() ;
170 return (adm-komar)/adm ;
173double Bin_ns_bh::moment_systeme_inf()
const {
180 int nzones =
hole.mp.get_mg()->get_nzone() ;
181 double* bornes =
new double [nzones+1] ;
182 double courant = fabs(
hole.mp.get_ori_x()-
star.mp.get_ori_x())+1 ;
183 for (
int i=nzones-1 ; i>0 ; i--) {
184 bornes[i] = courant ;
188 bornes[nzones] = __infinity ;
190 Map_af mapping (*
hole.mp.get_mg(), bornes) ;
195 Tenseur_sym k_total (mapping, 2, CON, mapping.get_bvect_cart()) ;
196 k_total.set_etat_qcq() ;
198 Tenseur shift_un (mapping, 1, CON, mapping.get_bvect_cart()) ;
199 shift_un.set_etat_qcq() ;
201 Tenseur shift_deux (mapping, 1, CON, mapping.get_bvect_cart()) ;
202 shift_deux.set_etat_qcq() ;
204 shift_un.set_triad (*
hole.shift_auto.get_triad()) ;
205 shift_un.set(0).import(
hole.shift_auto(0)) ;
206 shift_un.set(1).import(
hole.shift_auto(1)) ;
207 shift_un.set(2).import(
hole.shift_auto(2)) ;
208 shift_un.change_triad (mapping.get_bvect_cart()) ;
210 shift_deux.set_triad (*
star.shift_auto.get_triad()) ;
211 shift_deux.set(0).import(
star.shift_auto(0)) ;
212 shift_deux.set(1).import(
star.shift_auto(1)) ;
213 shift_deux.set(2).import(
star.shift_auto(2)) ;
214 shift_deux.change_triad(mapping.get_bvect_cart()) ;
216 Tenseur shift_tot (shift_un+shift_deux) ;
217 shift_tot.set_std_base() ;
218 shift_tot.annule(0, nzones-2) ;
220 shift_tot.inc2_dzpuis() ;
221 shift_tot.dec2_dzpuis() ;
223 Tenseur grad (shift_tot.gradient()) ;
224 Tenseur trace (grad(0, 0)+grad(1, 1)+grad(2, 2)) ;
225 for (
int i=0 ; i<3 ; i++) {
226 k_total.set(i, i) = grad(i, i)-trace()/3. ;
227 for (
int j=i+1 ; j<3 ; j++)
228 k_total.set(i, j) = (grad(i, j)+grad(j, i))/2. ;
231 for (
int lig=0 ; lig<3 ; lig++)
232 for (
int col=lig ; col<3 ; col++)
233 k_total.set(lig, col).mult_r_zec() ;
235 Tenseur vecteur_un (mapping, 1, CON, mapping.get_bvect_cart()) ;
236 vecteur_un.set_etat_qcq() ;
237 for (
int i=0 ; i<3 ; i++)
238 vecteur_un.set(i) = k_total(0, i) ;
239 vecteur_un.change_triad (mapping.get_bvect_spher()) ;
240 Cmp integrant_un (vecteur_un(0)) ;
242 Tenseur vecteur_deux (mapping, 1, CON, mapping.get_bvect_cart()) ;
243 vecteur_deux.set_etat_qcq() ;
244 for (
int i=0 ; i<3 ; i++)
245 vecteur_deux.set(i) = k_total(1, i) ;
246 vecteur_deux.change_triad (mapping.get_bvect_spher()) ;
247 Cmp integrant_deux (vecteur_deux(0)) ;
250 integrant_un.va = integrant_un.va.mult_st() ;
251 integrant_un.va = integrant_un.va.mult_sp() ;
253 integrant_deux.va = integrant_deux.va.mult_st() ;
254 integrant_deux.va = integrant_deux.va.mult_cp() ;
256 double moment = mapping.integrale_surface_infini (-integrant_un+integrant_deux) ;
263double Bin_ns_bh::moment_systeme_hor()
const {
265 using namespace Unites ;
271 Cmp xa_bh (
hole.mp) ;
273 xa_bh.std_base_scal() ;
275 Cmp ya_bh (
hole.mp) ;
277 ya_bh.std_base_scal() ;
279 Tenseur vecteur_bh (
hole.mp, 1, CON,
hole.mp.get_bvect_cart()) ;
280 vecteur_bh.set_etat_qcq() ;
281 for (
int i=0 ; i<3 ; i++)
282 vecteur_bh.set(i) = (-ya_bh*
hole.tkij_tot(0, i)+
283 xa_bh *
hole.tkij_tot(1, i)) ;
284 vecteur_bh.set_std_base() ;
285 vecteur_bh.annule(
hole.mp.get_mg()->get_nzone()-1) ;
286 vecteur_bh.change_triad (
hole.mp.get_bvect_spher()) ;
288 Cmp integrant_bh (
pow(
hole.psi_tot(), 6)*vecteur_bh(0)) ;
289 integrant_bh.std_base_scal() ;
290 double moment_bh =
hole.mp.integrale_surface
291 (integrant_bh,
hole.rayon)/8/M_PI ;
294 Cmp xa_ns (
star.mp) ;
296 xa_ns.std_base_scal() ;
298 Cmp ya_ns (
star.mp) ;
300 ya_ns.std_base_scal() ;
302 Cmp integrant_ns (
pow(
star.confpsi_auto()+
star.confpsi_comp(), 10)*(
star.ener_euler()+
star.press())*
303 (xa_ns*
star.u_euler(1) - ya_ns*
star.u_euler(0))) ;
304 integrant_ns.std_base_scal() ;
306 double moment_ns = integrant_ns.integrale() * ggrav ;
307 return moment_ns + moment_bh ;
311Tbl Bin_ns_bh::linear_momentum_systeme_inf()
const {
317 int nzones =
hole.mp.get_mg()->get_nzone() ;
318 double* bornes =
new double [nzones+1] ;
319 double courant = fabs(
hole.mp.get_ori_x()-
star.mp.get_ori_x())+1 ;
320 for (
int i=nzones-1 ; i>0 ; i--) {
321 bornes[i] = courant ;
325 bornes[nzones] = __infinity ;
327 Map_af mapping (*
hole.mp.get_mg(), bornes) ;
332 Tenseur_sym k_total (mapping, 2, CON, mapping.get_bvect_cart()) ;
333 k_total.set_etat_qcq() ;
335 Tenseur shift_un (mapping, 1, CON, mapping.get_bvect_cart()) ;
336 shift_un.set_etat_qcq() ;
338 Tenseur shift_deux (mapping, 1, CON, mapping.get_bvect_cart()) ;
339 shift_deux.set_etat_qcq() ;
341 shift_un.set_triad (*
hole.shift_auto.get_triad()) ;
342 shift_un.set(0).import(
hole.shift_auto(0)) ;
343 shift_un.set(1).import(
hole.shift_auto(1)) ;
344 shift_un.set(2).import(
hole.shift_auto(2)) ;
345 shift_un.change_triad (mapping.get_bvect_cart()) ;
347 shift_deux.set_triad (*
star.shift_auto.get_triad()) ;
348 shift_deux.set(0).import(
star.shift_auto(0)) ;
349 shift_deux.set(1).import(
star.shift_auto(1)) ;
350 shift_deux.set(2).import(
star.shift_auto(2)) ;
351 shift_deux.change_triad(mapping.get_bvect_cart()) ;
353 shift_un.set_std_base() ;
354 shift_deux.set_std_base() ;
356 Tenseur shift_tot (shift_un+shift_deux) ;
357 shift_tot.set_std_base() ;
358 shift_tot.annule(0, nzones-2) ;
360 Cmp compy (shift_tot(1)) ;
363 int nr = mapping.get_mg()->get_nr(nzones-1) ;
364 int nt = mapping.get_mg()->get_nt(nzones-1) ;
365 int np = mapping.get_mg()->get_np(nzones-1) ;
366 Tbl val_inf (nt*np) ;
367 val_inf.set_etat_qcq() ;
368 for (
int k=0 ; k<np ; k++)
369 for (
int j=0 ; j<nt ; j++)
370 val_inf.set(k*nt + j) = fabs(compy (nzones-1, k, j, nr-1)) ;
372 Tenseur grad (shift_tot.gradient()) ;
373 Tenseur trace (grad(0, 0)+grad(1, 1)+grad(2, 2)) ;
374 for (
int i=0 ; i<3 ; i++) {
375 k_total.set(i, i) = grad(i, i)-trace()/3. ;
376 for (
int j=i+1 ; j<3 ; j++)
377 k_total.set(i, j) = (grad(i, j)+grad(j, i))/2. ;
380 for (
int comp=0 ; comp<3 ; comp++) {
381 Tenseur vecteur (mapping, 1, CON, mapping.get_bvect_cart()) ;
382 vecteur.set_etat_qcq() ;
383 for (
int i=0 ; i<3 ; i++)
384 vecteur.set(i) = k_total(i, comp) ;
385 vecteur.change_triad (mapping.get_bvect_spher()) ;
386 Cmp integrant (vecteur(0)) ;
388 res.set(comp) = mapping.integrale_surface_infini (integrant)/8/M_PI ;
393double Bin_ns_bh::distance_propre_axe_bh (
const int nr)
const {
395 double x_bh =
hole.mp.get_ori_x() +
hole.rayon ;
398 double pente = -2./x_bh ;
399 double constante = - 1. ;
403 double air_un, theta_un, phi_un ;
404 double air_deux, theta_deux, phi_deux ;
406 double* coloc =
new double[nr] ;
407 double* coef =
new double[nr] ;
408 int* deg =
new int[3] ;
409 deg[0] = 1 ; deg[1] = 1 ; deg[2] = nr ;
411 for (
int i=0 ; i<nr ; i++) {
412 ksi = -
cos (M_PI*i/(nr-1)) ;
413 xabs = (ksi+constante)/pente ;
415 hole.mp.convert_absolute (xabs, 0, 0, air_un, theta_un, phi_un) ;
416 star.mp.convert_absolute (xabs, 0, 0, air_deux, theta_deux, phi_deux) ;
418 coloc[i] =
pow (
hole.psi_auto().val_point (air_un, theta_un, phi_un) +
419 star.confpsi_auto().val_point (air_deux, theta_deux, phi_deux), 2.) ;
423 cfrcheb(deg, deg, coloc, deg, coef) ;
426 double* som =
new double[nr] ;
428 for (
int i=2 ; i<nr ; i+=2)
429 som[i] = 1./(i+1)-1./(i-1) ;
430 for (
int i=1 ; i<nr ; i+=2)
434 for (
int i=0 ; i<nr ; i++)
435 res += som[i]*coef[i] ;
447double Bin_ns_bh::distance_propre_axe_ns (
const int nr)
const {
449 double x_ns =
star.mp.get_ori_x() -
star.mp.val_r (
star.nzet, -1, M_PI/2, M_PI) ;
452 double pente = 2./x_ns ;
453 double constante = - 1. ;
457 double air_un, theta_un, phi_un ;
458 double air_deux, theta_deux, phi_deux ;
460 double* coloc =
new double[nr] ;
461 double* coef =
new double[nr] ;
462 int* deg =
new int[3] ;
463 deg[0] = 1 ; deg[1] = 1 ; deg[2] = nr ;
465 for (
int i=0 ; i<nr ; i++) {
466 ksi = -
cos (M_PI*i/(nr-1)) ;
467 xabs = (ksi-constante)/pente ;
469 hole.mp.convert_absolute (xabs, 0, 0, air_un, theta_un, phi_un) ;
470 star.mp.convert_absolute (xabs, 0, 0, air_deux, theta_deux, phi_deux) ;
472 coloc[i] =
pow (
hole.psi_auto().val_point (air_un, theta_un, phi_un) +
473 star.confpsi_auto().val_point (air_deux, theta_deux, phi_deux), 2.) ;
477 cfrcheb(deg, deg, coloc, deg, coef) ;
480 double* som =
new double[nr] ;
482 for (
int i=2 ; i<nr ; i+=2)
483 som[i] = 1./(i+1)-1./(i-1) ;
484 for (
int i=1 ; i<nr ; i+=2)
488 for (
int i=0 ; i<nr ; i++)
489 res += som[i]*coef[i] ;
501double Bin_ns_bh::smarr()
const {
503 using namespace Unites ;
506 Tenseur psiq_t (
pow(
star.get_confpsi()(), 4.)) ;
507 psiq_t.set_std_base() ;
509 Tenseur_sym furmet (
star.mp, 2, CON,
star.mp.get_bvect_cart()) ;
510 furmet.set_etat_qcq() ;
511 for (
int i=0 ; i< 3 ; i++) {
512 furmet.set(i,i) = 1/psiq_t() ;
513 for(
int j=i+1 ; j<3 ; j++)
514 furmet.set(i,j) = 0 ;
516 Metrique met (furmet,
false) ;
518 Tenseur_sym kij (
star.get_tkij_tot()/psiq_t) ;
519 kij.change_triad(
star.mp.get_bvect_cart()) ;
521 Tenseur_sym kij_cov (
manipule (kij, met)) ;
522 Tenseur shift (
star.get_shift()) ;
523 shift.change_triad(
star.mp.get_bvect_cart()) ;
525 Tenseur aime (
star.mp, 1, CON,
star.mp.get_bvect_cart()) ;
526 aime.set_etat_qcq() ;
530 aime.annule(
star.mp.get_mg()->get_nzone()-1) ;
531 aime.set_std_base() ;
532 shift = shift - aime ;
535 Tenseur u_euler (
star.get_u_euler()) ;
536 u_euler.change_triad(
star.mp.get_bvect_cart()) ;
537 Tenseur u_i_bas (
manipule(u_euler, met)) ;
538 Tenseur mat (qpig*(
star.get_nnn()*(
star.get_ener_euler() +
star.get_s_euler()) - 2*(
star.get_ener_euler()+
star.get_press())*
contract(u_i_bas, 0, shift, 0))) ;
541 Cmp psiq (
pow(
star.get_confpsi()(), 4.)) ;
543 Cmp integ_matter (
star.get_nnn()()*(
star.get_ener_euler()() +
star.get_s_euler()())
545 integ_matter = integ_matter *
pow(
star.get_confpsi()(),6.) ;
546 integ_matter.std_base_scal() ;
547 integ_matter.annule(
star.get_nzet(),
star.get_mp().get_mg()->get_nzone()-1) ;
548 double matter_term = integ_matter.integrale()*qpig/4/M_PI ;
555 Tenseur rad (
hole.mp, 1, COV,
hole.mp.get_bvect_cart()) ;
564 for (
int m=0 ; m<3 ; m++)
565 for (
int n=0 ; n<3 ; n++)
566 temp += rad(m)*rad(n)*
hole.tkij_tot(m,n) ;
567 temp *=
pow(
hole.psi_tot(),2.) ;
568 temp.std_base_scal() ;
570 Cmp integ_hor ((
hole.get_n_tot()().dsdr()-
hole.get_n_tot()()*temp)
571 *
pow(
hole.get_psi_tot()(), 2)) ;
572 integ_hor.std_base_scal() ;
573 integ_hor.raccord(1) ;
574 double hor_term =
hole.mp.integrale_surface(integ_hor,
hole.get_rayon()) ;
577 double m_test = hor_term + matter_term + 2*
omega*moment_systeme_inf() +
Et_bin_nsbh star
The neutron star.
Bhole hole
The black hole.
double omega
Angular velocity with respect to an asymptotically inertial observer.
void std_base_scal()
Sets the spectral bases of the Valeur va to the standard ones for a scalar.
Cmp sin(const Cmp &)
Sine.
Cmp pow(const Cmp &, int)
Power .
Cmp cos(const Cmp &)
Cosine.
Tenseur flat_scalar_prod(const Tenseur &t1, const Tenseur &t2)
Scalar product of two Tenseur when the metric is : performs the contraction of the last index of t1 w...
Tenseur contract(const Tenseur &, int id1, int id2)
Self contraction of two indices of a Tenseur .
Tenseur manipule(const Tenseur &, const Metrique &, int idx)
Raise or lower the index idx depending on its type, using the given Metrique .
Coord phi
coordinate centered on the grid
Coord tet
coordinate centered on the grid