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