00001 subroutine update_parameter_BNS_peos_lecc(convf)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg, nrf_deform, nrf, ntgxy, npgxzm
00004 use def_metric, only : psi, alph, bvxd, bvyd, bvzd, tfkij, tfkijkij, alps
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
00029 real(long) :: radiold, berold, omeold
00030 real(long) :: ddradi, ddber, ddome
00031 real(long) :: facfac, numero, error, hc, pre, rho, ene
00032 integer :: nin
00033 integer :: irin, itin, ipin, irmid, itmid, ipmid, irout, itout, ipout
00034
00035 real(long) :: ut, hh, emdtest
00036
00037 nin = nrf_deform
00038
00039 sgg = 0.0d0
00040 gg = 0.0d0
00041
00042 irin = nrf; itin = ntgxy; ipin = 0;
00043 irmid= 0 ; itmid= 0 ; ipmid= 0;
00044 irout= nrf; itout= ntgxy; ipout= npgxzm;
00045
00046
00047
00048
00049
00050 call peos_q2hprho(emdc, hc, pre, rho, ene)
00051 loghc = dlog(hc)
00052
00053
00054
00055
00056 vphiyin = vec_phig(irin, itin, ipin, 2)
00057 vphiymid = vec_phig(irmid, itmid, ipmid, 2)
00058 vphiyout = vec_phig(irout, itout, ipout, 2)
00059
00060 omeold = ome
00061 berold = ber
00062 radiold = radi
00063
00064
00065
00066 numero = 1
00067
00068 ain = dlog(alph(irin,itin,ipin)**(1.d0/radi**2))
00069 pain = (psi(irin,itin,ipin)**2/alph(irin,itin,ipin))**(1.d0/radi**2)
00070 bin = bvyd(irin,itin,ipin)
00071
00072 amid = dlog(alph(irmid,itmid,ipmid)**(1.d0/radi**2))
00073 pamid= (psi(irmid,itmid,ipmid)**2/alph(irmid,itmid,ipmid))**(1.d0/radi**2)
00074 bmid = bvyd(irmid,itmid,ipmid)
00075
00076 aout = dlog(alph(irout,itout,ipout)**(1.d0/radi**2))
00077 paout= (psi(irout,itout,ipout)**2/alph(irout,itout,ipout))**(1.d0/radi**2)
00078 bout = bvyd(irout,itout,ipout)
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 do
00095 ovin = bin + ome*vphiyin
00096 ovmid = bmid + ome*vphiymid
00097 ovout = bout + ome*vphiyout
00098
00099
00100
00101
00102
00103
00104 ov2in = ovin**2 + velx**2
00105 ov2mid = ovmid**2 + velx**2
00106 ov2out = ovout**2 + velx**2
00107 termin = 1.0d0 - pain**( 2.d0*radi**2)*ov2in
00108 termmid = 1.0d0 - pamid**(2.d0*radi**2)*ov2mid
00109 termout = 1.0d0 - paout**(2.d0*radi**2)*ov2out
00110
00111 dtermdoin = - pain**(2.d0*radi**2)*2.0d0*ovin*vphiyin
00112 dtermdomid= - pamid**(2.d0*radi**2)*2.0d0*ovmid*vphiymid
00113 dtermdoout= - paout**(2.d0*radi**2)*2.0d0*ovout*vphiyout
00114 dtermdrin =-dlog(pain)*4.d0*radi*pain**(2.d0*radi**2)*ov2in
00115 dtermdrmid=-dlog(pamid)*4.d0*radi*pamid**(2.d0*radi**2)*ov2mid
00116 dtermdrout=-dlog(paout)*4.d0*radi*paout**(2.d0*radi**2)*ov2out
00117
00118 if(termin<0 .or. termmid<0 .or. termout<0) then
00119 write(6,*) "Quantities inside log negative. Exiting..."
00120 stop
00121 else
00122 sgg(1) = -(radi**2*ain + 0.5d0*dlog(termin) - dlog(ber))
00123 sgg(2) = -(radi**2*aout + 0.5d0*dlog(termout) - dlog(ber))
00124 sgg(3) = -(radi**2*amid + 0.5d0*dlog(termmid) - dlog(ber) + loghc)
00125 end if
00126
00127
00128 gg(1,1) = 0.5d0*dtermdoin/termin
00129 gg(1,2) = - 1.0d0/ber
00130 gg(1,3) = 2.0d0*radi*ain + 0.5d0*dtermdrin/termin
00131
00132 gg(2,1) = 0.5d0*dtermdoout/termout
00133 gg(2,2) = - 1.0d0/ber
00134 gg(2,3) = 2.0d0*radi*aout + 0.5d0*dtermdrout/termout
00135
00136 gg(3,1) = 0.5d0*dtermdomid/termmid
00137 gg(3,2) = - 1.0d0/ber
00138 gg(3,3) = 2.0d0*radi*amid + 0.5d0*dtermdrmid/termmid
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 call minv(gg,sgg,3,4)
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 ddome = sgg(1)
00165 ddber = sgg(2)
00166 ddradi = sgg(3)
00167 facfac = dmin1(dble(numero)/5.0d0,1.0d0)
00168 ome = ome + ddome*facfac
00169 ber = ber + ddber*facfac
00170 radi = radi + ddradi*facfac
00171
00172
00173 error = dmax1(dabs(ddome/ome),dabs(ddber/ber),dabs(ddradi/radi))
00174
00175
00176
00177
00178
00179 if (numero>1010) exit
00180
00181 if (dabs(error)<1.0d-12) exit
00182 numero = numero + 1
00183 end do
00184
00185
00186
00187
00188
00189
00190
00191 if (radi < 0.d0) write(6,*) ' ### radi minus ###'
00192 if (radi < 0.d0) radi = - radi
00193 if (ome < 0.d0) write(6,*) ' ### ome minus ###'
00194 if (ome < 0.d0) ome = - ome
00195 if (ber < 0.d0) write(6,*) ' ### ber minus ###'
00196 if (ber < 0.d0) ber = - ber
00197 ome = convf*ome + (1.d0-convf)*omeold
00198 ber = convf*ber + (1.d0-convf)*berold
00199 radi = convf*radi + (1.d0-convf)*radiold
00200
00201
00202
00203
00204 alph = alph**((radi/radiold)**2)
00205 psi = psi**((radi/radiold)**2)
00206
00207 alps(0:nrg,0:ntg,0:npg) = alph(0:nrg,0:ntg,0:npg)*psi(0:nrg,0:ntg,0:npg)
00208
00209 ut = 1/sqrt(alph(nrf,ntgxy,0)**2 &
00210 -psi(nrf,ntgxy,0)**4*ov2out)
00211 hh = ber*ut
00212 emdtest = 1.0d0/(pinx+1.0d0)*(hh-1.0d0)
00213
00214
00215
00216 end subroutine update_parameter_BNS_peos_lecc
00217