00001 subroutine update_parameter_spherical_qeos(convf)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg, nrf_deform, nrf, ntgxy
00004 use def_metric, only : psi, alph, bvxd, bvyd, bvzd, tfkij, tfkijkij
00005 use def_matter_parameter
00006 use coordinate_grav_r, only : rg
00007 use trigonometry_grav_theta, only : sinthg, costhg
00008 use trigonometry_grav_phi, only : sinphig, cosphig
00009 use def_vector_phi, only : vec_phig
00010 use interface_minv
00011 implicit none
00012 real(long), intent(in) :: convf
00013 real(long) :: sgg(1:4), gg(1:4,1:4)
00014 real(long) :: bin, bmid, bout
00015
00016 real(long) :: ain, amid, aout
00017
00018 real(long) :: pain, pamid, paout
00019
00020 real(long) :: ovin, ovmid, ovout
00021
00022 real(long) :: ov2in, ov2mid, ov2out
00023
00024 real(long) :: termin, termmid, termout
00025 real(long) :: dtermdoin, dtermdomid, dtermdoout
00026 real(long) :: dtermdrin, dtermdrmid, dtermdrout
00027 real(long) :: vphiyin, vphiymid, vphiyout
00028 real(long) :: loghc, loghs
00029 real(long) :: radiold, berold, omeold
00030 real(long) :: ddradi, ddber, ddome
00031 real(long) :: facfac, numero, error, hc, hs, pre, rho, ene
00032 real(long) :: dummy
00033 integer :: nin
00034
00035 real(long) :: ut, hh, emdtest
00036
00037 nin = nrf_deform
00038
00039 sgg = 0.0d0
00040 gg = 0.0d0
00041
00042 call quark_rho2phenedpdrho(rhoc_qs, pre, hc, ene, dummy)
00043 loghc = dlog(hc)
00044 call quark_rho2phenedpdrho(rhos_qs, pre, hs, ene, dummy)
00045 loghs = dlog(hs)
00046 vphiyin = vec_phig(nin,0,0,2)
00047 vphiymid = vec_phig(0,0,0,2)
00048
00049 omeold = ome
00050 berold = ber
00051 radiold = radi
00052 numero = 1
00053
00054 ain = dlog(alph(nin,0,0)**(1.d0/radi**2))
00055 pain = (psi(nin,0,0)**2/alph(nin,0,0))**(1.d0/radi**2)
00056 bin = bvyd(nin,0,0)
00057
00058 amid = dlog(alph(0,0,0)**(1.d0/radi**2))
00059 pamid= (psi(0,0,0)**2/alph(0,0,0))**(1.d0/radi**2)
00060 bmid = bvyd(0,0,0)
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 ome = 0.0d0
00073 do
00074 ovin = bin + ome*vphiyin
00075 ovmid = bmid + ome*vphiymid
00076
00077
00078
00079
00080
00081
00082
00083 ov2in = ovin**2
00084 ov2mid = ovmid**2
00085
00086 termin = 1.0d0 - pain**( 2.d0*radi**2)*ov2in
00087 termmid = 1.0d0 - pamid**(2.d0*radi**2)*ov2mid
00088
00089
00090
00091
00092
00093
00094
00095 dtermdrin =-dlog(pain)*4.d0*radi*pain**(2.d0*radi**2)*ov2in
00096 dtermdrmid=-dlog(pamid)*4.d0*radi*pamid**(2.d0*radi**2)*ov2mid
00097
00098
00099
00100
00101
00102
00103
00104
00105 sgg(1) = -(radi**2*ain + 0.5d0*dlog(termin) - dlog(ber) + loghs)
00106 sgg(2) = -(radi**2*amid + 0.5d0*dlog(termmid) - dlog(ber) + loghc)
00107
00108
00109
00110
00111
00112 gg(1,1) = - 1.0d0/ber
00113 gg(1,2) = 2.0d0*radi*ain + 0.5d0*dtermdrin/termin
00114
00115
00116
00117
00118
00119
00120
00121
00122 gg(2,1) = - 1.0d0/ber
00123 gg(2,2) = 2.0d0*radi*amid + 0.5d0*dtermdrmid/termmid
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 call minv(gg,sgg,2,4)
00140 ddber = sgg(1)
00141 ddradi = sgg(2)
00142 facfac = dmin1(dble(numero)/5.0d0,1.0d0)
00143
00144 ome = 0.0d0
00145 ber = ber + ddber*facfac
00146 radi = radi + ddradi*facfac
00147
00148 error = dmax1(dabs(ddber/ber),dabs(ddradi/radi))
00149 numero = numero + 1
00150 if (numero>1000) then
00151 write(6,*)' numero = ', numero, ' error =',error
00152 end if
00153
00154 if (numero>1010) exit
00155 if (dabs(error)<1.0d-08) exit
00156 end do
00157
00158
00159
00160
00161
00162
00163
00164 if (radi < 0.d0) write(6,*) ' ### radi minus ###'
00165 if (radi < 0.d0) radi = - radi
00166 if (ome < 0.d0) write(6,*) ' ### ome minus ###'
00167 if (ome < 0.d0) ome = - ome
00168 if (ber < 0.d0) write(6,*) ' ### ber minus ###'
00169 if (ber < 0.d0) ber = - ber
00170
00171 ber = convf*ber + (1.d0-convf)*berold
00172 radi = convf*radi + (1.d0-convf)*radiold
00173
00174
00175
00176
00177 alph = alph**((radi/radiold)**2)
00178 psi = psi**((radi/radiold)**2)
00179
00180 ut = 1/sqrt(alph(nrf,ntgxy,0)**2 &
00181 -psi(nrf,ntgxy,0)**4*ov2out)
00182 hh = ber*ut
00183 emdtest = 1.0d0/(pinx+1.0d0)*(hh-1.0d0)
00184
00185
00186 end subroutine update_parameter_spherical_qeos