00001 subroutine adjust_rest_mass_qeos(flag_restmass,count_adj)
00002 use grid_parameter, only : mass_eps
00003 use def_matter_parameter, only : rhoc_qs
00004 use def_quantities
00005 implicit none
00006 integer :: flag_restmass
00007 integer :: count_adj, ii
00008 real(8), save :: hi, hi_fac, par_val, fnc_val, sgg, gg,
00009 epsmax_fnc, epsmax_par, fac0
00010 real(8), save :: fixeddlm, fixedvir
00011 real(8), save :: facp(5) = (/ 1.0d-1, 2.0d-1, 4.0d-1, 7.0d-1, 1.0d-0 /)
00012
00013
00014
00015
00016
00017 fixeddlm = (restmass - restmass_sph)/restmass_sph
00018 fixedvir = (admmass - komarmass)/admmass
00019 epsmax_fnc = dabs(fixeddlm)
00020
00021 if(flag_restmass.eq.0) then
00022 epsmax_par = 1.0d0
00023 if (count_adj.ne.0) epsmax_par = dabs((rhoc_qs - par_val)/rhoc_qs)
00024 par_val = rhoc_qs
00025 fnc_val = restmass
00026
00027 hi_fac = - dmin1(1.0d-02,10.0d0**dble(int(dlog10(epsmax_par))-1))
00028
00029
00030 hi = hi_fac*dabs(par_val)
00031 rhoc_qs = par_val + hi
00032
00033 flag_restmass = 1
00034 return
00035 end if
00036 if(flag_restmass.ge.1) then
00037 count_adj = count_adj + 1
00038
00039
00040
00041 sgg= - (restmass - restmass_sph)
00042 gg = (restmass - fnc_val)/hi
00043 ii = min0(5,count_adj)
00044 fac0 = facp(ii)
00045 fac0 = 1.0d0
00046
00047 rhoc_qs = rhoc_qs + sgg/gg*fac0
00048 epsmax_fnc = dmax1(epsmax_fnc,dabs(par_val - rhoc_qs)/dabs(par_val))
00049 if (epsmax_fnc.le.mass_eps) then
00050 flag_restmass = 2
00051 else
00052 flag_restmass = 0
00053 end if
00054
00055 write(6,'(1a30,2(7x,i5))') ' -- Rest mass iteration # -- ',count_adj, ii
00056 write(6,'(1a30,1p,2e12.4)')' -- rhoc OLD -> NEW -- ',par_val,rhoc_qs
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 return
00068 end if
00069 end subroutine adjust_rest_mass_qeos