00001 subroutine adjust_multi_parameter_trpPunc_mpt(flag_param,istep_niq)
00002 use phys_constant, only : long
00003 use grid_parameter, only : mass_eps, eps
00004 use interface_minv
00005 use interface_adjust_copy_trpPunc_from_mpt
00006 use interface_adjust_copy_trpPunc_to_mpt
00007 use interface_adjust_calc_fncval_Virial_Py_Mratio_mpt
00008 use interface_error_adjust_parameter
00009 implicit none
00010 integer, parameter :: niq = 3
00011 integer :: flag_param, istep_niq
00012 integer :: ii, i, j, k
00013 integer, save :: count_adj
00014 real(long) :: fac0, error_param
00015 real(long), save :: msec_x_oold(niq), msec_x_old(niq)
00016 real(long), save :: msec_f_oold(niq), msec_f_old(niq)
00017 real(long), save :: msec_dx(niq), msec_x_der(niq), msec_f_der(niq)
00018 real(long), save :: msec_ff(niq,niq)
00019 real(long) :: jacobian_at_x_old(niq+1,niq+1), rhs_at_x_old(niq)
00020 real(long) :: facp(5) = (/ 1.0d-1, 2.0d-1, 4.0d-1, 7.0d-1, 1.0d-0 /)
00021
00022 if (istep_niq.eq.-1) then
00023 call adjust_copy_trpPunc_from_mpt(niq,msec_x_oold)
00024 call adjust_calc_fncval_Virial_Py_Mratio_mpt(niq,msec_f_oold)
00025 msec_x_old(1:niq) = msec_x_oold(1:niq) + 0.05*msec_x_oold(1:niq)
00026 call adjust_copy_trpPunc_to_mpt(niq,msec_x_old)
00027 istep_niq = istep_niq + 1
00028 flag_param = 1
00029 count_adj = 0
00030 return
00031 end if
00032
00033 write(6,*)'istep_niq', istep_niq
00034 write(6,'(a5,1p,3e14.6)')'xoold', (msec_x_oold(ii),ii=1,niq)
00035 write(6,'(a5,1p,3e14.6)')'x_old', (msec_x_old(ii),ii=1,niq)
00036 write(6,'(a5,1p,3e14.6)')'f_old', (msec_f_old(ii),ii=1,niq)
00037 write(6,'(a5,1p,3e14.6)')'x_der', (msec_x_der(ii),ii=1,niq)
00038 write(6,'(a5,1p,3e14.6)')'f_der', (msec_f_der(ii),ii=1,niq)
00039
00040 if (istep_niq.eq.0) then
00041 call adjust_calc_fncval_Virial_Py_Mratio_mpt(niq,msec_f_old)
00042 end if
00043 if (istep_niq.ge.1) then
00044 ii = istep_niq
00045 call adjust_calc_fncval_Virial_Py_Mratio_mpt(niq,msec_f_der)
00046 msec_dx(ii) = msec_x_oold(ii) - msec_x_old(ii)
00047 msec_ff(1:niq,ii) = msec_f_der(1:niq)
00048 end if
00049
00050
00051 if (istep_niq.ge.0.and.istep_niq.lt.niq) then
00052 ii = istep_niq + 1
00053 msec_x_der(1:niq) = msec_x_old(1:niq)
00054 msec_x_der(ii) = msec_x_oold(ii)
00055 call adjust_copy_trpPunc_to_mpt(niq,msec_x_der)
00056 istep_niq = istep_niq + 1
00057 flag_param = 1
00058 return
00059 end if
00060
00061
00062 do i = 1, niq
00063 do j = 1, niq
00064 jacobian_at_x_old(i,j) = (msec_ff(i,j) - msec_f_old(i))/msec_dx(j)
00065 end do
00066 end do
00067
00068 do j = 1, niq
00069 rhs_at_x_old(j) = 0.0d0
00070 do k = 1, niq
00071 rhs_at_x_old(j) = rhs_at_x_old(j) + jacobian_at_x_old(j,k)*msec_x_old(k)
00072 end do
00073 rhs_at_x_old(j) = rhs_at_x_old(j) - msec_f_old(j)
00074 end do
00075
00076 call minv(jacobian_at_x_old, rhs_at_x_old, niq, niq+1)
00077
00078
00079 count_adj = count_adj + 1
00080 ii = min0(5,count_adj)
00081 fac0 = facp(ii)
00082 msec_x_oold(1:niq) = msec_x_old(1:niq)
00083 msec_x_old( 1:niq) = fac0*rhs_at_x_old(1:niq)+(1.0d0-fac0)*msec_x_oold(1:niq)
00084 call adjust_copy_trpPunc_to_mpt(niq,msec_x_old)
00085 istep_niq = 0
00086
00087 call error_adjust_parameter(niq,msec_x_old,msec_x_oold, &
00088 & error_param,flag_param)
00089
00090 write(6,'(1a30,2(7x,i5))') ' -- parameter iteration # -- ',count_adj
00091 do ii = 1, niq
00092 write(6,'(1a20,1p,2e12.4)')' -- OLD -> NEW -- ', &
00093 & msec_x_oold(ii), msec_x_old(ii)
00094 end do
00095
00096
00097
00098
00099 end subroutine adjust_multi_parameter_trpPunc_mpt