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