00001
00002
00003 module coordinate_grav_r
00004 use phys_constant, only : nnrg, long
00005 use grid_parameter, only : nrg, nrgin, rgin, rgmid, rgout, nrf
00006 implicit none
00007 real(long) :: rg(0:nnrg), rginv(0:nnrg)
00008 real(long) :: hrg(nnrg), hrginv(nnrg)
00009 real(long) :: drg(nnrg), drginv(nnrg)
00010 contains
00011 subroutine grid_r
00012
00013
00014
00015 implicit none
00016 real(long) :: drdr, drdrinv
00017 real(long) :: ratrr
00018 real(long) :: rvdom, ratrrb, alge, dalge, error, rdet, rdetf
00019 real(long) :: rfdom, reso_min, drmin, drmininv, ratrf, ratrfb
00020 integer :: nrout, ir, itry
00021
00022 drdr = 1.0d0/dble(nrf)
00023 drdrinv = 1.0d0/drdr
00024 rvdom = rgout - rgmid
00025 nrout = nrg - nrgin
00026
00027 drg(1:nrgin+1) = drdr
00028 drginv(1:nrgin+1) = drdrinv
00029
00030 if (rgin.ge.1.0d-13.and.rgin.lt.1.0d0) then
00031 rfdom = 1.0d0 - rgin
00032 ratrf = 0.1d0
00033 do
00034 ratrfb = ratrf
00035 alge = -(ratrf**nrf - 1.0d0 - rfdom*drdrinv*(ratrf-1.0e0))
00036 dalge = dble(nrf)*ratrf**(nrf-1) - rfdom*drdrinv
00037 ratrf = ratrf + alge/dalge
00038 error = 2.d0*(ratrf - ratrfb)/(ratrf + ratrfb)
00039 if (abs(error) <= 1.0d-14) exit
00040 end do
00041 if (ratrf.gt.1.0d0) stop 'ratrf not good'
00042 drg(nrf) = drdr
00043 drginv(nrf) = 1.0d0/drg(nrf)
00044 do ir = nrf-1, 1, -1
00045 drg(ir) = drg(ir+1)*ratrf
00046 drginv(ir) = 1.0d0/drg(ir)
00047 end do
00048 do ir = nrf+1, nrgin
00049 drg(ir) = drg(nrf)
00050 drginv(ir) = 1.0d0/drg(ir)
00051 end do
00052 end if
00053
00054 do itry = 0, 3
00055 if (itry.eq.0) ratrr = 2.0e-01
00056 if (itry.eq.1) ratrr = 2.0e0
00057 if (itry.eq.2) ratrr = 10.0e0
00058 if (itry.eq.3) ratrr = 50.0e0
00059
00060 DO
00061 ratrrb = ratrr
00062 alge = -(ratrr**(nrout+1)-ratrr-rvdom*drdrinv*(ratrr-1.0e0))
00063 dalge = dble(nrout+1)*ratrr**nrout - 1.0e0 - rvdom*drdrinv
00064 ratrr = ratrr + alge/dalge
00065 error = 2.d0*(ratrr - ratrrb)/(ratrr + ratrrb)
00066
00067 IF (abs(error)<=1.d-14) EXIT
00068 END DO
00069
00070 DO ir = nrgin+1, nrg
00071 drg(ir) = ratrr*drg(ir-1)
00072 drginv(ir) = 1.0e0/drg(ir)
00073 END DO
00074
00075 rg(0) = rgin
00076 if (rg(0).le.1.0d-14) then
00077 rginv(0) = 0.0e0
00078 else
00079 rginv(0) = 1.0d0/rg(0)
00080 end if
00081 DO ir = 1, nrg
00082 rg(ir) = rg(ir-1) + drg(ir)
00083 hrg(ir) = (rg(ir) + rg(ir-1))*0.5e0
00084 rginv(ir) = 1.0e0/rg(ir)
00085 hrginv(ir) = 1.0e0/hrg(ir)
00086
00087 END DO
00088
00089
00090 rdet = (rg(nrg) - rgout)/rgout
00091 rdetf = 0.0d0
00092 if (rgin.lt.1.0d0) rdetf = rg(nrf) - 1.0d0
00093 IF(dabs(rdet)< 1.e-10) exit
00094 IF(dabs(rdet)>=1.e-10)then
00095 WRITE(6,*) ' bad coordinate itry =', itry
00096 WRITE(6,*) ' bad coordinate GR ', rdet, ratrr
00097 WRITE(6,*) ' bad coordinate FLUID ', rdetf, ratrf
00098 if (itry.eq.3) STOP
00099 END IF
00100 end do
00101 end subroutine grid_r
00102
00103 subroutine grid_r_bhex(char_bh)
00104
00105
00106
00107 use def_bh_parameter, only : mass_pBH
00108 implicit none
00109 real(long) :: drdr, drdrinv
00110 real(long) :: ratrr
00111 real(long) :: rvdom, ratrrb, alge, dalge, error, rdet, rdetf
00112 real(long) :: rfdom, reso_min, drmin, drmininv, ratrf, ratrfb
00113 integer :: nrout, ir, itry, nrf_bh
00114 real(long) :: dr1, dr1inv, tolerant_val = 5.0d-14
00115 integer :: nr_count, count
00116 character(len=3) :: char_bh
00117
00118 drdr = 1.0d0/dble(nrf)
00119 drdrinv = 1.0d0/drdr
00120
00121 drg(1:nrgin+1) = drdr
00122 drginv(1:nrgin+1) = drdrinv
00123
00124
00125 if (rgin.lt.1.0d0) then
00126
00127 do itry = 0, 3
00128 if (itry.eq.0) ratrr = 1.01d0
00129 if (itry.eq.1) ratrr = 1.1d0
00130 if (itry.eq.2) ratrr = 2.0d0
00131 if (itry.eq.3) ratrr = 10.0d0
00132
00133
00134 dr1 = rgin/(0.75d0*dble(nrf))
00135 if (char_bh.eq.'pBH') dr1 = 0.5d0*mass_pBH/(0.75d0*dble(nrf))
00136 dr1inv = 1.0d0/dr1
00137 rvdom = 1.0d0 - rgin
00138 nrout = nrf
00139
00140 count = 0
00141 DO
00142 count = count + 1
00143 ratrrb = ratrr
00144 alge = -(ratrr**(nrout)-1.0d0-rvdom*dr1inv*(ratrr-1.0d0))
00145 dalge = dble(nrout)*ratrr**(nrout-1) - rvdom*dr1inv
00146
00147
00148
00149 ratrr = ratrr + alge/dalge
00150 error = 2.d0*(ratrr - ratrrb)/(ratrr + ratrrb)
00151
00152 IF (abs(error)<=1.d-15) EXIT
00153 IF (count.ge.1000) exit
00154 END DO
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 IF (count.ge.1000) cycle
00169
00170 drg(1) = dr1
00171 drginv(1) = 1.0d0/dr1
00172 do ir = 2, nrf
00173 drg(ir) = ratrr*drg(ir-1)
00174 drginv(ir) = 1.0d0/drg(ir)
00175 end do
00176
00177 rg(0) = rgin
00178 DO ir = 1, nrf
00179 rg(ir) = rg(ir-1) + drg(ir)
00180 end do
00181
00182 rdet = (rg(nrf) - 1.0d0)/1.0d0
00183 rdetf = 0.0d0
00184 if (rgin.lt.1.0d0) rdetf = rg(nrf) - 1.0d0
00185 IF(dabs(rdet)< 2.e-14) then
00186 WRITE(6,*) 'good coordinate itry =', itry
00187 WRITE(6,*) 'good coordinate GR ', rdet, ratrr
00188 WRITE(6,*) 'good coordinate FLUID ', rdetf, ratrf
00189 exit
00190 end if
00191 IF(dabs(rdet)>=2.e-14)then
00192 WRITE(6,*) ' bad coordinate itry =', itry
00193 WRITE(6,*) ' bad coordinate GR ', rdet, ratrr
00194 WRITE(6,*) ' bad coordinate FLUID ', rdetf, ratrf
00195 if (itry.eq.3) STOP
00196 END IF
00197
00198 end do
00199
00200
00201 drdr = drg(nrgin)
00202 drdrinv = 1.0d0/drdr
00203 rvdom = 2.0d0*rgmid
00204 nrout = nrf
00205 ratrr = 2.0d0
00206
00207 DO
00208 ratrrb = ratrr
00209 alge = -(ratrr**(nrout+1)-ratrr-rvdom*drdrinv*(ratrr-1.0d0))
00210 dalge = dble(nrout+1)*ratrr**nrout - 1.0d0 - rvdom*drdrinv
00211 ratrr = ratrr + alge/dalge
00212 error = 2.d0*(ratrr - ratrrb)/(ratrr + ratrrb)
00213
00214 IF (abs(error)<=1.d-15) EXIT
00215 END DO
00216
00217 DO ir = nrgin+1, nrgin+nrf
00218 drg(ir) = ratrr*drg(ir-1)
00219 drginv(ir) = 1.0d0/drg(ir)
00220 END DO
00221 end if
00222
00223 do itry = 0, 3
00224 if (itry.eq.0) ratrr = 1.05d-00
00225 if (itry.eq.1) ratrr = 2.0d0
00226 if (itry.eq.2) ratrr = 10.0d0
00227 if (itry.eq.3) ratrr = 50.0d0
00228
00229 drdr = 1.0d0/dble(nrf)
00230 drdrinv = 1.0d0/drdr
00231 rvdom = rgout - rgmid
00232 nrout = nrg - nrgin
00233
00234 if (rgin.lt.1.0d0) then
00235 drdr = drg(nrgin+nrf)
00236 drdrinv = 1.0d0/drdr
00237 rvdom = rgout - 3.0d0*rgmid
00238 nrout = nrg - (nrgin + nrf)
00239 end if
00240
00241 DO
00242 ratrrb = ratrr
00243
00244
00245 alge = -(dble(nrout+1)*log(ratrr)-log(ratrr+rvdom*drdrinv*(ratrr-1.0d0)))
00246 dalge = dble(nrout+1)/ratrr - (1.0d0+rvdom*drdrinv)/ &
00247 & (ratrr+rvdom*drdrinv*(ratrr-1.0d0))
00248 ratrr = ratrr + alge/dalge
00249 error = 2.d0*(ratrr - ratrrb)/(ratrr + ratrrb)
00250
00251 IF (abs(error)<=1.d-16) EXIT
00252 END DO
00253
00254
00255 nr_count = nrgin+1
00256
00257 if (rgin.lt.1.0d0) nr_count = nrgin+nrf+1
00258 DO ir = nr_count, nrg
00259 drg(ir) = ratrr*drg(ir-1)
00260 drginv(ir) = 1.0d0/drg(ir)
00261 END DO
00262
00263 rg(0) = rgin
00264 if (rg(0).le.1.0d-14) then
00265 rginv(0) = 0.0d0
00266 else
00267 rginv(0) = 1.0d0/rg(0)
00268 end if
00269 DO ir = 1, nrg
00270 rg(ir) = rg(ir-1) + drg(ir)
00271 hrg(ir) = (rg(ir) + rg(ir-1))*0.5d0
00272 rginv(ir) = 1.0d0/rg(ir)
00273 hrginv(ir) = 1.0d0/hrg(ir)
00274
00275 END DO
00276
00277
00278 rdet = (rg(nrg) - rgout)/rgout
00279 rdetf = 0.0d0
00280 if (rgin.lt.1.0d0) rdetf = rg(nrf) - 1.0d0
00281 IF(dabs(rdet)< tolerant_val) then
00282 WRITE(6,*) 'good coordinate itry =', itry
00283 WRITE(6,*) 'good coordinate GR ', rdet, ratrr
00284 WRITE(6,*) 'good coordinate FLUID ', rdetf, ratrf
00285 exit
00286 end if
00287 IF(dabs(rdet)>=tolerant_val)then
00288 WRITE(6,*) ' bad coordinate itry =', itry
00289 WRITE(6,*) ' bad coordinate GR ', rdet, ratrr
00290 WRITE(6,*) ' bad coordinate FLUID ', rdetf, ratrf
00291 if (itry.eq.3) STOP
00292 END IF
00293 end do
00294
00295
00296
00297
00298
00299
00300 end subroutine grid_r_bhex
00301
00302 end module coordinate_grav_r