00001 subroutine update_parameter_axisym_peos_drot(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
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) :: jin, jmid, jout
00026 real(long) :: alin, almid, alout
00027 real(long) :: psin, psmid, psout
00028 real(long) :: bxin, bxmid, bxout
00029 real(long) :: omein, omemid, omeout
00030
00031 real(long) :: termin, termmid, termout
00032 real(long) :: dtermdoin, dtermdomid, dtermdoout
00033 real(long) :: dtermdrin, dtermdrmid, dtermdrout
00034 real(long) :: djintdoin, djintdomid, djintdoout
00035 real(long) :: vphiyin, vphiymid, vphiyout
00036 real(long) :: loghc
00037 real(long) :: radiold, berold, omeold
00038 real(long) :: ddradi, ddber, ddome
00039 real(long) :: facfac, numero, error, hc, pre, rho, ene
00040 real(long) :: ome_eq, Jome, Jome_int, dum
00041 integer :: nin
00042
00043 real(long) :: ut, hh, emdtest
00044
00045 nin = nrf_deform
00046
00047 sgg = 0.0d0
00048 gg = 0.0d0
00049
00050 call peos_q2hprho(emdc, hc, pre, rho, ene)
00051 loghc = dlog(hc)
00052 vphiyin = vec_phig(nin,0,0,2)
00053 vphiymid = vec_phig(0,0,0,2)
00054 vphiyout = vec_phig(nrf,ntgxy,0,2)
00055 omeold = ome
00056 berold = ber
00057 radiold = radi
00058 numero = 1
00059
00060 ain = dlog(alph(nin,0,0)**(1.d0/radi**2))
00061 pain = (psi(nin,0,0)**2/alph(nin,0,0))**(1.d0/radi**2)
00062 bin = bvyd(nin,0,0)
00063 bxin = bvxd(nin,0,0)
00064 psin = psi(nin,0,0)
00065 alin = alph(nin,0,0)
00066 omein = ome
00067
00068
00069 amid = dlog(alph(0,0,0)**(1.d0/radi**2))
00070 pamid= (psi(0,0,0)**2/alph(0,0,0))**(1.d0/radi**2)
00071 bmid = bvyd(0,0,0)
00072 bxmid= bvxd(0,0,0)
00073 psmid= psi(0,0,0)
00074 almid= alph(0,0,0)
00075 omemid= ome
00076
00077
00078 aout = dlog(alph(nrf,ntgxy,0)**(1.d0/radi**2))
00079 paout= (psi(nrf,ntgxy,0)**2/alph(nrf,ntgxy,0))**(1.d0/radi**2)
00080 bout = bvyd(nrf,ntgxy,0)
00081 bxout= bvxd(nrf,ntgxy,0)
00082 psout= psi(nrf,ntgxy,0)
00083 alout= alph(nrf,ntgxy,0)
00084 omeout= ome
00085
00086 ome_eq = omeout
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 do
00103 ovin = bin + ome*vphiyin
00104 ovmid = bmid + ome*vphiymid
00105 ovout = bout + ome_eq*vphiyout
00106
00107
00108
00109
00110
00111
00112 ov2in = ovin**2
00113 ov2mid = ovmid**2
00114 ov2out = ovout**2
00115 call calc_omega_drot(vphiyin,alin,psin,bxin,bin,ome,Jome,Jome_int)
00116 jin = Jome_int
00117 call calc_omega_drot(vphiymid,almid,psmid,bxmid,bmid,ome,Jome,Jome_int)
00118 jmid = Jome_int
00119 call calc_omega_drot(vphiyout,alout,psout,bxout,bout,ome_eq,Jome,Jome_int)
00120 jout = Jome_int
00121 termin = 1.0d0 - pain**( 2.d0*radi**2)*ov2in
00122 termmid = 1.0d0 - pamid**(2.d0*radi**2)*ov2mid
00123 termout = 1.0d0 - paout**(2.d0*radi**2)*ov2out
00124
00125 djintdoin = A2DR*index_DR*ome/(2.0d0-index_DR)
00126 djintdomid = A2DR*index_DR*ome/(2.0d0-index_DR)
00127 djintdoout = A2DR*index_DR*ome_eq*(ome/ome_eq)**(index_DR-1.0d0) &
00128 & /(2.0d0-index_DR)
00129 dtermdoin = - pain**(2.d0*radi**2)*2.0d0*ovin*vphiyin
00130 dtermdomid= - pamid**(2.d0*radi**2)*2.0d0*ovmid*vphiymid
00131 dtermdoout= - paout**(2.d0*radi**2)*2.0d0*ovout*vphiyout
00132 dtermdrin =-dlog(pain)*4.d0*radi*pain**(2.d0*radi**2)*ov2in
00133 dtermdrmid=-dlog(pamid)*4.d0*radi*pamid**(2.d0*radi**2)*ov2mid
00134 dtermdrout=-dlog(paout)*4.d0*radi*paout**(2.d0*radi**2)*ov2out
00135
00136 sgg(1) = -(radi**2*ain + 0.5d0*dlog(termin) + jin - dlog(ber))
00137 sgg(2) = -(radi**2*aout + 0.5d0*dlog(termout) + jout - dlog(ber))
00138 sgg(3) = -(radi**2*amid + 0.5d0*dlog(termmid) + jmid - dlog(ber) &
00139 + loghc)
00140
00141
00142 gg(1,1) = 0.5d0*dtermdoin/termin + djintdoin
00143 gg(1,2) = - 1.0d0/ber
00144 gg(1,3) = 2.0d0*radi*ain + 0.5d0*dtermdrin/termin
00145
00146 gg(2,1) = 0.5d0*dtermdoout/termout + djintdoout
00147 gg(2,2) = - 1.0d0/ber
00148 gg(2,3) = 2.0d0*radi*aout + 0.5d0*dtermdrout/termout
00149
00150 gg(3,1) = 0.5d0*dtermdomid/termmid + djintdomid
00151 gg(3,2) = - 1.0d0/ber
00152 gg(3,3) = 2.0d0*radi*amid + 0.5d0*dtermdrmid/termmid
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 call minv(gg,sgg,3,4)
00165 ddome = sgg(1)
00166 ddber = sgg(2)
00167 ddradi = sgg(3)
00168 facfac = dmin1(dble(numero)/5.0d0,1.0d0)
00169 ome = ome + ddome*facfac
00170 ber = ber + ddber*facfac
00171 radi = radi + ddradi*facfac
00172 error = dmax1(dabs(ddome/ome),dabs(ddber/ber),dabs(ddradi/radi))
00173 numero = numero + 1
00174 if (numero>1000) then
00175 write(6,*)' numero = ', numero, ' error =',error
00176 end if
00177
00178 if (numero>1010) exit
00179 if (dabs(error)<1.0d-08) exit
00180 end do
00181
00182
00183
00184
00185
00186
00187
00188 if (radi < 0.d0) write(6,*) ' ### radi minus ###'
00189 if (radi < 0.d0) radi = - radi
00190 if (ome < 0.d0) write(6,*) ' ### ome minus ###'
00191 if (ome < 0.d0) ome = - ome
00192 if (ber < 0.d0) write(6,*) ' ### ber minus ###'
00193 if (ber < 0.d0) ber = - ber
00194 ome = convf*ome + (1.d0-convf)*omeold
00195 ber = convf*ber + (1.d0-convf)*berold
00196 radi = convf*radi + (1.d0-convf)*radiold
00197
00198
00199
00200
00201 alph = alph**((radi/radiold)**2)
00202 psi = psi**((radi/radiold)**2)
00203
00204 ut = 1/sqrt(alph(nrf,ntgxy,0)**2 &
00205 -psi(nrf,ntgxy,0)**4*ov2out)
00206 hh = ber*ut
00207 emdtest = 1.0d0/(pinx+1.0d0)*(hh-1.0d0)
00208
00209
00210 end subroutine update_parameter_axisym_peos_drot