00001 subroutine update_parameter_axisym_peos(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
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 
00034   real(long)     ::    ut, hh, emdtest
00035 
00036   nin = nrf_deform
00037 
00038   sgg = 0.0d0
00039   gg  = 0.0d0
00040 
00041   call peos_q2hprho(emdc, hc, pre, rho, ene)
00042   loghc = dlog(hc)
00043   vphiyin  = vec_phig(nin,0,0,2)
00044   vphiymid = vec_phig(0,0,0,2)
00045   vphiyout = vec_phig(nrf,ntgxy,0,2)
00046   omeold = ome
00047   berold = ber
00048   radiold = radi
00049   numero = 1
00050 
00051   ain  = dlog(alph(nin,0,0)**(1.d0/radi**2))
00052   pain = (psi(nin,0,0)**2/alph(nin,0,0))**(1.d0/radi**2)
00053   bin  = bvyd(nin,0,0)
00054 
00055   amid = dlog(alph(0,0,0)**(1.d0/radi**2))
00056   pamid= (psi(0,0,0)**2/alph(0,0,0))**(1.d0/radi**2)
00057   bmid = bvyd(0,0,0)
00058 
00059   aout = dlog(alph(nrf,ntgxy,0)**(1.d0/radi**2))
00060   paout= (psi(nrf,ntgxy,0)**2/alph(nrf,ntgxy,0))**(1.d0/radi**2)
00061   bout = bvyd(nrf,ntgxy,0)
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069   do
00070     ovin  = bin  + ome*vphiyin
00071     ovmid = bmid + ome*vphiymid
00072     ovout = bout + ome*vphiyout
00073 
00074 
00075 
00076 
00077 
00078 
00079     ov2in  = ovin**2 
00080     ov2mid = ovmid**2
00081     ov2out = ovout**2
00082     termin  = 1.0d0 - pain**( 2.d0*radi**2)*ov2in
00083     termmid = 1.0d0 - pamid**(2.d0*radi**2)*ov2mid
00084     termout = 1.0d0 - paout**(2.d0*radi**2)*ov2out
00085 
00086     dtermdoin = - pain**(2.d0*radi**2)*2.0d0*ovin*vphiyin
00087     dtermdomid= - pamid**(2.d0*radi**2)*2.0d0*ovmid*vphiymid
00088     dtermdoout= - paout**(2.d0*radi**2)*2.0d0*ovout*vphiyout
00089     dtermdrin =-dlog(pain)*4.d0*radi*pain**(2.d0*radi**2)*ov2in
00090     dtermdrmid=-dlog(pamid)*4.d0*radi*pamid**(2.d0*radi**2)*ov2mid
00091     dtermdrout=-dlog(paout)*4.d0*radi*paout**(2.d0*radi**2)*ov2out
00092 
00093     sgg(1) = -(radi**2*ain  + 0.5d0*dlog(termin)  - dlog(ber))
00094     sgg(2) = -(radi**2*aout + 0.5d0*dlog(termout) - dlog(ber))
00095     sgg(3) = -(radi**2*amid + 0.5d0*dlog(termmid) - dlog(ber) &
00096              + loghc)
00097 
00098 
00099     gg(1,1) =   0.5d0*dtermdoin/termin
00100     gg(1,2) = - 1.0d0/ber
00101     gg(1,3) = 2.0d0*radi*ain + 0.5d0*dtermdrin/termin
00102 
00103     gg(2,1) =   0.5d0*dtermdoout/termout
00104     gg(2,2) = - 1.0d0/ber
00105     gg(2,3) = 2.0d0*radi*aout + 0.5d0*dtermdrout/termout
00106 
00107     gg(3,1) =   0.5d0*dtermdomid/termmid
00108     gg(3,2) = - 1.0d0/ber
00109     gg(3,3) = 2.0d0*radi*amid + 0.5d0*dtermdrmid/termmid
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121     call minv(gg,sgg,3,4)
00122     ddome = sgg(1)
00123     ddber = sgg(2)
00124     ddradi = sgg(3)
00125     facfac = dmin1(dble(numero)/5.0d0,1.0d0)
00126     ome = ome + ddome*facfac
00127     ber = ber + ddber*facfac
00128     radi = radi + ddradi*facfac
00129     error = dmax1(dabs(ddome/ome),dabs(ddber/ber),dabs(ddradi/radi))
00130     numero = numero + 1
00131     if (numero>1000) then
00132       write(6,*)' numero = ', numero, '   error =',error
00133     end if
00134 
00135     if (numero>1010) exit
00136     if (dabs(error)<1.0d-08) exit
00137   end do
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145   if (radi < 0.d0) write(6,*) ' ### radi minus ###'
00146   if (radi < 0.d0) radi = - radi
00147   if (ome < 0.d0) write(6,*) ' ### ome minus ###'
00148   if (ome < 0.d0) ome = - ome
00149   if (ber < 0.d0) write(6,*) ' ### ber minus ###'
00150   if (ber < 0.d0) ber = - ber
00151   ome = convf*ome + (1.d0-convf)*omeold
00152   ber = convf*ber + (1.d0-convf)*berold
00153   radi = convf*radi + (1.d0-convf)*radiold
00154 
00155 
00156 
00157 
00158   alph = alph**((radi/radiold)**2)
00159   psi = psi**((radi/radiold)**2)
00160 
00161   ut = 1/sqrt(alph(nrf,ntgxy,0)**2 & 
00162      -psi(nrf,ntgxy,0)**4*ov2out)
00163   hh = ber*ut
00164   emdtest = 1.0d0/(pinx+1.0d0)*(hh-1.0d0)
00165 
00166 
00167 end subroutine update_parameter_axisym_peos