ovsph4rns.f

Go to the documentation of this file.
00001       PROGRAM TOV
00002 c
00003 c = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
00004 c
00005 c --- Desctiption for parameters.
00006 c
00007 c     qini  : initial for emden function. 
00008 c     pinx  : polytropic index
00009 c     nstep : see Runge Kutta subroutine.
00010 c     ndiv  : see Runge Kutta subroutine.
00011 c     radini: initial radius for hunting radius from inside.
00012 c     itype : itype = 0  iteration for compactness
00013 c             itype = 1  single structure
00014 c     chope : compactness to find (for itype = 0)
00015 c
00016 c --- Description for variables.
00017 c
00018 c     XE    : Schwartzscild radial coordinate 
00019 c     YN(1) : Effective gravitational mass
00020 c     YN(2) : Emden function
00021 c     YN(3) : Proper rest mass 
00022 c     YN(4) : Proper mass energy
00023 c     YN(5) : Conformal factor (proper boundary condition not applied)
00024 c     YN(6) : ADM mass energy  (proper boundary condition not applied)
00025 c     adm   : ADM mass energy
00026 c     compa : Compaction = YN(1)/XE = 
00027 c               = Effective gravitational mass/
00028 c                 Radius of star in Schwartzscild radial coordinate 
00029 c
00030 c = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
00031 c
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 c
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 c
00049 c --  read_parameter in grid_parameter.f90
00050 c --  
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 c
00066 c --  set compactness and initial
00067 c
00068       chope = rMoverR_sph
00069       qini = emdc_ini
00070 c
00071       ermx = 1.0d-9
00072       itmx = 100
00073 c
00074 c --- Iteration for compactness.
00075 c
00076       itcom = 0
00077       iqc = 0
00078       dqdq = qini*0.1d0
00079 c
00080  2222 continue
00081       itcom = itcom + 1
00082 c
00083 c --- Iteration for radius.
00084 c
00085       radi = radiini
00086       itrad = 0
00087       dr = 0.2d0*radi
00088       error = dr/radi
00089 c
00090  200  continue
00091       itrad = itrad + 1
00092 c      
00093       pini = qini**(pinx+1.0d0)
00094 c
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 c
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 c
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 c
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 c
00140 c ---- HUNTING for precise radius.
00141 c
00142  1000 continue
00143 c
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 c
00161  30    continue
00162 c
00163  610   FORMAT(2i5,1p,4e12.4)
00164  600   FORMAT(1P ,7(E15.7))
00165 c
00166       if (itrad.le.itmx) go to 200
00167       if (itrad.gt.itmx) stop ' iter '
00168 c
00169 c ---- HUNTING END.
00170 c
00171 c ---- Searching for a certain value of compactness.
00172 c
00173  2000 continue
00174 c
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 c
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 c
00190       dqdq = - (compa-chope)/(compa-compab)*(qini-qinib)
00191       compab = compa
00192       qinib= qini
00193       qini = qini + dqdq
00194 c
00195 c      if (chope.ge.compa.and.compa.ge.compab) then
00196 c      compab = compa
00197 c      qinib= qini
00198 c      qini = qini + dqdq
00199 c      else if (chope.le.compa.and.compa.le.compab) then
00200 c      compab = compa
00201 c      qinib= qini
00202 c      qini = qini - dqdq
00203 c      else
00204 c      qinibx = qini
00205 c      qini = 0.5d0*(qini+qinib)
00206 c      qinib = qinibx
00207 c      dqdq = 0.5d0*dabs(dqdq)
00208 c      end if
00209 c
00210       erer = dabs((compa-chope)/chope)
00211 c      write(6,*) compab, compa, dqdq
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 c
00219       open(14,file='rnspar_add.dat',status='unknown') 
00220 c
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 c
00239       close(14)
00240 c
00241       stop ' end of execution '
00242       end if
00243 c
00244       go to 2222
00245 c
00246  620   FORMAT(1i5,1p,e12.4,3e16.8)
00247  630   FORMAT(1p,5e14.6)
00248       STOP 
00249       END
00250 C
00251 c --------------------------------------------------------
00252 c --- equations are in this routine.
00253 c
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 c
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 c
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 c 
00298       RETURN
00299       END
00300 c
00301 c ---------------------------------------------------------
00302 c
00303       SUBROUTINE RK(NEQ,FUNC,X0,XE,N,Y0,YN,WORK)
00304 **********************************************************************
00305 *     SUBROUTINE RK NUMERICALLY INTEGRATES A SYSTEM OF NEQ           *
00306 *     FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS OF THE FORM        *
00307 *             DY(I)/DX = F(X, Y(1),..., Y(NEQ)),                     *
00308 *     BY THE CLASSICAL RUNGE-KUTTA FORMULA.                          *
00309 *                                                                    *
00310 *     PARAMETERS                                                     *
00311 *  === INPUT ===                                                     *
00312 *     (1) NEQ: NUMBER OF EQUATIONS TO BE INTEGRATED                  *
00313 *     (2) FUNC: SUBROUTINE FUNC(X,Y,F) TO EVALUATE DERIVATIVES       *
00314 *                F(I)=DY(I)/DX                                       *
00315 *     (3) X0: INITIAL VALUE OF INDEPENDENT VARIABLE                  *
00316 *     (4) XE: OUTPUT POINT AT WHICH THE SOLUTION IS DESIRED          *
00317 *     (5) N: NUMBER OF DIVISIONS                                     *
00318 *        THE INTERVAL (X0, XE) IS DIVIDED INTO N SUBINTERVALS        *
00319 *        WITH THE LENGTH (XE-X0)/N AND IN EACH SUBINTERVAL           *
00320 *        THE CLASSICAL RUNGE-KUTTA FORMULA IS USED.                  *
00321 *     (6) Y0(I) (I=1,..,NEQ): INITIAL VALUE AT X0                    *
00322 *  === OUTPUT ===                                                    *
00323 *     (7) YN(I) (I=1,..,NEQ): APPROXIMATE SOLUTION AT XE             *
00324 *  === OTHER ===                                                     *
00325 *     (8) WORK(): TWO-DIMENTIONAL ARRAY (SIZE=(NEQ,2)) TO BE         *
00326 *                 USED INSIDE RK                                     *
00327 *     COPYRIGHT: M. SUGIHARA, NOVEMBER 15, 1989, V. 1                *
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 C
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

Generated on 27 Oct 2011 for Cocal by  doxygen 1.6.1