00001 subroutine calc_omega_drot(vphiy,alphw,psiw,bvydw,hyydw,omega,Jome,Jome_int)
00002 use phys_constant, only : long
00003 use coordinate_grav_r, only : rg
00004 use def_matter_parameter
00005
00006 implicit none
00007 real(long), intent(in):: vphiy, alphw, psiw, bvydw, hyydw
00008 real(long), intent(inout):: omega
00009 real(long), intent(out):: Jome, Jome_int
00010
00011
00012
00013 real(long) :: sgg, gg
00014 real(long) :: p4a2, ovyu, ov2, ovphi, term1, term2, term3
00015 real(long) :: dJomedo, dterm1do, dterm2do, dterm3do
00016 real(long) :: omegaold, ddomega, logomega, ddlogomega
00017 real(long) :: facfac, error, small, smallome = 1.0d-30
00018 integer :: numero
00019
00020
00021
00022
00023 small = 1.0d-30
00024 if (index_DR.gt.6.0d0) small = ome*0.001d0
00025 sgg = 0.0d0
00026 gg = 0.0d0
00027
00028 p4a2 = psiw**4/alphw**2
00029 numero = 1
00030
00031 if (vphiy.lt.0.01d0*rg(1)) then
00032 omega = ome
00033 else
00034 logomega = dlog(omega)
00035
00036 if (index_DR.le.3.0d0) then
00037 do
00038 Jome = A2DR*omega*((ome/(omega+small))**index_DR - 1.0d0)
00039 ovyu = bvydw + omega*vphiy
00040
00041
00042 ov2 = ovyu**2*(1.0d0 + hyydw)
00043 ovphi = ovyu*vphiy*(1.0d0 + hyydw)
00044 term1 = 1.0d0 - p4a2*ov2
00045 term2 = p4a2*ovphi
00046 term3 = A2DR*omega+term2/term1
00047
00048 dJomedo = - A2DR + A2DR*(ome/(omega+small))**index_DR*(-index_DR+1.0d0)
00049 dterm1do = - p4a2*2.0d0*ovyu*vphiy
00050 dterm2do = p4a2*vphiy*vphiy
00051 dterm3do = A2DR + dterm2do/term1 - term2/term1**2*dterm1do
00052
00053
00054 sgg = -(Jome*term1 - term2)
00055 gg = dJomedo*term1 + Jome*dterm1do - dterm2do
00056 ddomega = sgg/gg
00057 facfac = dmin1(dble(numero)/5.0d0,1.0d0)
00058 omega = omega + ddomega*facfac
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 if (omega.gt.ome) omega = ome
00089 if (omega.le.0.0d0) omega = smallome
00090
00091 error = dabs(ddomega/omega)
00092 numero = numero + 1
00093 if (numero>1000) then
00094 write(6,*) vphiy, ome
00095 write(6,*) ome, p4a2, bvydw
00096 write(6,*) Jome, ovyu, omega
00097 write(6,*)' numero = ', numero, ' error =',error
00098 end if
00099
00100 if (numero>1010) stop 'rotation law'
00101 if (dabs(error)<1.0d-14) exit
00102
00103
00104
00105
00106
00107 end do
00108 else
00109 call calc_omega_drot_bisection(vphiy,alphw,psiw,bvydw,hyydw,omega)
00110 end if
00111 end if
00112
00113
00114 Jome = A2DR*omega*((ome/omega)**index_DR - 1.00d0)
00115 if (index_DR.ne.2.0d0) then
00116 Jome_int = A2DR*omega**2*((ome/omega)**index_DR/(2.0d0-index_DR) - 0.5d0) &
00117 & - index_DR*A2DR*ome**2/(4.0d0-2.0d0*index_DR)
00118 else
00119 Jome_int = - A2DR*ome**2*dlog(ome/omega) + 0.5d0*A2DR*(ome**2-omega**2)
00120 end if
00121
00122 end subroutine calc_omega_drot