00001 subroutine update_parameter_axisym_WL_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, bvyd, tfkij, tfkijkij
00005 use def_metric_hij, only : hyyd
00006 use def_matter, only : omef
00007 use def_matter_parameter
00008 use coordinate_grav_r, only : rg
00009 use trigonometry_grav_theta, only : sinthg, costhg
00010 use trigonometry_grav_phi, only : sinphig, cosphig
00011 use def_vector_phi, only : vec_phig
00012 use interface_minv
00013 implicit none
00014 real(long), intent(in) :: convf
00015 real(long) :: sgg(1:4), gg(1:4,1:4)
00016
00017 real(long) :: bin, bmid, bout
00018
00019 real(long) :: ain, amid, aout
00020
00021 real(long) :: pain, pamid, paout
00022
00023 real(long) :: ovin, ovmid, ovout
00024
00025 real(long) :: ov2in, ov2mid, ov2out
00026
00027 real(long) :: jin, jmid, jout, jint_in, jint_mid, jint_out
00028 real(long) :: alin, almid, alout
00029 real(long) :: psin, psmid, psout
00030 real(long) :: hyin, hymid, hyout
00031 real(long) :: gin, gmid, gout
00032 real(long) :: omein, omemid, omeout
00033
00034 real(long) :: termin, termmid, termout
00035 real(long) :: dtermdoin, dtermdomid, dtermdoout
00036 real(long) :: dtermdrin, dtermdrmid, dtermdrout
00037 real(long) :: djintdoin, djintdomid, djintdoout
00038 real(long) :: dodoc_in, dodoc_mid, dodoc_out
00039 real(long) :: vphiyin, vphiymid, vphiyout
00040 real(long) :: loghc
00041 real(long) :: radiold, berold, omeold
00042 real(long) :: ddradi, ddber, ddome
00043 real(long) :: facfac, numero, error, hc, pre, rho, ene
00044 real(long) :: ome_mx, ome_eq, Jome, Jome_int, dum, small = 1.0d-30
00045 integer :: nin, nmx
00046
00047 real(long) :: ut, hh, emdtest
00048
00049 nin = nrf_deform
00050
00051 sgg = 0.0d0
00052 gg = 0.0d0
00053
00054 call peos_q2hprho(emdc, hc, pre, rho, ene)
00055 call search_emdmax_xaxis_grid(nmx)
00056
00057
00058 loghc = dlog(hc)
00059 vphiyin = vec_phig(nin,0,0,2)
00060 vphiymid = vec_phig(nmx,ntgxy,0,2)
00061 vphiyout = vec_phig(nrf,ntgxy,0,2)
00062 omeold = ome
00063 berold = ber
00064 radiold = radi
00065 numero = 1
00066
00067 ain = dlog(alph(nin,0,0)**(1.d0/radi**2))
00068 pain = (psi(nin,0,0)**2/alph(nin,0,0))**(1.d0/radi**2)
00069 bin = bvyd(nin,0,0)
00070 hyin = hyyd(nin,0,0)
00071 gin = 1.0d0 + hyin
00072 psin = psi(nin,0,0)
00073 alin = alph(nin,0,0)
00074 omein = omef(nrf,0,0)
00075
00076 amid = dlog(alph(nmx,ntgxy,0)**(1.d0/radi**2))
00077 pamid= (psi(nmx,ntgxy,0)**2/alph(nmx,ntgxy,0))**(1.d0/radi**2)
00078 bmid = bvyd(nmx,ntgxy,0)
00079 hymid= hyyd(nmx,ntgxy,0)
00080 gmid = 1.0d0 + hymid
00081 psmid= psi(nmx,ntgxy,0)
00082 almid= alph(nmx,ntgxy,0)
00083 omemid=omef(nmx,ntgxy,0)
00084
00085 aout = dlog(alph(nrf,ntgxy,0)**(1.d0/radi**2))
00086 paout= (psi(nrf,ntgxy,0)**2/alph(nrf,ntgxy,0))**(1.d0/radi**2)
00087 bout = bvyd(nrf,ntgxy,0)
00088 hyout= hyyd(nrf,ntgxy,0)
00089 gout = 1.0d0 + hyout
00090 psout= psi(nrf,ntgxy,0)
00091 alout= alph(nrf,ntgxy,0)
00092 omeout=omef(nrf,ntgxy,0)
00093
00094 ome_mx = omemid
00095 ome_eq = omeout
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 do
00113 call calc_omega_drot(vphiyin,alin,psin,bin,hyin,omein,Jome,Jome_int)
00114 jin = Jome ; jint_in = Jome_int
00115 call calc_omega_drot(vphiymid,almid,psmid,bmid,hymid,omemid,Jome,Jome_int)
00116 jmid = Jome ; jint_mid = Jome_int
00117 call calc_omega_drot(vphiyout,alout,psout,bout,hyout,omeout,Jome,Jome_int)
00118 jout = Jome ; jint_out = Jome_int
00119
00120 ovin = bin + omein *vphiyin
00121 ovmid = bmid + omemid*vphiymid
00122 ovout = bout + omeout*vphiyout
00123
00124
00125
00126
00127
00128
00129 ov2in = gin *ovin**2
00130 ov2mid = gmid*ovmid**2
00131 ov2out = gout*ovout**2
00132 termin = 1.0d0 - pain**( 2.d0*radi**2)*ov2in
00133 termmid = 1.0d0 - pamid**(2.d0*radi**2)*ov2mid
00134 termout = 1.0d0 - paout**(2.d0*radi**2)*ov2out
00135
00136
00137 dodoc_in = A2DR*index_DR*termin &
00138 & /(pain **(2.d0*radi**2)*gin *vphiyin **2 &
00139 & + A2DR*index_DR*termin &
00140 & + 2.0d0*pain **(2.d0*radi**2)*gin*vphiyin*ome**2*ovin*jin&
00141 & - ome*termin*jin )
00142 dodoc_mid = A2DR*index_DR*termmid*(ome/(omemid+small))**(index_DR-1.0d0) &
00143 & /(pamid**(2.d0*radi**2)*gmid*vphiymid**2 &
00144 & + A2DR*index_DR*termmid*(ome/(omemid+small))**index_DR &
00145 & + 2.0d0*pamid**(2.d0*radi**2)*gmid*vphiymid*omemid**2*ovmid*jmid&
00146 & - omemid*termmid*jmid)
00147 dodoc_out = A2DR*index_DR*termout*(ome/(omeout+small))**(index_DR-1.0d0) &
00148 & /(paout**(2.d0*radi**2)*gout*vphiyout**2 &
00149 & + A2DR*index_DR*termout*(ome/(omeout+small))**index_DR &
00150 & + 2.0d0*paout**(2.d0*radi**2)*gout*vphiyout*omeout**2*ovout*jout&
00151 & - omeout*termout*jout)
00152
00153 if (index_DR.ne.2.0d0) then
00154 djintdoin = 0.0d0
00155 djintdomid = A2DR*index_DR*omemid*(ome/(omemid+small))**(index_DR-1.0d0) &
00156 & /(2.0d0-index_DR) &
00157 & - A2DR*index_DR*ome/(2.0d0-index_DR) + jmid*dodoc_mid
00158 djintdoout = A2DR*index_DR*omeout*(ome/(omeout+small))**(index_DR-1.0d0) &
00159 & /(2.0d0-index_DR) &
00160 & - A2DR*index_DR*ome/(2.0d0-index_DR) + jout*dodoc_out
00161 else
00162 djintdoin = 0.0d0
00163 djintdomid = - 2.0d0*A2DR*ome*dlog(ome/(omemid+small)) + jmid*dodoc_mid
00164 djintdoout = - 2.0d0*A2DR*ome*dlog(ome/(omeout+small)) + jout*dodoc_out
00165 end if
00166
00167 dtermdoin = - pain**( 2.d0*radi**2)*2.0d0*gin *ovin *vphiyin*dodoc_in
00168 dtermdomid= - pamid**(2.d0*radi**2)*2.0d0*gmid*ovmid*vphiymid*dodoc_mid
00169 dtermdoout= - paout**(2.d0*radi**2)*2.0d0*gout*ovout*vphiyout*dodoc_out
00170 dtermdrin =-dlog(pain )*4.d0*radi*pain**( 2.d0*radi**2)*ov2in
00171 dtermdrmid=-dlog(pamid)*4.d0*radi*pamid**(2.d0*radi**2)*ov2mid
00172 dtermdrout=-dlog(paout)*4.d0*radi*paout**(2.d0*radi**2)*ov2out
00173
00174 sgg(1) = -(radi**2*ain + 0.5d0*dlog(termin) + jint_in - dlog(ber))
00175 sgg(2) = -(radi**2*aout + 0.5d0*dlog(termout) + jint_out - dlog(ber))
00176 sgg(3) = -(radi**2*amid + 0.5d0*dlog(termmid) + jint_mid - dlog(ber) &
00177 + loghc)
00178
00179
00180 gg(1,1) = 0.5d0*dtermdoin/termin + djintdoin
00181 gg(1,2) = - 1.0d0/ber
00182 gg(1,3) = 2.0d0*radi*ain + 0.5d0*dtermdrin/termin
00183
00184 gg(2,1) = 0.5d0*dtermdoout/termout + djintdoout
00185 gg(2,2) = - 1.0d0/ber
00186 gg(2,3) = 2.0d0*radi*aout + 0.5d0*dtermdrout/termout
00187
00188 gg(3,1) = 0.5d0*dtermdomid/termmid + djintdomid
00189 gg(3,2) = - 1.0d0/ber
00190 gg(3,3) = 2.0d0*radi*amid + 0.5d0*dtermdrmid/termmid
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 call minv(gg,sgg,3,4)
00203 ddome = sgg(1)
00204 ddber = sgg(2)
00205 ddradi = sgg(3)
00206 facfac = dmin1(dble(numero)/5.0d0,1.0d0)
00207 ome = ome + ddome*facfac
00208 ber = ber + ddber*facfac
00209 radi = radi + ddradi*facfac
00210 error = dmax1(dabs(ddome/ome),dabs(ddber/ber),dabs(ddradi/radi))
00211 numero = numero + 1
00212 if (numero>1000) then
00213 write(6,*)' numero = ', numero, ' error =',error
00214 end if
00215
00216 if (numero>1010) exit
00217
00218 if (dabs(error)<1.0d-12) exit
00219 end do
00220
00221
00222
00223
00224
00225
00226
00227 if (radi < 0.d0) write(6,*) ' ### radi minus ###'
00228 if (radi < 0.d0) radi = - radi
00229 if (ome < 0.d0) write(6,*) ' ### ome minus ###'
00230 if (ome < 0.d0) ome = - ome
00231 if (ber < 0.d0) write(6,*) ' ### ber minus ###'
00232 if (ber < 0.d0) ber = - ber
00233 ome = convf*ome + (1.d0-convf)*omeold
00234 ber = convf*ber + (1.d0-convf)*berold
00235 radi = convf*radi + (1.d0-convf)*radiold
00236
00237
00238
00239
00240 alph = alph**((radi/radiold)**2)
00241 psi = psi**((radi/radiold)**2)
00242
00243
00244
00245
00246
00247
00248
00249 end subroutine update_parameter_axisym_WL_peos_drot