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