00001 subroutine calc_eqsolver_TrpBH(rr,rini,rval)
00002 use phys_constant, only : long
00003 use def_bh_parameter, only : mass_pBH
00004 implicit none
00005 integer :: count, ii
00006 real(long) :: rr, rini, rval
00007 real(long) :: R1, R2, F1, F2, Rtmp, M, jacobian, fac0, error
00008 real(long) :: facp(5) = (/ 2.0d-1, 5.0d-1, 1.0d-0, 1.0d-0, 1.0d-0 /)
00009
00010
00011
00012 M = mass_pBH
00013 R1 = rini
00014 R2 = rini*1.05d0
00015 F1 = fnc_R_trpBH(R1,M) - rr
00016
00017 count = 0
00018 do
00019 count = count + 1
00020 ii = min0(5,count)
00021 fac0 = facp(ii)
00022
00023 F2 = fnc_R_trpBH(R2,M) - rr
00024 jacobian = (F2-F1)/(R2-R1)
00025 Rtmp = R2 - F2/jacobian
00026 R1 = R2
00027 F1 = F2
00028
00029 R2 = fac0*Rtmp + (1.0d0-fac0)*R2
00030 if (R2.le.3.0d0*M/2.0d0) R2 = 3.0d0*M/2.0d0
00031 error = 2.d0*dabs(R2 - R1)/(dabs(R2) + dabs(R1))
00032
00033 IF (error <= 1.d-14) EXIT
00034 IF (count.ge.1000) exit
00035 end do
00036 IF (count.ge.1000) stop 'TrpBH failed'
00037
00038 rval = R2
00039
00040 contains
00041 function fnc_R_trpBH(R,M)
00042 real(long) :: R, M, fnc_R_trpBH
00043 fnc_R_trpBH = 0.25d0*(2.0d0*R+M+dsqrt(4.0d0*R**2+4.0d0*M*R+3.0d0*M**2)) &
00044 & *((4.0d0+3.0d0*dsqrt(2.0d0))*(2.0d0*R-3.0d0*M) &
00045 & /(8.0d0*R+6.0d0*M+3.0d0*dsqrt(8.0d0*R**2+8.0d0*M*R+6.0d0*M**2)) &
00046 & )**(1.0d0/dsqrt(2.0d0))
00047 end function fnc_R_trpBH
00048 end subroutine calc_eqsolver_TrpBH