00001 subroutine adjust_A2DR(flag_st,istep_st)
00002 use grid_parameter, only : nrf, ntfeq, npfxzp, eps
00003 use def_matter, only : omef
00004 use def_matter_parameter, only : ome, A2DR, DRAT_A2DR
00005 implicit none
00006 integer :: flag_st, ii, istep_st
00007 integer, save :: count_st
00008 real(8), save :: x_st(0:2), f_st(0:1)
00009 real(8) :: delta, dfdx, error_st, diff_st
00010 real(8) :: DRAT_adjust, DRAT_hope, small = 1.0d-8
00011 real(8) :: facp(5) = (/ 1.0d-1, 2.0d-1, 4.0d-1, 7.0d-1, 1.0d-0 /)
00012 character(len=6) :: charge_type
00013
00014
00015
00016 DRAT_adjust = omef(nrf,ntfeq,npfxzp)/ome
00017 DRAT_hope = DRAT_A2DR
00018
00019 if (flag_st.ne.0) then
00020 x_st(0) = x_st(1)
00021 f_st(0) = f_st(1)
00022 end if
00023
00024 diff_st = DRAT_adjust - DRAT_hope
00025 error_st = dabs(diff_st/DRAT_hope)
00026 write(6,'(1a20,2(7x,i5))') '-- DRAT flag # -- ',flag_st
00027 write(6,'(1a20,1p,2e12.4)')'-- DRAT and A2DR -- ',DRAT_adjust, A2DR
00028
00029 if (error_st.gt.eps) then
00030 x_st(1) = A2DR
00031 f_st(1) = diff_st
00032 else
00033 write(6,'(1a24)') ' -- A2DR converged -- '
00034 flag_st = 0
00035 return
00036 end if
00037
00038 if (istep_st.eq.-1) then
00039 istep_st = 0
00040 count_st = 1
00041 delta = 0.1*A2DR
00042 if (delta.eq.0.0d0) delta = 0.1d0
00043 else
00044 count_st = count_st + 1
00045 dfdx = (f_st(1) - f_st(0))/(x_st(1) - x_st(0))
00046 delta = - f_st(1)/dfdx
00047 end if
00048
00049 ii = min0(5,count_st)
00050 x_st(2) = x_st(1) + delta*facp(ii)
00051 A2DR = x_st(2)
00052
00053 flag_st = +1
00054
00055 write(6,'(1a6,1p,3e12.4)')'A2DR', x_st(0),x_st(1),x_st(2)
00056 write(6,'(1a6,1p,3e12.4)')'A2DR', f_st(0),f_st(1)
00057 write(6,'(1a6,1p,3e12.4)')'A2DR', delta, dfdx
00058
00059 return
00060 end subroutine adjust_A2DR