00001 subroutine update_parameter_BNS_peos_radi(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
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:3), gg(1:3,1:3)
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
00045
00046 call peos_q2hprho(emdc, hc, pre, rho, ene)
00047 loghc = dlog(hc)
00048
00049
00050
00051
00052 vphiyin = vec_phig(irin, itin, ipin, 2)
00053 vphiymid = vec_phig(irmid, itmid, ipmid, 2)
00054
00055
00056 omeold = ome
00057 berold = ber
00058
00059
00060
00061
00062 numero = 1
00063
00064 ain = dlog(alph(irin,itin,ipin)**(1.d0/radi**2))
00065 pain = (psi(irin,itin,ipin)**2/alph(irin,itin,ipin))**(1.d0/radi**2)
00066 bin = bvyd(irin,itin,ipin)
00067
00068 amid = dlog(alph(irmid,itmid,ipmid)**(1.d0/radi**2))
00069 pamid= (psi(irmid,itmid,ipmid)**2/alph(irmid,itmid,ipmid))**(1.d0/radi**2)
00070 bmid = bvyd(irmid,itmid,ipmid)
00071
00072
00073
00074
00075
00076
00077 write (6,'(a22, 1p,3e20.12)') " Old ome, ber, radi = ", ome, ber, radi
00078
00079
00080
00081
00082 write(6,'(a14,f10.7,a19,f10.7,a12,f10.7,a7,f10.7,a6)') &
00083 & "ff=-Log[ber]+(",ain*radi*radi,")+0.5*Log[1.0-(",pain**(2*radi*radi),")*((",bin,")+ome*(",vphiyin,"))^2];"
00084 write(6,'(a3,f10.7,a11,f10.7,a19,f10.7,a12,f10.7,a7,f10.7,a6)') "gg=",loghc, &
00085 & "-Log[ber]+(",amid*radi*radi,")+0.5*Log[1.0-(",pamid**(2*radi*radi),")*((",bmid,")+ome*(",vphiymid,"))^2];"
00086
00087
00088
00089
00090 do
00091 ovin = bin + ome*vphiyin
00092 ovmid = bmid + ome*vphiymid
00093
00094
00095
00096
00097
00098
00099
00100
00101 ov2in = ovin**2
00102 ov2mid = ovmid**2
00103
00104 termin = 1.0d0 - pain**( 2.d0*radi**2)*ov2in
00105 termmid = 1.0d0 - pamid**(2.d0*radi**2)*ov2mid
00106
00107
00108
00109 dtermdoin = - pain**(2.d0*radi**2)*2.0d0*ovin*vphiyin
00110 dtermdomid= - pamid**(2.d0*radi**2)*2.0d0*ovmid*vphiymid
00111
00112 dtermdrin =-dlog(pain)*4.d0*radi*pain**(2.d0*radi**2)*ov2in
00113 dtermdrmid=-dlog(pamid)*4.d0*radi*pamid**(2.d0*radi**2)*ov2mid
00114
00115
00116
00117 if(termin<0 .or. termmid<0 ) then
00118 write(6,*) "Quantities inside log negative. Exiting..."
00119 stop
00120 else
00121 sgg(1) = -(radi**2*ain + 0.5d0*dlog(termin) - dlog(ber))
00122
00123 sgg(2) = -(radi**2*amid + 0.5d0*dlog(termmid) - dlog(ber) + loghc)
00124 end if
00125
00126
00127 gg(1,1) = 0.5d0*dtermdoin/termin
00128 gg(1,2) = - 1.0d0/ber
00129
00130
00131
00132
00133
00134
00135 gg(2,1) = 0.5d0*dtermdomid/termmid
00136 gg(2,2) = - 1.0d0/ber
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 call minv(gg,sgg,2,3)
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 ddome = sgg(1)
00164 ddber = sgg(2)
00165
00166 facfac = dmin1(dble(numero)/5.0d0,1.0d0)
00167 ome = ome + ddome*facfac
00168 ber = ber + ddber*facfac
00169
00170
00171
00172
00173 error = dmax1(dabs(ddome/ome),dabs(ddber/ber))
00174
00175
00176
00177
00178
00179 if (numero>1010) exit
00180
00181 if (dabs(error)<1.0d-12) then
00182 write (6,'(a22, 1p,3e20.12)') " New ome, ber, radi = ", ome, ber, radi
00183 exit
00184 end if
00185 numero = numero + 1
00186 end do
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 if (ome < 0.d0) write(6,*) ' ### ome minus ###'
00197 if (ome < 0.d0) ome = - ome
00198 if (ber < 0.d0) write(6,*) ' ### ber minus ###'
00199 if (ber < 0.d0) ber = - ber
00200 ome = convf*ome + (1.d0-convf)*omeold
00201 ber = convf*ber + (1.d0-convf)*berold
00202
00203 write (6,'(a22, 1p,3e20.12)') " Upd ome, ber, radi = ", ome, ber, radi
00204
00205
00206
00207
00208
00209
00210
00211 ut = 1/sqrt(alph(nrf,ntgxy,0)**2 &
00212 -psi(nrf,ntgxy,0)**4*ov2out)
00213 hh = ber*ut
00214 emdtest = 1.0d0/(pinx+1.0d0)*(hh-1.0d0)
00215
00216
00217
00218 end subroutine update_parameter_BNS_peos_radi
00219