00001 subroutine adjust_charge(flag_st)
00002 use def_quantities, only : charge, charge_asymp
00003 use integrability_fnc_MHD, only : MHDpar_charge
00004 implicit none
00005 integer :: flag_st, ii
00006 integer, save :: count_st
00007 real(8), save :: x_st(0:2), f_st(0:1)
00008 real(8) :: delta, dfdx, error_st
00009 real(8) :: charge_hope = 0.0d0, small = 1.0d-10
00010 real(8) :: facp(5) = (/ 1.0d-1, 2.0d-1, 4.0d-1, 7.0d-1, 1.0d-0 /)
00011
00012
00013
00014 call calc_charge_MHD
00015
00016
00017 if (flag_st.ne.0) then
00018 x_st(0) = x_st(1)
00019 f_st(0) = f_st(1)
00020 end if
00021
00022 error_st = charge - charge_hope
00023 write(6,'(1a24,2(7x,i5))') ' -- charge flag # -- ',flag_st
00024 write(6,'(1a24,1p,2e12.4)')' -- charge and param -- ',charge,MHDpar_charge
00025
00026 if (dabs(error_st).gt.small) then
00027 x_st(1) = MHDpar_charge
00028 f_st(1) = error_st
00029 else
00030 write(6,*) ' -- charge converged --'
00031 return
00032 end if
00033
00034 if (flag_st.eq.0) then
00035 count_st = 1
00036 delta = MHDpar_charge
00037 if (delta.eq.0.0d0) delta = 0.1d0
00038 else
00039 count_st = count_st + 1
00040 dfdx = (f_st(1) - f_st(0))/(x_st(1) - x_st(0))
00041 delta = - f_st(1)/dfdx
00042 flag_st = +1
00043 if (delta.lt.0.0d0) flag_st = -1
00044 end if
00045
00046 ii = min0(5,count_st)
00047 x_st(2) = x_st(1) + delta*facp(ii)
00048 MHDpar_charge = x_st(2)
00049
00050 if (flag_st.eq.0) flag_st = +1
00051
00052 write(6,'(1a6,1p,3e12.4)')'charge', x_st(0),x_st(1),x_st(2)
00053 write(6,'(1a6,1p,3e12.4)')'charge', f_st(0),f_st(1)
00054 write(6,'(1a6,1p,3e12.4)')'charge', delta, dfdx
00055
00056
00057
00058 return
00059 end subroutine adjust_charge