00001 PROGRAM TOV
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
00032 IMPLICIT REAL*8(A-H,O-Z)
00033 PARAMETER(NEQ = 6)
00034 EXTERNAL TEST
00035 common / misc / pinx, pi
00036 DIMENSION Y0(NEQ), YN(NEQ), WORK(NEQ,2)
00037
00038 pi = 3.14159265358979d+0
00039 open (2,file='ovpar.dat',status='old')
00040 open (1,file='ovphy.dat',status='unknown')
00041 open (8,file='ovlas.dat',status='unknown')
00042 open (9,file='ovaux.dat',status='unknown')
00043 read(2,41) nstep, ndiv, radiini
00044 read(2,41) itype, idum, chope
00045 40 format(1p,2e15.7)
00046 41 format(2i5, 1p,1e15.7)
00047 close(2)
00048
00049
00050
00051 open (2,file='rnspar.dat',status='old')
00052 read(2,'(4i5)') ndum
00053 read(2,'(4i5)') ndum
00054 read(2,'(2i5)') ndum
00055 read(2,'(1p,3e10.3)') dum
00056 read(2,'(/,1i5)') ndum
00057 read(2,'(1p,2e10.3)') dum
00058 read(2,'(1p,2e10.3)') dum
00059 read(2,'(2(3x,a2),3x,3a1)') ndum
00060 read(2,'(1p,2e10.3)') dum
00061 read(2,'(/,2i5)') ndum
00062 read(2,'(1p,2e14.6)') emdc_ini, pinx
00063 read(2,'(1p,2e14.6)') restmass_sph, gravmass_sph
00064 read(2,'(1p,2e14.6)') rMoverR_sph, schwarz_radi_sph
00065
00066
00067
00068 chope = rMoverR_sph
00069 qini = emdc_ini
00070
00071 ermx = 1.0d-9
00072 itmx = 100
00073
00074
00075
00076 itcom = 0
00077 iqc = 0
00078 dqdq = qini*0.1d0
00079
00080 2222 continue
00081 itcom = itcom + 1
00082
00083
00084
00085 radi = radiini
00086 itrad = 0
00087 dr = 0.2d0*radi
00088 error = dr/radi
00089
00090 200 continue
00091 itrad = itrad + 1
00092
00093 pini = qini**(pinx+1.0d0)
00094
00095 X0 = 0.0D+0
00096 Y0(1) = 0.0D+0
00097 Y0(2) = qini
00098 Y0(3) = 0.0D+0
00099 Y0(4) = 0.0D+0
00100 Y0(5) = 2.0D+0
00101 Y0(6) = 0.0D+0
00102 YN(1) = 0.0D+0
00103 YN(2) = qini
00104 YN(3) = 0.0D+0
00105 YN(4) = 0.0D+0
00106 YN(5) = 2.0D+0
00107 YN(6) = 0.0D+0
00108 XN = radi
00109 M = nstep
00110 H = (XN - X0) / M
00111 N = ndiv
00112
00113 if (error.le.ermx.and.itype.eq.1)
00114 & WRITE( 8 ,600) XE,YN(2),YN(2)**pinx,YN(2)**(1.0+pinx),YN(5)
00115
00116 DO 10 I = 1,M
00117 ii = i
00118 XE = X0 + H
00119 CALL RK(NEQ,TEST,X0,XE,N,Y0,YN,WORK)
00120 if (error.le.ermx) then
00121 if (itype.eq.0.and.ii.eq.M) go to 2000
00122 if (itype.eq.1) then
00123 WRITE( 8 ,600) XE,YN(2),YN(2)**pinx,YN(2)**(1.0+pinx),YN(5)
00124 if (ii.eq.M) then
00125 YR = XE/YN(1)*(1.0d0-(1.0d0-2.0d0*YN(1)/XE)**0.5)
00126 adm = YN(5)*YN(6)/YR
00127 compa = YN(1)/XE
00128 WRITE(6 ,630) XE,YN(1),YN(2),YN(3),YN(4),
00129 & YN(5),YN(6),qini, compa, adm
00130 WRITE(1 ,630) XE,YN(1),YN(2),YN(3),YN(4),
00131 & YN(5),YN(6),qini, compa, adm
00132
00133 stop ' end execution '
00134 end if
00135 end if
00136 end if
00137 if (YN(2).le.0.0d0) go to 1000
00138 10 CONTINUE
00139
00140
00141
00142 1000 continue
00143
00144 if (itrad.eq.1.and.ii.le.M.and.YN(2).le.0.0d0) then
00145 write(6,*) ' bad initial radius '
00146 radi = 0.95d0*radi
00147 go to 30
00148 end if
00149 if (YN(2).le.0.0d0) then
00150 radi = radib
00151 error = dr/radi
00152 dr = 0.2d0*dr
00153 WRITE(9,*)' back ',itrad, ii, radi, error
00154 end if
00155 if (ii.eq.M.and.YN(2).gt.0.0d0) then
00156 radib = radi
00157 radi = radi + dr
00158 WRITE(9,*)' hunt ',itrad, ii, radi, error
00159 end if
00160
00161 30 continue
00162
00163 610 FORMAT(2i5,1p,4e12.4)
00164 600 FORMAT(1P ,7(E15.7))
00165
00166 if (itrad.le.itmx) go to 200
00167 if (itrad.gt.itmx) stop ' iter '
00168
00169
00170
00171
00172
00173 2000 continue
00174
00175 YR = XE/YN(1)*(1.0d0-(1.0d0-2.0d0*YN(1)/XE)**0.5)
00176 adm = YN(5)*YN(6)/YR
00177 compa = YN(1)/XE
00178
00179 if (itcom.eq.1) then
00180 if (compa.gt.chope) dqdq = - dqdq
00181 compab = compa
00182 qinib= qini
00183 qini = qini + dqdq
00184 dqdq = dabs(dqdq)
00185 erer = 1.0d0
00186 write(6,620) itcom, erer, qinib, compa
00187 go to 2222
00188 end if
00189
00190 dqdq = - (compa-chope)/(compa-compab)*(qini-qinib)
00191 compab = compa
00192 qinib= qini
00193 qini = qini + dqdq
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 erer = dabs((compa-chope)/chope)
00211
00212 write(6,620) itcom, erer, qinib, compa
00213 if (erer.lt.ermx) then
00214 WRITE(6 ,630) XE,YN(1),YN(2),YN(3),YN(4),
00215 & YN(5),YN(6),qinib, compa, adm
00216 WRITE(1 ,630) XE,YN(1),YN(2),YN(3),YN(4),
00217 & YN(5),YN(6),qinib, compa, adm
00218
00219 open(14,file='rnspar_add.dat',status='unknown')
00220
00221 emdc_ini = qini
00222 restmass_sph = YN(3)
00223 gravmass_sph = YN(1)
00224 rMoverR_sph = compa
00225 schwarz_radi_sph = XE
00226 write(14,'(1p,2e14.6,a19)') emdc_ini, pinx,
00227 & ' : emdc_ini, pinx'
00228 write(14,'(1p,2e14.6,a31)') restmass_sph, gravmass_sph,
00229 & ' : restmass_sph, gravmass_sph'
00230 write(14,'(1p,2e14.6,a47)') rMoverR_sph, schwarz_radi_sph,
00231 & ' : MoverR_sph, schwarz_radi_sph (K=1 unit)'
00232 write(6,'(/,/,1p,2e14.6,a19)') emdc_ini, pinx,
00233 & ' : emdc_ini, pinx'
00234 write(6,'(1p,2e14.6,a31)') restmass_sph, gravmass_sph,
00235 & ' : restmass_sph, gravmass_sph'
00236 write(6,'(1p,2e14.6,a47)') rMoverR_sph, schwarz_radi_sph,
00237 & ' : MoverR_sph, schwarz_radi_sph (K=1 unit)'
00238
00239 close(14)
00240
00241 stop ' end of execution '
00242 end if
00243
00244 go to 2222
00245
00246 620 FORMAT(1i5,1p,e12.4,3e16.8)
00247 630 FORMAT(1p,5e14.6)
00248 STOP
00249 END
00250
00251
00252
00253
00254 SUBROUTINE TEST(X,Y,F)
00255 IMPLICIT REAL*8(A-H,O-Z)
00256 PARAMETER(NEQ = 6)
00257 common / misc / pinx, pi
00258 DIMENSION Y(NEQ), F(NEQ)
00259
00260 rr = X
00261 rma = Y(1)
00262 emd = Y(2)
00263 bma = Y(3)
00264 tma = Y(4)
00265 psi = Y(5)
00266 adm = Y(6)
00267 if (emd.le.0.0d0) then
00268 rho0= 0.0d0
00269 rho = 0.0d0
00270 pre = 0.0d0
00271 hhh = 1.0d0
00272 end if
00273 if (emd.gt.0.0d0) then
00274 rho0= emd**pinx
00275 rho = emd**pinx*(1.0d0 + pinx*emd)
00276 pre = emd**(1.0d0 + pinx)
00277 hhh = 1.0d0 + (1.0d0+pinx)*emd
00278 end if
00279
00280 if (rr.eq.0.0d0) then
00281 F(1) = 0.0d0
00282 F(2) = 0.0d0
00283 F(3) = 0.0d0
00284 F(4) = 0.0d0
00285 F(5) = 0.0d0
00286 F(6) = 0.0d0
00287 end if
00288 if (rr.ne.0.0d0) then
00289 F(1) = 4.0d0*pi*rr**2*rho
00290 F(2) = - 1.0d0/(1.0d0+pinx)*hhh*(rma + 4.0d0*pi*pre*rr**3)/
00291 & (rr**2 - 2.0d0*rma*rr)
00292 F(3) = 4.0d0*pi*rr**2*rho0/(1.0d0-2.0d0*rma/rr)**0.5d0
00293 F(4) = 4.0d0*pi*rr**2*rho/(1.0d0-2.0d0*rma/rr)**0.5d0
00294 F(5) = 0.5d0*psi/rr*(1.0d0-1.0d0/(1.0d0-2.0d0*rma/rr)**0.5d0)
00295 F(6) = 4.0d0*pi*rr**2*rho/(1.0d0-2.0d0*rma/rr)**0.5d0/psi
00296 end if
00297
00298 RETURN
00299 END
00300
00301
00302
00303 SUBROUTINE RK(NEQ,FUNC,X0,XE,N,Y0,YN,WORK)
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329 IMPLICIT REAL*8(A-H,O-Z)
00330 EXTERNAL FUNC
00331 DIMENSION Y0(NEQ),YN(NEQ),WORK(NEQ,2)
00332 H = (XE - X0) / N
00333 DO 10 I = 1,N
00334 CALL RKSTEP(NEQ,FUNC,X0,H,Y0,YN,WORK(1,1),WORK(1,2))
00335 X0 = X0 + H
00336 DO 20 J = 1,NEQ
00337 Y0(J) = YN(J)
00338 20 CONTINUE
00339 10 CONTINUE
00340 X0 = XE
00341 RETURN
00342 END
00343
00344 SUBROUTINE RKSTEP(NEQ,FUNC,X,H,Y0,YN,AK,W)
00345 IMPLICIT REAL * 8(A-H,O-Z)
00346 PARAMETER(A2 = 0.5D+0, A3 = A2)
00347 PARAMETER(B2 = 0.5D+0, B3 = B2)
00348 PARAMETER(C1 = 1.0D+0 / 6, C2 = 1.0D+0 / 3, C3 = C2, C4 = C1)
00349 DIMENSION Y0(NEQ),YN(NEQ),AK(NEQ),W(NEQ)
00350 CALL FUNC(X,Y0,AK)
00351 DO 10 I = 1,NEQ
00352 YN(I) = Y0(I) + H * C1 * AK(I)
00353 10 CONTINUE
00354 DO 20 I = 1,NEQ
00355 W(I) = Y0(I) + H * B2 * AK(I)
00356 20 CONTINUE
00357 CALL FUNC(X + A2 * H,W,AK)
00358 DO 30 I = 1,NEQ
00359 YN(I) = YN(I) + H * C2 * AK(I)
00360 30 CONTINUE
00361 DO 40 I = 1,NEQ
00362 W(I) = Y0(I) + H * B3 * AK(I)
00363 40 CONTINUE
00364 CALL FUNC(X + A3 * H,W,AK)
00365 DO 50 I = 1,NEQ
00366 YN(I) = YN(I) + H * C3 * AK(I)
00367 50 CONTINUE
00368 DO 60 I = 1,NEQ
00369 W(I) = Y0(I) + H * AK(I)
00370 60 CONTINUE
00371 CALL FUNC(X + H,W,AK)
00372 DO 70 I = 1,NEQ
00373 YN(I) = YN(I) + H * C4 * AK(I)
00374 70 CONTINUE
00375 RETURN
00376 END