00001 subroutine adjust_rest_mass(flag_restmass,count_adj)
00002 use grid_parameter, only : mass_eps
00003 use def_matter_parameter, only : emdc
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((emdc - par_val)/emdc)
00024 par_val = emdc
00025 fnc_val = restmass
00026
00027 hi_fac = dmin1(1.0d-02,10.0d0**dble(int(dlog10(epsmax_par))-1))
00028
00029 hi = hi_fac*dabs(par_val)
00030 emdc = par_val + hi
00031 flag_restmass = 1
00032 return
00033 end if
00034 if(flag_restmass.ge.1) then
00035 count_adj = count_adj + 1
00036
00037
00038
00039 sgg= - (restmass - restmass_sph)
00040 gg = (restmass - fnc_val)/hi
00041 ii = min0(5,count_adj)
00042 fac0 = facp(ii)
00043 fac0 = 1.0d0
00044
00045 emdc = emdc + sgg/gg*fac0
00046 epsmax_fnc = dmax1(epsmax_fnc,dabs(par_val - emdc)/dabs(par_val))
00047 if (epsmax_fnc.le.mass_eps) then
00048 flag_restmass = 2
00049 else
00050 flag_restmass = 0
00051 end if
00052
00053 write(6,'(1a30,2(7x,i5))') ' -- Rest mass iteration # -- ',count_adj, ii
00054 write(6,'(1a30,1p,2e12.4)')' -- emdc OLD -> NEW -- ',par_val,emdc
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 return
00066 end if
00067 end subroutine adjust_rest_mass