00001 subroutine adjust_charge(flag_st,charge_type)
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_adjust, 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 character(len=6) :: charge_type
00012
00013
00014
00015 if (charge_type.eq.'asympt') then
00016 call calc_charge_asympto('ns')
00017 charge_adjust = charge_asymp
00018 else if (charge_type.eq.'volume') then
00019 call calc_charge_MHD
00020 charge_adjust = charge
00021 else
00022 write(6,*) 'charge type wrong'
00023 stop
00024 end if
00025
00026 if (flag_st.ne.0) then
00027 x_st(0) = x_st(1)
00028 f_st(0) = f_st(1)
00029 end if
00030
00031 error_st = charge_adjust - charge_hope
00032 write(6,'(1a24,2(7x,i5))') ' -- charge flag # -- ',flag_st
00033 write(6,'(1a24,1p,2e12.4)')' -- charge and param -- ',charge_adjust, &
00034 & MHDpar_charge
00035
00036 if (dabs(error_st).gt.small) then
00037 x_st(1) = MHDpar_charge
00038 f_st(1) = error_st
00039 else
00040 write(6,'(1a24)') ' -- charge converged -- '
00041 return
00042 end if
00043
00044 if (flag_st.eq.0) then
00045 count_st = 1
00046 delta = MHDpar_charge
00047 if (delta.eq.0.0d0) delta = 0.1d0
00048 else
00049 count_st = count_st + 1
00050 dfdx = (f_st(1) - f_st(0))/(x_st(1) - x_st(0))
00051 delta = - f_st(1)/dfdx
00052 flag_st = +1
00053 if (delta.lt.0.0d0) flag_st = -1
00054 end if
00055
00056 ii = min0(5,count_st)
00057 x_st(2) = x_st(1) + delta*facp(ii)
00058 MHDpar_charge = x_st(2)
00059
00060 if (flag_st.eq.0) flag_st = +1
00061
00062 write(6,'(1a6,1p,3e12.4)')'charge', x_st(0),x_st(1),x_st(2)
00063 write(6,'(1a6,1p,3e12.4)')'charge', f_st(0),f_st(1)
00064 write(6,'(1a6,1p,3e12.4)')'charge', delta, dfdx
00065
00066
00067
00068 return
00069 end subroutine adjust_charge