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